Docker网络配置与管理

一、单主机与多主机的Docker网络

对于大多数单主机部署来说,可以使用网络在容器之间、容器与主机之间进行数据交换

容器也可以使用共享卷进行数据交换,共享卷容易使用而且速度很快,但是其耦合度高,难将单主机部署再转化为多主机部署。

在多主机部署中,除了需要考虑单主机上容器之间的通信,更重要的是要完成多主机之间的通信。

Docker网络作用域可以是local(本地)Swarm(集群)

  • local作用域仅Docker主机范围内提供连接和网络服务(如 DNS 和 IPAM);
  • Swarm 作用域提供集群范围的连接和网络服务
  • Swarm作用域网络在整个集群中有同一个网络ID,而 local作用域网络则在每Ddcker主机上具有各自唯一的网络ID

二、Docker网络驱动

Docker网络子系统使用可插拔的驱动,默认情况下有多个驱动程序,并提供核心连网功能。

  • bridge桥接网络,这是默认的网络驱动程序。不指定驱动程度创建突器时就会使用这种网络类型。当应用程序在需要通信的独立容器中运行时,通常会使用桥接网络。
  • host主机网络。对于独立容器来说,可以消除容器和Docker主机之间的网络隔离,直接使用主机的网络。
  • overlay覆盖网络。它将多个 Docker 守护进程连接在一起,并使 Swarm 集群服务之间能够相互通信。还可以使用 overlay 网络来实现 Swarm 集群服务和独立容器之间的通信,或者实现不同Docker守护进程上两个独立容器之间的通信。这种驱动不需要在容器之间执行操作系统级路由。
  • macvlan:将 MAC 地址分配给容器,使容器作为网络上的物理设备。Docker 守护进程通过其MAC 地址将流量路由到容器。当传统应用程序要直接连接到物理网络时,macvlan 有时是最佳选择它不用通过Docker主机的网络栈进行路由。
  • none:表示关闭容器的所有网络连接,通常与自定义网络驱动一起使用。none不适用于Swam集群服务
  • 网络插件:通过 Docker 安装和使用第三方网络插件,这些插件可从 Docker Hub 或第三方供应商获得。

三、选择Docker网络驱动的基本原则

  • 用户自定义桥接网络最适合用于同一个Docker主机上运行的多个容器之间需要通信的场景。
  • host网络最适用于网络栈不能与Docker主机隔离,而容器的其他方面需要被隔离的场景。
  • overlay网络适用于不同Docker主机上运行的容器需要通信的场景,或者多个应用程序通过Swarm集群服务一起工作的场景。
  • macvian网络适用于从虚拟机迁移过来的场景,或者容器需要像网络上的物理机一样,拥有独立MAC地址的场景。
  • 第三方网络插件适用于将 Docker与专用网络栈进行集成的场景。

四、容器的网络模式

创建容器时,可以指定容器的网络模式。

4.1、bridge模式

桥接网络用于在同一Docker主机上运行的容器之间的通信

  • 当Docker守护进程启动时,会自动在Docker 主机上创建一个名为docker0的虚拟网桥,容器如果没有明确定义,则会自动连接到这个虚拟网桥上。
  • Docker 守护进程为每个启动的容器创建一个VETH 对设备。(VETH 对成对出现,组成一个数据通道)
  • 其中一个接口设置为新创建容器的接口(内部命名为eth0@xxx),它位于容器的网络名称空间中;
  • 另一个接口连接到虚拟网桥docker0,它位于Docker的网络名称空间中,以vethxxx形式命名。
  • Docker会从RFC1918所定义的私有IP网段中选择与Docker 主机不同的 IP 地址和子网分配给 docker0 虚拟网桥。连接到 docker0 网桥的容器就从这个子网中选择一个未占用的IP 地址来使用。(一般为连续的)

4.2、host模式

容器使用host 驱动,直接连接到 Docker主机网络栈。这种网络模式实质上是关闭Docker网络,而让容器直接使用主机操作系统的网络。

host模式没有为容器创建一个隔离的网络环境,容器没有隔离的网络名称空间,也不会获得一个独立的网络名称空间,而是和Docker主机共用一个网络名称空间。但是容器的其他方面,如文件系统、进程列表等与主机是隔离的。

4.3、container模式

这是Docker中一种较为特别的网络模式,主要用于容器和容器直接频繁交流的情况。通常来说,当要自定义网络栈时,该模式是很有用的,该模式也是Kubernetes集群所使用的网络模式。

