今天来聊聊 Docker 容器网络方面的几个基础命令。Docker 这个开源项目大家应该不陌生:它提供了一种轻量级的容器化平台,让你可以像搭积木一样打包、装载和运行任何应用——不管是什么语言、什么框架、在什么设备上,从家用电脑到服务器都能跑起来。用 Docker 部署 Web 应用、数据库、后端服务,完全不用依赖某一套技术栈或特定提供商。也正因为这样,它在数据中心、ISP 和各种网络服务里越来越普及。
那么,日常管理 Docker 容器时,有哪些网络相关的命令是必须掌握的?下面直接上干货。
1. 找到 Docker 接口
Docker 默认会创建一个名叫 docker0 的网桥接口,作为容器与外部世界通信的桥梁。每个运行中的容器都会直接挂到这个网桥上。默认情况下,Docker 给 docker0 分配的地址是 172.17.42.1/16,这个网段就是所有容器的子网。要找到 docker0 的 IP 地址很简单,在安装了 Docker 的宿主机终端里跑一行命令就行:
# ip a

2. 获取 Docker 容器的 IP 地址
刚才说了,docker0 是宿主机上的网桥,每创建一个新容器,都会在这个子网范围内自动分配一个 IP。要想查看运行中容器的 IP,需要先进到容器里。如果还没有容器,先启动一个试试:
# docker run -it ubuntu
进到容器后,同样执行 ip a 就能看到它的网络信息了:
# ip a

3. 映射暴露的端口
Dockerfile 里定义好的暴露端口(EXPOSE),用 -P 标志就可以自动映射到宿主机的高位随机端口。这个小技巧在快速测试时非常方便:
# docker run -itd -P httpd

上面的命令会把 httpd 容器内定义的 80 端口映射到宿主机的一个随机端口。想知道具体映射到了哪个端口?用 docker ps 查看:
# docker ps
然后用 curl 验证(假如映射到了 49153):
# curl https://localhost:49153
4. 映射到特定的端口上
如果你想指定宿主机的某个端口映射到容器的某个端口,用 -p 小写标志。比如把宿主机的 8080 映射到容器的 80:
# docker run -itd -p 8080:80 httpd
验证一下:
# curl https://localhost:8080

5. 创建自己的网桥
默认的 docker0 不一定满足所有场景,有时候你需要自己创建一个自定义网桥。下面演示如何创建一个名叫 br0 的网桥,并给它指定一个子网 172.30.1.1/20:
# stop docker.io
# ip link add br0 type bridge
# ip addr add 172.30.1.1/20 dev br0
# ip link set br0 up
# docker -d -b br0

6. 创建自己的网桥(另一种方式)
给容器分配自定义 IP 的另一种做法,也是创建一个叫 br0 的网桥,步骤与上面完全一致。再次列出命令以便参考:
# stop docker.io
# ip link add br0 type bridge
# ip addr add 172.30.1.1/20 dev br0
# ip link set br0 up
# docker -d -b br0

完成后,新创建的容器就会从 br0 子网中获取 IP 地址。
7. 链接到另外一个容器上
Docker 支持将两个容器连接(link)起来,让它们能够安全地传输信息。常用的做法是先用 --name 给一个容器命名,然后用 --link 把另一个容器连上去。看看这个例子:首先启动一个名为 db 的 Postgres 容器:
# docker run -d --name db training/postgres

接着,把 db 链接到一个叫 web 的 Web 容器上:
# docker run -d -P --name web --link db:db training/webapp python app.py

总结
Docker 的网络功能既神奇又有趣,上面这些基础命令只是冰山一角。掌握了它们,你就能在容器网络配置上玩出很多花样。如果还有疑问或者想了解更多,欢迎留言交流。祝玩得开心!
