Docker網絡相關

Docker中網絡功能相關

    Docker是允許通過外部訪問容器或者容器互聯的方式來提供網絡服務。

外部訪問容器:

    通過-P或者-p參數指定端口映射,-P是隨機;-p是指定。

-P : Docker會隨機映射一個端口到內部容器開放的網絡端口。

用docker run -d -P training/webapp python app.py 創建啓動一個容器。

然後再用docker container ls -l (或者docker ps)看下

容器內5000被映隨機射到了本地的32768。(看下下面的測試)

刷新幾次上面的網址,然後看下log  (docker logs 1db63003b6b1)

我本地windows電腦的ip是103,虛擬機(宿主機器)ip 104,容器是172.17.0.2 。

-p: 則可以指定要映射的端口,並且,在一個端口上只可以綁定一個容器。支持的格式:

ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

端口一對一映射(所有ip)

docker run -d -p 5000:5000 training/webapp python app.py 

端口一對一映射,指定ip

docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py 


映射到指定地址的任意端口(我的docker是19.03.5版本,下面的這個命令失效,會隨機映射一個端口出來)

docker run -d -p 127.0.0.1::5000 training/webapp python app.py

默認是tcp端口,可以指定udp端口

docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

-p標記可以多次使用來綁定多個端口docker run -d -p 5000:5000 -p 3000:80 training/webapp  python app.py

可以通過docker port xxxx來查看端口映射情況

然後是第二個姿勢容器互聯

之前docker很多都是用--link進行互聯,很多人已經建議不要這麼用了,推薦是把容器加入自定義的Docker網絡來進行互聯操作。

新建Docker網絡:docker network create -d bridge my-net

-d參數指定Docker網絡類型,有bridge和overlay。其中overlay用於Swarm mode。

運行一個容器並連接到新建的my-net網絡



分別打開三個終端,每個終端執行下面中的一條。

docker run -it --rm --name busybox1 --network my-net busybox sh

docker run -it --rm --name busybox2 --network my-net busybox sh

docker container ls

 

講道理現在正在跑着的兩個容易應該是可以互聯的(在一個局域網下),分別在兩個啓動容器的終端裏通過ping來確認彼此互聯

 

也能看到他們兩個的ip,一個是172.18.0.3,另一個是172.18.0.2,有一點要清楚,他們現在都是在上面我們手動創建的那個my-net網絡裏。此時在宿主機上也是能ping通那兩個ip的,但是記得是直接ping ip不是上面兩臺容器的那個操作方式。

可以ifconfig看下此時宿主機的一些信息。

如果是多個容器之間進行互聯,推薦是直接Docker Compose,之後會整理這個相關的筆記。

看到那個docker0了嗎,到這我突然記得,貌似是不創建網絡,直接默認大家是連接到docker0上的。我自己本地測試了一下,也是開啓三個終端,然後分別執行上面那些命令,但是不指定network,然後發現確實是三個終端都彼此可以ping通的。(直接ping ip不是容器名字)

配置DNS

如果想要配置全部容器的DNS,直接在宿主機上  /etc/docker/daemon.json  文件中增加dns這個值

{

    "dns" : [

        "114.114.114.114",

        "8.8.8.8"

    ]

}

就行了。這樣每次啓動容器自動配置爲這兩個。

如果想要手動指定:

--dns=IP_ADDRESS添加 DNS 服務器到容器的  /etc/resolv.conf  中。

如果是改主機名可以用下面這個

-h HOSTNAME  或者  --hostname=HOSTNAME  設定容器的主機名,它會被寫到容器內的  /etc/hostname  和  /etc/hosts

設定容器的搜索域

--dns-search=DOMAIN  設定容器的搜索域,當設定搜索域爲  .example.com時,在搜索一個名爲 host 的主機時,DNS 不僅搜索 host,還會搜索host.example.com

還有一種改容器DNS的方式就是直接用之前說的 文件掛載的方式直接掛載容器的/etc/resolv.conf文件出來。這個不做演示了(這個是我自己想的,感覺應該可行,就算可行,也不建議直接把容器的DNS文件和本地的DNS文件綁定在一起,這樣就會導致容器有修改宿主主機的DNS的權限了)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章