Docker网络与容器互联
Posted 水月情缘雪飞飞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker网络与容器互联相关的知识,希望对你有一定的参考价值。
@[TOC] # Docker网络与容器互联
资源推荐
Docker官网 配置网络: https://docs.docker.com/network/
Docker网络详解: https://blog.csdn.net/meltsnow/article/details/94490994
Docker四种网络模式: https://www.jianshu.com/p/22a7032bb7bd
使用网络
桥接网络示意图
当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
容器互联
docker network
连接容器
# 创建网络
docker network create -d bridge my-net
# 列出所有网络
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
2b2da88f6307 bridge bridge local
c426cb16f1ba host host local
b63cf9acb121 my-net bridge local
642abd8a74a7 none null local
# 下载centos镜像
docker pull centos
# 新的终端
docker run -it --rm --name centos01 --network my-net centos bash
# 新的终端
docker run -it --rm --name centos02 --network my-net centos bash
# 容器列表
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
296a215ab471 centos "bash" 18 seconds ago Up 16 seconds centos02
4f546527fae1 centos "bash" 42 seconds ago Up 38 seconds centos01
# 在 centos01 容器中 ping centos02
[root@4f546527fae1 /]# ping centos02
PING centos02 (172.18.0.3) 56(84) bytes of data.
64 bytes from centos02.my-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from centos02.my-net (172.18.0.3): icmp_seq=2 ttl=64 time=0.044 ms
# 在 centos02 容器中 ping centos01
[root@296a215ab471 /]# ping centos01
PING centos01 (172.18.0.2) 56(84) bytes of data.
64 bytes from centos01.my-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.180 ms
64 bytes from centos01.my-net (172.18.0.2): icmp_seq=2 ttl=64 time=0.053 ms
# 查看hosts
[root@296a215ab471 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.3 296a215ab471
配置 DNS
- mount 看到挂载信息
$ mount
C:/Program Files/Git on / type ntfs (binary,noacl,auto)
C:/Program Files/Git/usr/bin on /bin type ntfs (binary,noacl,auto)
C:/Users/水月情~1/AppData/Local/Temp on /tmp type ntfs (binary,noacl,posix=0,usertemp)
C: on /c type ntfs (binary,noacl,posix=0,user,noumount,auto)
D: on /d type ntfs (binary,noacl,posix=0,user,noumount,auto)
E: on /e type ntfs (binary,noacl,posix=0,user,noumount,auto)
- 配置全部容器的dns
/etc/docker/daemon.json
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
# 在容器内部 /etc/resolv.conf 可以看到dns
$ docker run -it --rm centos cat etc/resolv.conf
# DNS requests are forwarded to the host. DHCP DNS options are ignored.
nameserver 192.168.65.5
- 手动指定容器配置
- -h HOSTNAME 或者 --hostname=HOSTNAME 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。但它在容器外部看不到,既不会在 docker container ls 中显示,也不会在其他的容器的 /etc/hosts 看到。
- –dns=IP_ADDRESS 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
- –dns-search=DOMAIN 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。
docker run --lisk (已废弃,建议使用network)
就很可能还在用默认桥接网络,这很不安全,所有容器都没有适度隔离,用自定义网络才比较方便互联隔离。
# 下载镜像
docker pull centos
# centos 使用 ip add 查看本地地址信息
# 建立第一个容器 (终端1)
docker run -it --rm --name centos01 centos bash
# 建立第二个容器(终端2)
docker run -d -it --rm --name centos02 --link centos01 centos bash
# 进入容器1
docker exec -it centos01 bash
[root@941828a74821 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 941828a74821
[root@941828a74821 /]# ping 172.17.0.4
PING 172.17.0.4 (172.17.0.4) 56(84) bytes of data.
64 bytes from 172.17.0.4: icmp_seq=1 ttl=64 time=0.059 ms
64 bytes from 172.17.0.4: icmp_seq=2 ttl=64 time=0.039 ms
# 进入容器2
docker exec -it centos02 bash
[root@af7440908cb3 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 centos01 941828a74821
172.17.0.4 af7440908cb3
[root@af7440908cb3 /]# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.066 ms
以上是关于Docker网络与容器互联的主要内容,如果未能解决你的问题,请参考以下文章