该模式指定新创建的容器和现有的一个容器,而不是和Docker主机共享同一个网络名称空间。新创建的容器不会创建自己的网络接口、配置自己的IP地址等,而是和一个指定的容器共享 IP 地址、端口范围等。

两个容器除了网络方面,其他的如文件系统、进程列表等还是相互隔离的,两个容器的进程可以通过回环网络接口进行通信。两个容器又与主机以及除此之外其他的容器存在网络隔离。

4.4、none模式

这种模式将容器放置在它自己的网络栈中,但是并不进行任何配置,实际上关闭了容器的网络功能。主要用于

  • 有些容器并不需要网络,如只需要写入磁盘卷的批处理任务。
  • 一些对安全性要求高并且不需要连网的应用可以使用 none 模式。如某个容器的唯一用途是生成随机密码,就可以放到none网络中避免密码被窃取。
  • 自定义网络。

4.5、用户自定义网络

管理员可以使用Docker网络驱动(bridgge、overlay、macvlan)或第三方驱动插件创建一个自定义的网络,然后将多个容器连接到同一个自定义网络。

连接到同一个网络的容器之间只需要使用对方的IP地址名称就能相互通信。根据需要创建任意数量的自定义网络,并且可以在任何给定时间将容器连接到这些网络中。

单主机环境常用的用户自定义桥接网络。Docker 本身内置bridge网络驱动,可以用来创建用户自定义桥接网络。生产环境中应使用用户自定义桥接网络,不推荐使用默认桥接网络

用户自定义桥接网络与默认桥接网络的主要区别如下:

  • 用户自定义桥接网络能提供容器化应用程序之间更好的隔离和互操作性。连接到同一个用户自定义桥接网络的容器会自动互相暴露所有端口,但不会将端口暴露到外部。如果在默认桥接网络上运行应用栈,则Docker主机需要通过其他方式来限制对端口的访问。
  • 用户自定义桥接网络提供容器之间自动 DNS 解析功能,可以通过名称或别名互相访问。而默认桥接网络上的容器只能通过IP地址互相访问。
  • 容器可以在运行时与用户自定义桥接网络连接和断开。要断开与默认桥接网络的连接,需要停止容器并使用不同的网络选项重新创建该容器。
  • 每个用户可通过自定义桥接网络创建一个可配置的网桥,而默认桥接网络会自动创建一个名为docker0的虚拟网桥
  • 默认桥接网络中所连接的容器共享环境变量。而在用户自定义桥接网络中这类共享方式是无法使用的,不过有更好的方式实现共享环境变量,这些方式包括:

    • 多个容器使用 Docker 卷挂载包含共享信息的一个文件或目录
    • 通过docker-compose 命令同时启动多个容器,由 Compose 文件定义共享变量
    • 使用集群服务代替单个容器,共享机密数据和配置数据。

4.5、容器之间的通信方案

  • bridge模式让同一个Docker网络上的所有容器在所有端口上都可以相互连接
  • host 模式让所有容器都位于同一个主机网络空间中,并共用主机的 IP 地址栈,在该主机上的所有容器都可通过主机的网络接口相互通信。
  • 在用户自定义桥接网络中,容器之间可以通过名称或别名互相访问。
  • 容器通过端口映射对外部提供连接。
  • container模式让容器共用一个IP网络,两个容器之间可通过回环网络接口相互通信。
  • 容器之间使用--link选项建立传统的容器互连。
  • 容器之间通过挂载主机目录来实现相互之间的数据通信。

4.6、容器访问外部网络

默认使用bridge模式(默认桥接网络)的容器是通过NAT方式实现外部访问的,具体是通过iptables(Linux的包过滤防火墙)的源地址伪装操作实现的。

4.7、从外部网络访问容器

将容器的一个端口映射到Docker主机上的一个端口,允许从外部网络通过该端口访问容器。这种端口映射也是一种NAT实现,即目标地址转换(Destination NAT,DNAT)。

4.8、容器的网络配置语法

使用 docker rundocker create 命令的相关选项来设置容器的网络配置,包括网络连接、IP地址与生机名、DNS设置,以及端口映射等。

4.8.1、设置容器的网络连接

