史上最全的Docker详解(四)之——Docker 端口映射及相关网络配置
1. 查找容器IP地址2. Docker解决的问题3. 自动映射端口4. 绑定端口到指定接口4.1 绑定TCP端口4.2 绑定UDP端口 5. Docker网络配置5.1 Docker四种网络模式5.2 Docker的默认桥接网络5.3 查看当前主机网桥5.4 查看当前docker0的IP地址5.5 自定义桥接网络 6. 跨主机容器通信6.1 安装相应依赖软件6.2 桥接网络在 Ubuntu 上的配置:在 CentOS/RHEL 7 上的配置: 6.3 使用 pipework 进行容器通信 总结
在Docker中,要理解容器的网络配置以及如何进行端口映射,我们可以从以下几个方面进行详细说明。
1. 查找容器IP地址
通过容器ID来获取容器的IP地址是常见的需求,可以使用以下命令:
$ sudo docker inspect <container_id> | grep IPAddress | cut -d '"' -f 4
需要注意的是,这些IP地址是基于本地系统的,并且容器的端口默认无法从外部主机访问。此外,容器每次启动时这些IP地址都会更改。
2. Docker解决的问题
Docker解决了容器的这两个问题,同时提供了一种简单可靠的方法,允许外部客户端访问容器内运行的服务。Docker通过将主机系统接口上的端口绑定到容器内部,实现了这一点。为了简化容器之间的通信,Docker提供了不同的网络连接机制。
3. 自动映射端口
Docker提供了自动映射容器端口的功能,可以使用以下命令:
$ sudo docker run -t -P --expose 22 --name server ubuntu:14.04
使用docker run -P
可以自动绑定容器内部所有需要对外提供服务的端口,映射的端口会从未使用的端口池中自动选择。具体的映射信息可以通过docker ps
、docker inspect <container_id>
或docker port <container_id> <port>
来确定。
4. 绑定端口到指定接口
Docker允许你将容器端口绑定到指定的接口,并提供了不同的语法选项:
4.1 绑定TCP端口
# 将容器的TCP端口8080绑定到主机的TCP端口80上$ sudo docker run -p 127.0.0.1:80:8080 <image> <cmd># 将容器的TCP端口8080绑定到主机上的一个动态分配的TCP端口上$ sudo docker run -p 127.0.0.1::8080 <image> <cmd># 将容器的TCP端口8080绑定到主机的所有可用网络接口上的TCP端口80$ sudo docker run -p 80:8080 <image> <cmd># 将容器的TCP端口8080绑定到主机的所有可用网络接口上的动态分配的TCP端口上$ sudo docker run -p 8080 <image> <cmd>
4.2 绑定UDP端口
# 将容器的UDP端口5353绑定到主机的UDP端口53上$ sudo docker run -p 127.0.0.1:53:5353/udp <image> <cmd>
5. Docker网络配置
Docker使用Linux桥接来实现容器之间的通信,docker0桥接接口的创建和配置是Docker守护进程启动时执行的操作。以下是Docker网络配置的一些关键概念和命令。
5.1 Docker四种网络模式
Docker提供了四种网络模式:
host模式: 使用--net=host
指定,容器与宿主机共享网络命名空间,使用宿主机的IP和端口。container模式: 使用--net=container:NAMEorID
指定,容器与另一个容器共享网络命名空间,它们可以通过lo设备进行通信。none模式: 使用--net=none
指定,容器有自己的网络命名空间,但不进行任何网络配置,需要手动添加网卡和配置IP等。bridge模式: 使用--net=bridge
指定,默认设置,为容器分配独立的网络命名空间和IP。 5.2 Docker的默认桥接网络
Docker的默认网络模式是bridge模式,它创建docker0虚拟网桥,并将容器连接到该虚拟网桥上。docker0的IP地址会被分配给容器的默认网关。
5.3 查看当前主机网桥
可以使用以下命令查看当前主机上的网桥信息:
$ sudo brctl show
5.4 查看当前docker0的IP地址
可以使用以下命令查看当前docker0虚拟网桥的IP地址:
$ sudo ifconfig docker0
5.5 自定义桥接网络
如果需要自定义桥接网络,可以按照以下步骤进行:
停止Docker守护进程。创建自定义的网桥。为网桥分配特定的IP地址。使用-b
选项重新启动Docker,指定使用自定义网桥。 具体操作如下:
$ sudo service docker stop$ sudo ip link set dev docker0 down$ sudo brctl delbr docker0# 创建自定义网桥$ sudo brctl addbr bridge0$ sudo ip addr add 192.168.5.1/24 dev bridge0$ sudo ip link set dev bridge0 up# 将Docker配置为使用自定义网桥(具体命令可能因系统而异)$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker$ sudo service docker start
6. 跨主机容器通信
不同主机上的容器之间通信可以借助pipework工具。以下是一些相关步骤:
安装pipework以及相关依赖软件。配置桥接网络。使用pipework为容器创建虚拟网卡并将其桥接到自定义的网桥上。配置其他主机上的容器以实现跨主机通信。以下是相关操作实例命令:
不同容器之间的通信可以借助于 pipework 这个工具。首先,需要安装 pipework 并满足相关依赖。
# 在主机上安装 pipework$ git clone https://github.com/jpetazzo/pipework.git$ sudo cp -rp pipework/pipework /usr/local/bin/
6.1 安装相应依赖软件
# 安装必要的依赖软件# For Ubuntu/Debian$ sudo apt-get install iputils-arping bridge-utils -y# For CentOS/RHEL$ sudo yum install iputils bridge-utils -y
6.2 桥接网络
桥接网络配置可以参考一下网上关于桥接的配置说明,这里不再赘述,有机会龙哥写一篇相关内容。
# 查看当前主机上的桥接网络$ brctl showbridge name bridge id STP enabled interfacesbr0 8000.000c291412cd no eth0docker0 8000.56847afe9799 no vetheb48029
您可以删除 docker0,直接将 Docker 的桥接指定为 br0。或者保留默认配置,让单主机容器之间的通信使用 docker0,而跨主机不同容器之间通过 pipework 创建的 Docker 容器的网卡桥接到 br0,从而实现跨主机容器通信。
在 Ubuntu 上的配置:
# 停止 Docker 服务$ sudo service docker stop# 关闭 docker0 网桥$ sudo ip link set dev docker0 down# 删除 docker0 网桥$ sudo brctl delbr docker0# 配置 Docker 使用 br0 网桥$ echo 'DOCKER_OPTS="-b=br0"' | sudo tee -a /etc/default/docker# 重新启动 Docker 服务$ sudo service docker start
在 CentOS/RHEL 7 上的配置:
# 停止 Docker 服务$ sudo systemctl stop docker# 关闭 docker0 网桥$ sudo ip link set dev docker0 down# 删除 docker0 网桥$ sudo brctl delbr docker0# 配置 Docker 使用 br0 网桥$ sudo sed -i 's/OPTIONS=/OPTIONS="--bridge=br0 --selinux-enabled"/' /etc/sysconfig/docker# 重新启动 Docker 服务$ sudo systemctl start docker
6.3 使用 pipework 进行容器通信
不同容器之间的通信可以通过 pipework 工具来实现,该工具会创建虚拟网卡并将其桥接到 br0 网桥上。
# 示例:使用 pipework 桥接容器到 br0$ sudo docker run --rm -ti --net=none ubuntu:14.04 /bin/bashroot@a46657528059:/#$ # 使用 Ctrl-P + Ctrl-Q 返回到宿主机 shell,容器保持在后台运行状态$ sudo docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa46657528059 ubuntu:14.04 "/bin/bash" 4 minutes ago Up 4 minutes hungry_lalande# 使用 pipework 进行桥接$ sudo pipework br0 -i eth0 a46657528059 192.168.115.10/24@192.168.115.2# 如果不指定网卡设备名,将默认添加为 eth1
此时,容器已经被成功桥接到 br0,并分配了 IP 地址。
$ sudo docker exec -it a46657528059 ifconfig eth0eth0 Link encap:Ethernet HWaddr 86:b6:6b:e8:2e:4d inet addr:192.168.115.10 Bcast:0.0.0.0 Mask:255.255.255.0 inet6 addr: fe80::84b6:6bff:fee8:2e4d/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:648 (648.0 B) TX bytes:690 (690.0 B)$ sudo docker exec -it a46657528059 route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 192.168.115.2 0.0.0.0 UG 0 0 0 eth0192.168.115.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
如果需要添加静态路由,可以使用 ip netns
命令在容器内手动添加。另外, pipework 也支持创建容器的 VLAN 网络,详情请参考官方文档。
这些步骤可用于配置不同主机上的容器以实现跨主机容器通信。确保在其他主机上执行相应的配置,并创建容器并使用 pipework 进行桥接以测试通信情况。
总结
最后,pipework还支持创建容器的VLAN网络,详细操作可参考pipework的官方文档。
今天龙哥写的这篇内容提供了Docker端口映射和网络配置的详细说明,可以帮助Docker用户更好地理解和配置容器网络。
本篇为史上最全的Docker详解(四)之——Docker 端口映射及相关网络配置篇,如需了解其他Docker内容,关注一下翻看一下我其他章节。