Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。

外部访问容器

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射,当使用 -P 标记时,Docker 会随机映射一个端口到内部容器开放的网络端口,而-p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。

  1. # 映射任何访问地址的80端口到容器内的80端口
  2. $ docker run -d -p 80:80 nginx:alpine
  3. # 映射指定访问地址的80端口到容器内的80端口
  4. $ docker run -d -p 127.0.0.1:80:80 nginx:alpine
  5. $ docker run -d -p 127.0.0.1:80:80/udp nginx:alpine # 指定使用udp协议
  6. # 映射指定访问地址的任意端口到容器内的80端口
  7. $ docker run -d -p 127.0.0.1::80 nginx:alpine
  8. # 一次性绑定多个端口
  9. $ docker run -d \
  10. -p 80:80 \
  11. -p 443:443 \
  12. nginx:alpine
  13. # 查看映射端口配置
  14. $ docker port fa 80
  15. 0.0.0.0:32768

容器互联

之前可以通过使用—lilnk参数来使容器互联,但目前建议将容器加入自定义的 Docker 网络来连接多个容器,而不是使用—link参数,更推荐的是使用Docker Compose。

  1. # 创建一个新的Docker网络
  2. $ docker network create -d bridge my-net
  3. # 运行容器并连接到新建的my-net网络
  4. $ docker run -it --rm --name busybox1 --network my-net busybox sh
  5. $ docker run -it --rm --name busybox2 --network my-net busybox sh
  6. # 使用ping命令证明容器之间互联
  7. # 在busybox1容器中输入,同理也可在busybox2中进行测试
  8. $ ping busybox2

配置DNS

Docker使用挂载来实现了宿主机DNS和容器DNS配置的同步,宿主机 DNS 信息发生更新后,所有 Docker 容器的 DNS 配置通过 /etc/resolv.conf 文件立刻得到更新。

如果需要配置全部容器的DNS,也可以在/etc/docker/daemon.json 文件中增加以下内容来设置,这样每次启动的容器DNS就会被自动配置。

  1. {
  2. "dns" : [
  3. "114.114.114.114",
  4. "8.8.8.8"
  5. ]
  6. }

如果需要手动指定容器的配置,可以在使用 docker run 命令启动容器时加入如下参数:

  • -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 会默认用主机上的 /etc/resolv.conf 来配置容器。