使用--network选项设置容器要连接的网络,也就是网络模式。同样的功能也可使用--net选项来实现。

  • none:容器采用none模式,不使用任何网络连接。使用docker run--network none能够完全禁用网络连接。这种情形下,只能通过文件、标准输入或标准输出完成VO通信。
  • bridge:容器采用bridge模式,连接到默认桥接网络,这是默认设置。
  • host:容器采用host模式,使用主机的网络栈。
  • container:容器采用container模式,使用其他容器的网络栈,需要通过容器的name或id参数指定其他容器。
  • <网络名称><网络ID>:容器连接到自定义网络,这个参数可以是自定义网络的名称或ID。容器启动时,只能使用--network选项连接到一个网络。

4.8.2、为容器添加网络作用域的别名

使用--network-alias选项指定容器在该网络中的别名

 # 将testweb容器连接到mynet网络,testweb容器在该网络中的别名是websrv,在mynet网络中的其他容器可以通过该别名访问该容器。
 docker run -d -p 80:80 --name testweb --network mynet --network-alias websry httod

4.8.3、设置容器的IP地址

使用--ip--ip6选项明确指定分配给该网络上容器的IP地址

当通过docker network connect命令将现有的容器连接到另一个不同的网络时,也可以使用--ip或--ip6选项指定容器在另一个网络上的IP地址。

4.8.4、设置容器的网络接口MAC地址

默认情况,容器的 MAC 地址基于其IP 地址生成。

通过--mac-address 选项(格式如12:34:56:78:9a:bc)为容器指定一个MAC地址。需要注意的是,如果手动指定MAC地址,Docker并不会检查地址的唯一性。

4.8.5、设置容器的DNS配置和主机名

默认情况下,容器继承Docker 守护进程的DNS 配置,包括/etc/hosts/etc/resolv.conf配置文件。可以使用以下选项为每个容器配置DNS,以覆盖这些默认配置:

  • --dns:为容器设置DNS服务器的IP地址。可以使用多个--dns选项为一个容器指定多个DNS服务器。如果容器无法连接到所指定的DNS服务器IP 地址,则会自动使用Google 提供的公共DNS服务器8.8.8.8,让容器能够解析Intemet域名。

  • --dns-search:为容器指定一个DNS搜索域,用于搜索非全称主机名。要指定多个DNS搜索前缀,可以使用多个--dns-search选项。
  • --dns-opt:为容器设置表示DNS选项及其值的键值对,可以参考操作系统的resolv.conf文件来确定这些选项。
  • --hostname:为容器指定定义的主机名。如果未指定,则主机名就是容器的名称。

4.8.6、设置容器的发布端口

通过docker run命令创建容器时使用-p(长格式--publish)或-P(长格式--publish-all)选项设置对外发布的端口,也就是端口映射

4.8.7、设置容器连接

传统功能,可能会被弃用。通过docker run命令创建容器时使用--link选项建立容器连接

4.9、Docker网络管理语法

docker network 是Docker网络本身的管理命令,基本语法:

 docker network 子命令

命令描述
docker network connect将容器连接到指定的网络
docker network create创建一个网络
docker network disconnect断开容器与指定网络的连接
docker network inspect显示一个或多个网络的详细信息
docker network ls显示网络列表
docker network prune删除所有未使用的网络
docker network rm删除一个或多个网络

五、示例

5.1、查看网络列表

 [root@docker-a ~]# docker network ls
 NETWORK ID     NAME      DRIVER    SCOPE
 72ec0afbf36c   bridge    bridge    local
 1d604878448b   host      host      local
 d139ecca84c6   none      null      local

5.2、查看网络详细信息

 [root@docker-a ~]# docker network inspect bridge
 ...
         "Name": "bridge",   
         ...
         "Containers": {...},    # 列出已经连接的容器
 ...

5.3、容器连接到默认桥接网络

1、列出当前已有网络

 [root@docker-a ~]# docker network ls
 NETWORK ID     NAME      DRIVER    SCOPE
 72ec0afbf36c   bridge    bridge    local
 1d604878448b   host      host      local
 d139ecca84c6   none      null      local

2、运行两个centos容器c1、c2-dit表示后台运行+交互式和伪终端TTY(可以查看输入和输出)

 [root@docker-a ~]# docker run -itd --name c1 centos:latest 
 4cef228897b6b47aa399bf72a08cfa3c1779666b4e7f3c5542fa7f956a47b842
 [root@docker-a ~]# docker run -itd --name c2 centos:latest 
 193bc6d48d4ec5064707d7fd243e14133c58522aa5a921adc1b7f10f4183b74a

