7、docker 使用网络

本文详细介绍了Docker的网络配置,包括如何通过-P和-p参数实现外部访问容器,以及容器间的互联方式。Docker允许通过端口映射使得外部能够访问容器内的服务,并介绍了多种端口映射的用法。此外,文章还强调了使用自定义网络替代--link参数进行容器互联的优势,展示了创建网络、连接容器以及验证容器间通信的步骤。最后,提到了如何自定义容器的DNS配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        很早之前看的文章,进行了简单的排版整理,找不到源地址了,如有侵权,请联系删除。

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

1、外部访问容器(-P/-p)

        1)容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。

        当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。

        使用 docker container ls 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。

$ docker run -d -P training/webapp python app.py

$ docker container ls -l
CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse

        同样的,可以通过 docker logs 命令来查看应用的信息。

$ docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/
10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -

        2)-p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 :

ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

1.1、映射所有接口地址

        使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以执行:

$ docker run -d -p 5000:5000 training/webapp python app.py

        此时默认会绑定本地所有接口上的所有地址。

1.2、映射到指定地址的指定端口

        可以使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1

$ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

1.3、映射到指定地址的任意端口

        使用 ip::containerPort 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。

$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py

        还可以使用 udp 标记来指定 udp 端口:

$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

1.4、查看映射端口配置

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

$ docker port nostalgic_morse 5000
127.0.0.1:49155.

注意:

        1)容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。);

        2)-p 标记可以多次使用来绑定多个端口。

例如:

$ docker run -d \
    -p 5000:5000 \
    -p 3000:80 \
    training/webapp \
    python app.py

2、容器互联

        如果你之前有 Docker 使用经验,你可能已经习惯了使用 --link 参数来使容器互联。随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数

2.1、新建网络

        下面先创建一个新的 Docker 网络。

$ docker network create -d bridge my-net

        -d 参数指定 Docker 网络类型,有 bridge overlay。其中 overlay 网络类型用于 Swarm mode(Swarm mode - Docker — 从入门到实践),在本小节中你可以忽略它。

2.2、连接容器

        运行一个容器并连接到新建的 my-net 网络:

$ docker run -it --rm --name busybox1 --network my-net busybox sh

        打开新的终端,再运行一个容器并加入到 my-net 网络,

$ 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

        下面通过 ping 来证明 busybox1 容器和 busybox2 容器建立了互联关系。

        在 busybox1 容器输入以下命令:

/ # 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

        用 ping 来测试连接 busybox2 容器,它会解析成 172.19.0.3。同理在 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

        这样,busybox1 容器和 busybox2 容器建立了互联关系。

Docker Compose:

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

3、配置 DNS

        如何自定义配置容器的主机名和 DNS 呢?秘诀就是 Docker 利用虚拟文件来挂载容器的 3 个相关配置文件。

        在容器中使用 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 ...

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

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

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

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

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

        如果用户想要手动指定容器的配置,可以在使用 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 来配置容器。

4、总结

# 一共有三种形式进行端口映射
docker -p ip:hostPort:containerPort # 映射指定地址的主机端口到容器端口
# 例如:docker -p 127.0.0.1:3306:3306 映射本机3306端口到容器的3306端口
docker -p ip::containerPort # 映射指定地址的任意可用端口到容器端口
# 例如:docker -p 127.0.0.1::3306 映射本机的随机可用端口到容器3306端口
docer -p hostPort:containerPort # 映射本机的指定端口到容器的指定端口
# 例如:docker -p 3306:3306 # 映射本机的3306端口到容器的3306端口

 传送门:

        完整的docker教程见docker使用教程(持续更新,推荐),docker基本原理、概念使用手册系列文章快速访问地址如下:

        1、docker 简介

        2、docker 基本概念

        3、docker 镜像

        4、docker 容器

        5、docker 访问仓库

        6、docker 数据管理

        7、docker 使用网络

        8、docker 配置管理

        9、docker 容器的ssh连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jingbo1801

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值