Docker 容器连接
前面我们实现了通过网络端口来访问运行在 Docker 容器内的服务。容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。
网络端口映射
我们创建一个 Python 应用的容器:
$ docker run -d -P training/webapp python app.py
fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d
使用 docker ps 查看端口映射情况:
$ docker ps
CONTAINER ID IMAGE COMMAND ... PORTS NAMES
fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
端口映射参数说明
-P
:容器内部端口随机映射到主机的端口-p
:容器内部端口绑定到指定的主机端口
使用 -p 参数指定端口映射:
$ docker run -d -p 5000:5000 training/webapp python app.py
33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0
$ docker ps
CONTAINER ID IMAGE COMMAND ... PORTS NAMES
33e4523d30aa training/webapp "python app.py" ... 0.0.0.0:5000->5000/tcp berserk_bartik
指定网络地址绑定
我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1:
$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c
UDP 端口映射
默认情况下,-p 参数都是绑定 TCP 端口。如果要绑定 UDP 端口,可以在端口后面加上 /udp:
$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a
查看端口绑定
使用 docker port 命令可以查看端口的绑定情况:
$ docker port adoring_stonebraker 5000
127.0.0.1:5001
Docker 容器互联
端口映射并不是唯一把 Docker 连接到另一个容器的方法。Docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。
容器命名
创建容器时,可以使用 --name 参数来指定容器名称:
$ docker run -d -P --name sean training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441
新建网络
创建一个新的 Docker 网络:
docker network create -d bridge test-net
网络参数说明
-d
:指定 Docker 网络类型,可以是 bridge 或 overlaybridge
:桥接网络,用于单机容器通信overlay
:覆盖网络,用于 Swarm mode 下的容器通信
连接容器
运行两个容器并连接到新建的 test-net 网络:
# 运行第一个容器
$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
# 运行第二个容器
$ docker run -itd --name test2 --network test-net ubuntu /bin/bash
安装 ping 工具
如果容器中没有 ping 命令,可以通过以下命令安装:
apt-get update
apt install iputils-ping
配置 DNS
可以在宿主机的 /etc/docker/daemon.json 文件中设置所有容器的 DNS:
{
"dns": [
"114.114.114.114",
"8.8.8.8"
]
}
配置生效
配置完成后,需要重启 Docker 服务才能生效。
验证 DNS 配置
使用以下命令查看容器的 DNS 配置:
docker run -it --rm ubuntu cat etc/resolv.conf
手动指定 DNS
如果只想为特定容器配置 DNS,可以使用以下参数:
docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
DNS 参数说明
--rm
:容器退出时自动清理容器内部的文件系统-h HOSTNAME
:设定容器的主机名--dns=IP_ADDRESS
:添加 DNS 服务器--dns-search=DOMAIN
:设定容器的搜索域
Windows 系统特别说明
Windows 端口映射问题
在 Windows 系统中,由于 Docker 实际运行在虚拟机中,localhost 指向的是虚拟机而不是 Windows 主机,这可能导致端口映射访问问题。
解决方案
1. 查找 Docker 虚拟机的 IP 地址:
docker-machine ip default
2. 使用虚拟机 IP 访问服务,例如:
http://192.168.99.100:8888
获取容器 IP
如果需要获取容器的 IP 地址,可以使用以下命令:
docker inspect container_id