3、检查两个容器是否已经启动

 [root@docker-a ~]# docker ps
 CONTAINER ID   IMAGE           ...     STATUS          PORTS     NAMES
 193bc6d48d4e   centos:latest   ...     Up 6 seconds              c2
 4cef228897b6   centos:latest   ...     Up 15 seconds             c1

4、查看bridge网络的详细信息,发现多了两个容器,IP地址为172.17.0.2和172.17.0.3

 [root@docker-a ~]# docker network inspect bridge
 [
         "Name": "bridge",
 ...
         "Containers": {
             "193bc6d4...": {
                 "Name": "c2",
                 "EndpointID": ...
                 "IPv4Address": "172.17.0.3/16",
             },
             "4cef228...": {
                 "Name": "c1",
                 "EndpointID": ...
                 "IPv4Address": "172.17.0.2/16",
             }
         },
 ...
 ]
 ​

5、连接c1容器,#表示当前以root身份登录,查看c1的网络接口

[root@docker-a ~]# docker attach c1
[root@4cef228897b6 /]# 

# 显示网络接口
[root@4cef228897b6 /]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000			# 这是接口是回环设备(Loopback)。
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
76: eth0@if77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 		# 这个IP地址与上述的IP地址一致
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0

6、在c1容器中通过ping来证明可以访问外部网络、另一个容器c2。但不能通过容器名称来ping

# 在C1中测试是否能连接外网,-c 2代表限制ping命令仅尝试2次
[root@4cef228897b6 /]# ping -c 2 www.baidu.com
PING www.a.shifen.com (183.2.172.185) 56(84) bytes of data.
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=1 ttl=127 time=31.3 ms
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=2 ttl=127 time=29.6 ms
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 29.647/30.496/31.345/0.849 ms

# 可以ping通另一个容器c2
[root@4cef228897b6 /]# ping -c 2 172.17.0.3   
PING 127.17.0.3 (127.17.0.3) 56(84) bytes of data.
64 bytes from 127.17.0.3: icmp_seq=1 ttl=64 time=12.4 ms
64 bytes from 127.17.0.3: icmp_seq=2 ttl=64 time=0.025 ms

--- 127.17.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.025/6.228/12.431/6.203 ms

# 不能通过容器名称来ping
[root@4cef228897b6 /]# ping -c 2 c2        
ping: c2: Name or service not known

