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的權限了)。