网络设置
DNS设置
–dns=[]:为容器自定义设置dns服务器
网络模式
–network=”bridge”:将容器连接到网络
等于 –net
支持的值
桥接模式
–network bridge
默认值。创建的容器默认会连接到docker的网桥上(即docker0)
,通过docker网桥及iptables nat表配置与宿主机进行通信
禁用网络
–network none
示例:
以下命令启动的容器 宿主机上(包括其他网络上)nginx访问不了
1 | docker run -p 80:80 --rm -d --network none --name nginx1 nginx:1.21 |
容器共享网络连接
–network container:<name|id>
指定新创建的容器与已存在的容器共享网络名称空间(通过名称或id指定)
。新创建的容器不会创建网卡,而是与已存在的容器共享一个网卡、IP等,两个容器之间可以通过lo回环网卡设备进行通信,但是其他命名空间,比如用户、文件系统等还是和容器隔离开的。
注意:在这种网络模式下是不允许再次使用 -p 选项来做端口映射的,所以如果需要的话在创建第一个容器的时候把该映射的端口都做映射
示例:
先运行容器 nginx1
1 | docker run -p 80:80 -p 81:81 --rm -it --name nginx1 nginx:1.21 /bin/bash |
再运行容器 nginx2 指定网络类型为 container并绑定到nginx1上
1 | docker run --rm -it --network container:nginx1 --name nginx2 nginx:1.21 /bin/bash |
以上这个小实验说明了container的网络模式怎么使用和对应的效果
主机模式
–network host
与container模式有些类似,container模式是容器和容器之间共享网络名称空间,host模式下docker不会为容器创建网络名称空间而是与宿主机共用一个网络名称空间,并使用宿主机的网卡、端口等信息,但是其他名称空间,比如用户、文件系统等还是和宿主机隔离开的
我们在宿主机上通过host模式启动一个nginx容器,并监听80端口,此时在容器内部通过ifconfig或ip命令查看网络环境时,所看到的信息和宿主机的信息一致,就好比nginx直接运行在宿主机一样,但是,用户、文件系统等还是和宿主机隔离开的
注意:这种网络模式下也是不可以使用 -p 或者-P 来做端口映射的,因为本身容器用的就是宿主机的网络
示例:
1 | docker run --rm -it --network host --name nginx1 nginx:1.21 /bin/bash |
都说是这么用,但是总感觉不太对,实际的容器网络信息和宿主机的不太一样,不确定是不是因为宿主机是windows的原因
自建网络模式
–network=”
| “
将容器连接到用户(使用docker network create命令)创建的网络上。使用这种方式将多个容器加入到同一个网络上,可以轻松实现容器间的网络通信,在一个容器中使用另一个容器的IP地址或名称进行通信
示例:
查看当前已有的网络
1 | docker network ls |
创建网络(创建网络的更多使用方法会有专门章节进行说明)
1 | docker network create -d bridge my-net |
运行容器时指定容器网络为自建的网络
1 | docker run --rm -it --network my-net --name nginx1 nginx:1.21 /bin/bash |
网络别名
–network-alias:为容器设置网络别名
示例:
先启动一个nginx容器 网络别名 nginx1 容器名称nginx11
1 | docker run --rm -it --network my-net --network-alias nginx1 --name nginx11 nginx:1.21 /bin/bash |
再启动一个centos容器,在此容器内ping nginx1和nginx11 会发现都是通的
1 | docker run -it -p 22:22 --network="my-net" --name=centos1 centos /bin/bash |
添加hosts内容
–add-host 源地址:目标ip
管理/etc/hosts,向/etc/hosts中添加行
注意:
如果一个容器连接到默认的网桥网络并与其他容器链接(容器共享网络连接模式),那么容器的/etc/hosts文件将被更新为链接的容器的名称
由于Docker可能会实时更新容器的/etc/hosts文件,因此可能会出现容器内部进程读取空的或不完整的/etc/hosts文件的情况。一般再次尝试读取应该可以解决这个问题。
示例:
首先从本地拿到百度的网站ip
1 | C:\Users\zhaoduo>ping baidu.com |
启动一个centos容器并向hosts文件内加一个虚拟域名指向到百度的网站ip上
1 | docker run -it --rm --name=centos2 --add-host local.baidu.com:220.181.38.251 centos /bin/bash |
在容器内测试hosts解析正常
1 | [root@2bcb5883b5ae /]# cat /etc/hosts |