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 或 overlay
  • bridge:桥接网络,用于单机容器通信
  • 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

配置 DNS

可以在宿主机的 /etc/docker/daemon.json 文件中设置所有容器的 DNS:

{
  "dns": [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

验证 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 系统特别说明

解决方案

1. 查找 Docker 虚拟机的 IP 地址:

docker-machine ip default

2. 使用虚拟机 IP 访问服务,例如:

http://192.168.99.100:8888

获取容器 IP

如果需要获取容器的 IP 地址,可以使用以下命令:

docker inspect container_id