docker 网络介绍

时间:2022-07-22
本文章向大家介绍docker 网络介绍,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

docker允许通过外部访问容器或容器互联的方式来提供网络服务。

外部访问容器

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P-p参数来指定端口映射。

当使用-P参数时

1 2 3 4 5

docker run -d -P training/webapp python app.py 查看 [root@xs_test01 wwwlogs]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a6068ede204d training/webapp "python app.py" 21 seconds ago Up 19 seconds 0.0.0.0:32768->5000/tcp festive_agnesi

通过docker logs -f NAMES来查看

1 2

[root@xs_test01 wwwlogs]# docker logs -f festive_agnesi * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

使用-p时,需要单独指定地址,且在一个端口上只能绑定一个容器,否则会报错

1 2 3 4 5 6 7 8

docker run -d -p 1111:11 training/webapp python app.py #这个是将本地的1111端口映射到容器的11端口 docker run -d -p 127.0.0.1:1112:12 training/webapp python app.py #映射到指定地址的指定端口 docker run -d -p 127.0.0.1::5000 training/webapp python app.py #映射到指定地址的任意端口 docker run -d -p 127.0.0.1::5000/udp training/webapp python app.py #使用udp来标记udp端口 docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py #绑定多个端口 [root@xs_test01 wwwlogs]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 51c9ba211f9c training/webapp "python app.py" 9 seconds ago Up 8 seconds 0.0.0.0:5000->5000/tcp, 0.0.0.0:3000->80/tcp musing_albattani

查看端口映射

使用ddocker port NAMES PORT来查看

1 2

[root@xs_test01 wwwlogs]# docker port compassionate_ptolemy 5000 127.0.0.1:32769

容器互联

新建网络

1 2

[root@xs_test01 wwwlogs]# docker network create -d bridge my-net a1822b830e76d490f27fcdf5ac0b93595c9de4726a801b703d6ed06db5b78c59

新建容器并连接刚创建的网络

1 2 3 4 5 6

[root@xs_test01 wwwlogs]# docker run -it --rm --name busybox1 --network my-net busybox sh Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox d070b8ef96fc: Pull complete Digest: sha256:2107a35b58593c58ec5f4e8f2c4a70d195321078aebfadfbfb223a2ff4a4ed21 Status: Downloaded newer image for busybox:latest

打开另一个终端再新建一个容器并加入到刚创建的网络

1 2

[root@xs_test01 ~]# docker run -it --rm --name busybox2 --network my-net busybox sh / #

在第一个终端中测试连通性

1 2 3 4

/ # ping busybox2 PING busybox2 (172.18.0.3): 56 data bytes 64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.441 ms 64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.202 ms

同样在第二个终端中测试

1 2 3 4

/ # ping busybox1 PING busybox1 (172.18.0.2): 56 data bytes 64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.338 ms 64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.188 ms

如果有多个容器要互联,可以使用docker compose

配置DNS

如何自定义配置容器的主机名和DNS?

在容器中使用mount来查看挂载信息:

1 2 3 4

mount /dev/mapper/centos-root on /etc/resolv.conf type xfs (rw,relatime,attr2,inode64,noquota) /dev/mapper/centos-root on /etc/hostname type xfs (rw,relatime,attr2,inode64,noquota) /dev/mapper/centos-root on /etc/hosts type xfs (rw,relatime,attr2,inode64,noquota)

如果退出容器可以使用docker exec来进入

1

docker exec -it busybox1 sh

修改/etc/docker/daemon.json

1 2 3 4

[root@xs_test01 docker]# cat daemon.json { "dns": ["114.114.114.114","8.8.8.8"] }

修改完成后一定后重启docker

1

systemctl restart docker

启动一个容器查看dns是否生效

1 2 3

[root@xs_test01 docker]# docker run -it --rm ubuntu:17.10 cat etc/resolv.conf nameserver 114.114.114.114 nameserver 8.8.8.8

这种修改方式,所有的容器都会生效,当然也可以手动对单个容器做修改。

1 2 3

[root@xs_test01 docker]# docker run -it --rm --name web_server -h webserver --dns=8.8.8.8 centos /bin/bash [root@webserver /]# cat /etc/resolv.conf nameserver 8.8.8.8

-h HOSTNAME--hostname=HOSTNAME设定容器的主机名,会被写到容器的/etc/hostname和/etc/hosts

--dns=IP添加dns服务器到容器的/etc/resolv.conf

高级网络配置

当docker启动时,会自动在主机上创建一个docker0虚拟网桥,实际上是linux的一个bridge,可以理解为一个软件交换机,它会在挂载到它的网口之间进行转发,同时docker随机分配一个本地未占用的私有网段中的一个地址给docker0接口,然后我们在启动容器的时候也会自动分配一个同一网段的地址。

当我们创建了一个容器的时候,同时也会创建一个veth pair接口,当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包,这两个接口一个是在容器中被绑定,名字为eth0,另一个在被挂载到docker0网桥上,以veth开头,这就是容器和主机之间进行通讯的原理。

手动起一个容器看下主机网卡变化:

1 2

# docker start musing_albattani musing_albattani

ifconfig查看

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

# ifconfig veth637e217: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::b827:18ff:fe04:b918 prefixlen 64 scopeid 0x20<link> ether ba:27:18:04:b9:18 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:66ff:fec3:a078 prefixlen 64 scopeid 0x20<link> ether 02:42:66:c3:a0:78 txqueuelen 0 (Ethernet) RX packets 3511 bytes 199800 (195.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4628 bytes 73413939 (70.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

看到docker0网桥和在启动容器后起的网卡名是以veth开头的网卡被挂载到了docker0上,也可以验证容器在启动时会自动分配一个同一网段的地址。