Docker 使用网络

发布于 2025-02-01 12:42:41 字数 4696 浏览 7 评论 0

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

一、外部访问容器

通过 -P-p 参数来指定端口映射。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

$ docker run -d -p 80:80 nginx:alpine # 映射本地的 80 端口映射到容器的 80 端口
$ docker run -d -p 127.0.0.1:80:80 nginx:alpine # 映射到指定地址的指定端口
$ docker run -d -p 127.0.0.1::80 nginx:alpine # 使用 ip::containerPort 绑定 localhost 的任意端口到容器的 80 端口,本地主机会自动分配一个端口。

$ docker run -d -p 127.0.0.1:80:80/udp nginx:alpine # 还可以使用 udp 标记来指定 udp 端口

1. 查看映射端口配置

使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址 :

$ docker port fa 80
0.0.0.0:32768

注意:

  • 容器有自己的内部网络和 ip 地址(使用 docker inspect 查看,Docker 还可以有一个可变的网络配置。)
  • -p 标记可以多次使用来绑定多个端口
    $ docker run -d \
        -p 80:80 \
        -p 443:443 \
        nginx:alpine
    

二、容器网络互联

建议将容器加入自定义的 Docker 网络 来连接多个容器,而不是使用 --link 参数。

  1. 新建网络
    $ docker network create -d bridge my-network
    

    -d 参数指定 Docker 网络类型,有 bridgeoverlay 。其中 overlay 网络类型用于 Swarm mode

  2. 连接容器

    如果你有多个容器之间需要互相连接,推荐使用 Docker Compose

    • 运行两个容器并连接到新建的 my-net 网络
      $ docker run -it --rm --name busybox1 --network my-net busybox sh
      $ docker run -it --rm --name busybox2 --network my-net busybox sh
      
      # 查看容器信息
      $ docker container ls
      
      CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
      b47060aca56b        busybox             "sh"                11 minutes ago      Up 11 minutes                           busybox2
      8720575823ec        busybox             "sh"                16 minutes ago      Up 16 minutes                           busybox1
      
    • 如何证明 busybox1 容器和 busybox2 容器建立了互联关系?Ping 命令

      busybox1 容器中 ping busybox2

      / # ping busybox2
      PING busybox2 (172.19.0.3): 56 data bytes
      64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
      64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms
      

      busybox2 容器中 ping busybox1

      / # ping busybox1
      PING busybox1 (172.19.0.2): 56 data bytes
      64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.064 ms
      64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.143 ms
      

三、配置容器的 DNS主机名

1. 全局容器配置

Docker 利用虚拟文件来挂载容器的 3 个相关配置文件( /etc/hostname/etc/hosts/etc/resolv.conf ) 来自定义配置容器的主机名和 DNS 。

这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 DNS 配置通过 /etc/resolv.conf 文件立刻得到更新。

在容器中使用 mount 命令可以看到挂载信息:

$ mount
/dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...
/dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ...
tmpfs on /etc/resolv.conf type tmpfs ...

除了可以配置 /etc/resolv.conf 文件来配置全部容器的 DNS ,也可以在 /etc/docker/daemon.json 文件中增加以下内容来设置。

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

这样每次启动的容器 DNS 自动配置为 114.114.114.1148.8.8.8 。使用以下命令来证明其已经生效。

$ docker run -it --rm ubuntu:18.04  cat etc/resolv.conf

nameserver 114.114.114.114
nameserver 8.8.8.8

2. 指定容器配置

在使用 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 来配置容器。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
27 人气
更多

推荐作者

alipaysp_giMRmwQ3mK

文章 0 评论 0

爱她像谁

文章 0 评论 0

清风疏影

文章 0 评论 0

mb_OO8gCSDD

文章 0 评论 0

佚名

文章 0 评论 0

汹涌人海

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文