1. 程式人生 > 實用技巧 >Docker容器連線

Docker容器連線

宿主機與容器之間的連線

通過埠對映

埠隨機對映

-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