Docker容器連線
阿新 • • 發佈:2020-12-30
宿主機與容器之間的連線
通過埠對映
埠隨機對映
-P是隨機對映,宿主機隨機找個埠,對映到容器內的應用所用埠
[root@izbp1eednvvtf33syjd02az ~]# docker run -d -P training/webapp python app.py e3591186b877af5b494786077fca54dd51bc3fb19146cd9923561130be2a8e24 [root@izbp1eednvvtf33syjd02az ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e3591186b877 training/webapp "python app.py" 17 seconds ago Up 16 seconds 0.0.0.0:49154->5000/tcp great_vaughan [root@izbp1eednvvtf33syjd02az ~]#
埠固定對映
-p是固定對映,你指定一個宿主機埠,對映到容器內的應用所用埠
[root@izbp1eednvvtf33syjd02az ~]# docker run -d -p 5000:5000 training/webapp python app.py b75859e130049090da652096c8685fc79cc36f50282d7216ede4bcaf81091410[root@izbp1eednvvtf33syjd02az ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b75859e13004 training/webapp "python app.py" 20 seconds ago Up 18 seconds 0.0.0.0:5000->5000/tcp awesome_yonath e3591186b877 training/webapp "python app.py" 5 minutes ago Up 5 minutes 0.0.0.0:49154->5000/tcp great_vaughan [root@izbp1eednvvtf33syjd02az ~]#
檢視容器端口占用情況
使用docker port
檢視某個容器的埠是與宿主機的哪個埠做了對映
[root@izbp1eednvvtf33syjd02az ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b75859e13004 training/webapp "python app.py" 20 seconds ago Up 18 seconds 0.0.0.0:5000->5000/tcp awesome_yonath e3591186b877 training/webapp "python app.py" 5 minutes ago Up 5 minutes 0.0.0.0:49154->5000/tcp great_vaughan [root@izbp1eednvvtf33syjd02az ~]# docker port awesome_yonath 5000 0.0.0.0:5000 [root@izbp1eednvvtf33syjd02az ~]#
容器與容器之間的互聯
在宿主機上新建一個網路
[root@izbp1eednvvtf33syjd02az ~]# docker network create -d bridge test-net 351484db5520efc332db994fe12efef3c227e33e1aa148f71df2a90d8e9dfe7a [root@izbp1eednvvtf33syjd02az ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 5310f03dc118 bridge bridge local aaba26aafa47 host host local 98c0e9ef1b3f none null local 351484db5520 test-net bridge local [root@izbp1eednvvtf33syjd02az ~]#
docker network create -d bridge test-net
-d | 指定網路型別,是橋接還是什麼 |
將容器們橋接進來
建立2個容器,test1和test2,都橋接到網路test-net中
[root@izbp1eednvvtf33syjd02az ~]# docker run -itd --name test1 --network test-net ubuntu /bin/bash 1e69fc819e9a2d094c62016e4c60484c3568dc025d7d2b02ab7ac09fca455840 [root@izbp1eednvvtf33syjd02az ~]# docker run -itd --name test2 --network test-net ubuntu /bin/bash 267854b3d364cb17e35b88f36ae973a1e23cf29b865d0fc00c25bfe0ef2dd419 [root@izbp1eednvvtf33syjd02az ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 267854b3d364 ubuntu "/bin/bash" 6 seconds ago Up 5 seconds test2 1e69fc819e9a ubuntu "/bin/bash" 15 seconds ago Up 15 seconds test1 [root@izbp1eednvvtf33syjd02az ~]#
然後exec進入2個容器,互相ping測試
[root@izbp1eednvvtf33syjd02az ~]# docker exec -it test1 /bin/bash root@1e69fc819e9a:/# apt-get update ...
... root@1e69fc819e9a:/# apt install iputils-ping...
... root@1e69fc819e9a:/# ping test2 PING test2 (172.19.0.3) 56(84) bytes of data. 64 bytes from test2.test-net (172.19.0.3): icmp_seq=1 ttl=64 time=0.066 ms 64 bytes from test2.test-net (172.19.0.3): icmp_seq=2 ttl=64 time=0.071 ms 64 bytes from test2.test-net (172.19.0.3): icmp_seq=3 ttl=64 time=0.069 ms ^C --- test2 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 0.066/0.068/0.071/0.002 ms root@1e69fc819e9a:/#
[root@izbp1eednvvtf33syjd02az ~]# docker exec -it test1 /bin/bash root@267854b3d364:/# apt-get update ... ... root@267854b3d364:/# apt install iputils-ping ... ... root@267854b3d364:/# ping test1 PING test2 (172.19.0.3) 56(84) bytes of data. 64 bytes from test2.test-net (172.19.0.3): icmp_seq=1 ttl=64 time=0.066 ms 64 bytes from test2.test-net (172.19.0.3): icmp_seq=2 ttl=64 time=0.071 ms 64 bytes from test2.test-net (172.19.0.3): icmp_seq=3 ttl=64 time=0.069 ms ^C --- test2 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 0.066/0.068/0.071/0.002 ms root@267854b3d364:/#
需要先安裝ping工具
- apt-get update
- apt install iputils-ping
ping後面不用接ip地址,直接接容器name
給容器配置DNS解析
預設配置
如果容器沒有統一配置或者單獨配置過DNS, 則它預設使用宿主機的DNS
127.0.0.11就是指宿主機
[root@izbp1eednvvtf33syjd02az ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 267854b3d364 ubuntu "/bin/bash" 2 hours ago Up 2 hours test2 1e69fc819e9a ubuntu "/bin/bash" 2 hours ago Up 2 hours test1 [root@izbp1eednvvtf33syjd02az ~]# docker exec -it test1 /bin/bash root@1e69fc819e9a:/# ping www.baidu.com PING www.a.shifen.com (180.101.49.12) 56(84) bytes of data. 64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=1 ttl=49 time=12.4 ms 64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=2 ttl=49 time=12.4 ms ^C --- www.a.shifen.com ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 12.372/12.373/12.374/0.001 ms root@1e69fc819e9a:/# cat /etc/resolv.conf nameserver 127.0.0.11 options timeout:2 attempts:3 rotate single-request-reopen ndots:0 root@1e69fc819e9a:/#
配置所有容器(統一配置)
新建daemon.json
/etc/docker/目錄下預設沒有daemon.json檔案,需要新建
[root@izbp1eednvvtf33syjd02az ~]# ls /etc/docker/ key.json [root@izbp1eednvvtf33syjd02az ~]# vi /etc/docker/daemon.json [root@izbp1eednvvtf33syjd02az ~]# cat /etc/docker/daemon.json { "dns" : [ "114.114.114.114", "8.8.8.8" ] } [root@izbp1eednvvtf33syjd02az ~]#
重啟宿主機docker服務
會導致所有在執行的容器都停機
[root@izbp1eednvvtf33syjd02az ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 267854b3d364 ubuntu "/bin/bash" 16 hours ago Up 33 seconds test2 1e69fc819e9a ubuntu "/bin/bash" 16 hours ago Up 34 seconds test1 [root@izbp1eednvvtf33syjd02az ~]# systemctl restart docker [root@izbp1eednvvtf33syjd02az ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 267854b3d364 ubuntu "/bin/bash" 16 hours ago Exited (0) 4 seconds ago test2 1e69fc819e9a ubuntu "/bin/bash" 16 hours ago Exited (0) 4 seconds ago test1 [root@izbp1eednvvtf33syjd02az ~]#
驗證
啟動test1,exec進去,發現/etc/resolve.conf並沒有改變
[root@izbp1eednvvtf33syjd02az ~]# docker start test1 test1 [root@izbp1eednvvtf33syjd02az ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 267854b3d364 ubuntu "/bin/bash" 16 hours ago Exited (0) 15 seconds ago test2 1e69fc819e9a ubuntu "/bin/bash" 16 hours ago Up 1 second test1 [root@izbp1eednvvtf33syjd02az ~]# docker exec -it test1 /bin/bash root@1e69fc819e9a:/# cat /etc/resolv.conf nameserver 127.0.0.11 options timeout:2 attempts:3 rotate single-request-reopen ndots:0 root@1e69fc819e9a:/# exit exit [root@izbp1eednvvtf33syjd02az ~]#
run起來一個新的容器test3,exec進去,發現/etc/resolve.conf的內容是對的
[root@izbp1eednvvtf33syjd02az ~]# docker run -it --name=test3 ubuntu /bin/bash root@e813018eb4ec:/# cat /etc/resolv.conf nameserver 114.114.114.114 nameserver 8.8.8.8 options timeout:2 attempts:3 rotate single-request-reopen root@e813018eb4ec:/# exit exit [root@izbp1eednvvtf33syjd02az ~]#
說明統一配置的時候,僅對以後生成的新容器有效,對老容器沒有效果
配置某一個容器(個性化)
run起來的時候,使用--dns指定就好了
[root@izbp1eednvvtf33syjd02az ~]# docker run -it --name=test4 --dns=114.114.114.114 ubuntu /bin/bash root@c483ef2d0ab3:/# cat /etc/resolv.conf nameserver 114.114.114.114 options timeout:2 attempts:3 rotate single-request-reopen root@c483ef2d0ab3:/# exit exit [root@izbp1eednvvtf33syjd02az ~]#
參考
https://www.runoob.com/docker/docker-container-connection.html