7、脱离c1容器但不要停止它。需要使用两个组合键Ctrl+P和Ctrl+Q(在键盘上按住Ctrl键在依此按下P和Q键

8、停止并删除这两个容器

docker stop c1 c2
docker container rm c1 c2

5.4、使用传统的容器连接

1、运行一个centos容器c3

[root@docker-a ~]# docker run  -itd --name c3 centos
0957aab0e541cfbad64ecd63a00963c93bf872551c7878a44667b6f27ff2f139

2、创建并运行另一个centos容器c4,并添加c3容器的连接

[root@docker-a ~]# docker run -itd --name c4 --link c3:cos3 centos
b62035e69a65e9b79aa3a049bb2d2498d2c600a07570a67759b079de28c0d668

3、进入c4容器,测试与c3容器及其别名是否能连通,结果为通信成功

[root@docker-a ~]# docker attach c4
[root@b62035e69a65 /]# ping -c 2 c3
PING cos3 (172.17.0.2) 56(84) bytes of data.
64 bytes from cos3 (172.17.0.2): icmp_seq=1 ttl=64 time=0.161 ms
...
[root@b62035e69a65 /]# ping -c 2 cos3 
PING cos3 (172.17.0.2) 56(84) bytes of data.
64 bytes from cos3 (172.17.0.2): icmp_seq=1 ttl=64 time=0.050 ms
...

4、使用组合键Ctrl+P和Ctrl+Q脱离容器c3

5、进入c3容器,并测试与c4的连通性,结果表明通信失败

[root@docker-a ~]# docker attach c3
[root@0957aab0e541 /]# ping -c 2 c4
ping: c4: Name or service not known

6、脱离容器,停止并删除这两个容器,恢复实验环境

5.5、创建用户自定义桥接网络并连接容器

通过docker network create命令创建用户自定义网络

docker network create [选项] 网络名称

--driver(-d)选项指定网络驱动。默认为bridge(桥接网络);--getaway选项指定子网的网关;--ip-range选项指定子网中容器的IP地址范围。

1、创建用户自定义网络my-net

# 可以不使用--driver bridge参数,这是默认的网络驱动
docker network create --driver bridge my-net

2、列出主机上的网络,发现新添加了自定义网络my-net,查看详细信息,发现没有容器连接该网络

[root@docker-a ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
cd84b1656bf7   my-net    bridge    local
...

# 发现没有容器连接该网络,且网络网关是172.18.0.1.而默认网关是172.17.0.1
[root@docker-a ~]# docker network inspect my-net 
...
    "Name": "my-net",
       "Config": {
       "Subnet": "172.18.0.0/16",
       "Gateway": "172.18.0.1"
       }
...
       "Containers": {},
...
]

3、分别创建4个centos容器,注意--networl选项的使用,c3容器仅连接到默认桥接网络bridge

[root@docker-a ~]# docker run -dit --name c1 --network my-net centos
c41e2ad6...
[root@docker-a ~]# docker run -dit --name c2 --network my-net centos
32946913...
[root@docker-a ~]# docker run -dit --name c3 centos
b85829f6...
[root@docker-a ~]# docker run -dit --name c4 --network my-net centos
9bb0e44e...

# 执行docker run 命令仅能连接到一个网络,但容器需要连接多个网络,可在容器创建后使用docker network connect命令再连接到其他网络。这里将c4容器连接到默认桥接网络
[root@docker-a ~]# docker network connect bridge c4

# 查看所有容器,表明正常运行
[root@docker-a ~]# docker ps
CONTAINER ID   IMAGE     ...     STATUS              PORTS     NAMES
9bb0e44e7de7   centos    ...     Up 49 seconds                 c4
b85829f621fa   centos    ...     Up About a minute             c3
32946913bf52   centos    ...     Up About a minute             c2
c41e2ad6f301   centos    ...     Up About a minute             c1

4、查看bridge网络和my-net网络的详细信息。

[root@docker-a ~]# docker network inspect bridge
...
        "Name": "bridge",
        "Containers": {
            "9bb0e44e7de78...": {
                "Name": "c4",
                "EndpointID": "17addc1fa...",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
            },
            "b85829f621...": {
                "Name": "c3",
                "EndpointID": "da301343...",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
... 
# 表明容器c3和c4连接到了bridge网络
[root@docker-a ~]# docker network inspect my-net 
...
        "Name": "my-net",
        "Containers": {
            "32946913...": {
                "Name": "c2",
                "EndpointID": "343544b...",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
            },
            "9bb0e44...": {
                "Name": "c4",
                "EndpointID": "9039c5...",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
            },
            "c41e2ad6f...": {
                "Name": "c1",
                "EndpointID": "63c79d...",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
...
# 结果表明c1、c2、c4连接到了my-net网络

5、在自定义桥接网络中,容器可以通过IP和名称进行通信。这称为自动服务发现

[root@docker-a ~]# docker attach c1
[root@c41e2ad6f301 /]# ping -c 2 c2
PING c2 (172.18.0.3) 56(84) bytes of data.
64 bytes from c2.my-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.875 ms
...
[root@c41e2ad6f301 /]# ping -c 2 c4
PING c4 (172.18.0.4) 56(84) bytes of data.
64 bytes from c4.my-net (172.18.0.4): icmp_seq=1 ttl=64 time=1.86 ms
...

6、c1不能与c3进行通信,因为c3不在my-net网络中,pingc3容器的IP也是无法通信

[root@c41e2ad6f301 /]# ping -c 2 c3
ping: c3: Name or service not known

[root@c41e2ad6f301 /]# ping -c 2 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1003ms
# 按住Ctrl+P+Q键脱离容器

7、c4同时连接到了桥接网络和自定义网络。它可以访问所有其他容器,只是访问c3需要通过IP。

[root@docker-a ~]# docker attach c4
[root@9bb0e44e7de7 /]# ping -c 2 c1
PING c1 (172.18.0.2) 56(84) bytes of data.
64 bytes from c1.my-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.079 ms
...
[root@9bb0e44e7de7 /]# ping -c 2 c2
PING c2 (172.18.0.3) 56(84) bytes of data.
64 bytes from c2.my-net (172.18.0.3): icmp_seq=1 ttl=64 time=1.53 ms
...
[root@9bb0e44e7de7 /]# ping -c 2 c3		# 通过容器名称访问失败
ping: c3: Name or service not known

[root@9bb0e44e7de7 /]# ping -c 2 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=1.51 ms
...

8、最后通过访问公网测试,发现都可正常访问外网

ping -c 2 www.baidu.com

9、脱离容器,删除以上容器和my-net网络,恢复实验环境

docker stop c1 c2 c3 c4
docker rm c1 c2 c3 c4
docker network rm my-net

5.6、设置端口映射、允许外部网络访问容器

要让容器能被访问,就要通过docker run命令创建容器时使用-p或-P选项设置端口映射,将容器的一个端口映射到Docker主机上的一个端口,允许外部网络通过该端口访问容器。

1、使用-p选项发布特定端口

选项格式说明示例
-p 主机端口:容器端口映射主机上所有网络接口的地址-p 8080:80
-p 主机IP 地址:主机端口:容器端口映射指定地址的指定端口-p 192.168.10.10:80:5000
-p 主机IP地址::容器端口映射指定地址的任一端口-p 127.0.0.1::5010
-p 容器端口自动分配主机端口-p 5200
-p 以上各种格式/udp发布 UDP端口(默认为TCP 端口)-p 8080:80/udp
-p 以上各种格式/tcp -p 以上各种格式/udp同时发布 TCP 和UDP 端口-p 8080:80/tcp -p 8080:80/udp
# 通过端口映射发布Web服务的示例
[root@docker-a ~]# docker run --rm -d --name websrv -p 8080:80 httpd
413a83cabd274e7e7b95de69be78f5e624aa07e9592711a88edf966b178f8c0e

# 查看端口映射
[root@docker-a ~]# docker ps
CONTAINER ID   IMAGE  ...      PORTS                                   NAMES
413a83cabd27   httpd  ...      0.0.0.0:8080->80/tcp, :::8080->80/tcp   websrv

# 通过<主机>:<端口访问容器的Web服务
[root@docker-a ~]# curl 10.0.0.2:8080
<html><body><h1>It works!</h1></body></html>

2、使用-P选项发布所有暴露的端口

有两种方式可以暴露端口:一是在Dockerfile中使用EXPOSE指令定义。二是执行docker run命令时使用--expose选项指定

# 创建一个容器并使用-P选项发布httpd服务
[root@docker-a ~]# docker run --rm -d --name websrv -P httpd
3855934fdc13e81d16e23c1d1e22229f50167e7af47587a3931fa8319c969bbf

# 查看该容器的端口映射位置
[root@docker-a ~]# docker port websrv 
80/tcp -> 0.0.0.0:32768

# curl命令访问该服务进行测试
[root@docker-a ~]# curl 10.0.0.2:32768
<html><body><h1>It works!</h1></body></html>
  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Docker 提供了各种网络管理选项,用于在容器之间建立网络连接和通信。以下是一些常见的 Docker 网络管理概念和功能: 1. Docker 网络驱动程序(Network Drivers):Docker 支持多种网络驱动程序,用于创建和管理容器之间的网络。默认情况下,Docker 使用 `bridge` 驱动程序。 2. 网络模式(Network Modes):Docker 提供了几种网络模式,用于定义容器如何与主机和其他容器通信。常见的网络模式包括 `bridge`、`host`、`overlay` 和 `none`。 3. 网络创建(Network Creation):可以使用 Docker 命令或 Docker Compose 文件来创建自定义网络。创建自定义网络可以为容器提供隔离的网络环境,并根据需要配置网络参数。 4. 容器连接(Container Networking):可以使用 Docker 命令或 Docker Compose 文件将容器连接到特定网络。这样可以使容器能够通过网络与其他容器或主机进行通信。 5. 网络别名(Network Aliases):Docker 允许为容器分配多个网络别名,这样容器可以通过多个名称进行访问。这对于容器之间的相互通信和服务发现非常有用。 6. 跨主机网络(Multi-Host Networking):Docker 提供了 `overlay` 和 `macvlan` 网络驱动程序,允许在多个 Docker 主机之间创建跨主机网络。这样可以在分布式环境中轻松地管理容器之间的通信。 以上只是 Docker 网络管理的一些基本概念和功能。具体使用方法和配置选项可以参考 Docker 官方文档或其他相关资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小李学不完

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

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

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

打赏作者

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

抵扣说明:

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

余额充值