容器的连通性

发布于:2025-07-13 ⋅ 阅读:(12) ⋅ 点赞:(0)

(1)创建一个叫 my-net 的 bridge 类型的网络

root@bogon ~]# docker network create -d bridge my-net

2171fab7109878ea43dadbd6b09f6395bd54ec691cba10ad7a4c2f0fcb7c4f46

(2)查看都有哪些网络

root@bogon ~l# docker network ls

NETWORK ID        NAME          DRIVER     SCOPE

8cd27b16846c       bridge         bridge      local

9095f54e4dee       host           host       local

bridge2171fab71098  my-net         local       local

be41d33662a5       none          null        local
[root@bogon ~]#t docker run -itd --rm --name busybox1 --network my-net busybox sh -c 'whiletrue;do echo hello;done

f7614d0e88f1eabf174d0cc4679e4f5407bf1c5fbb4c2932a5f8327ecaee4978

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

[root@bogon ~]# docker run -itd --rm --name busybox1 --network my - net busybox sh -c 'while true;do echo hello;done'

f7614d0e88f1eabf174d0cc4679e4f5407bf1c5fbb4c2932a5f8327ecaae4978

(4) 运行一个容器并加入到 my - net 网络

[root@bogon ~]# docker run -it --rm --name busybox2 --network my - net busybox sh

/ # ping busybox1

PING busybox1 (172.18.0.2): 56 data bytes

64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.059 ms

64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.059 ms
^C

--- busybox1 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round - trip min/avg/max = 0.059/0.059/0.059 ms

这样,busybox1 容器和 busybox2 容器建立了互联关系,如果你有多个容器之间需要互相连接,推荐使用 Docker Compose。

2:Host 模式

使用 Host 模式的容器会直接使用宿主机的网络栈,容器没有独立的网络命名空间,而是与宿主机共享相同的 IP 地址、端口等网络资源。

[root@bogon ~]# docker run -tid --net=host --name docker_host1 busybox

245b932232681f82eb927bc32f79181538577b98c44f57c9e43771f8c8547c69

由于使用了 Host 模式,容器会直接使用宿主机的网络端口,因此可以直接在宿主机上通过 localhost 访问容器内的服务,使用 ifconfig 命令可以看到容器的网络和宿主机的是一致的。

[root@bogon ~]# docker exec -it docker_host1 sh

/ # ifconfig

br-2171fab71098 Link encap:Ethernet HWaddr 02:42:FD:CB:F4:2E

​    inet addr:172.18.0.1 Bcast:172.18.255.255 Mask:255.255.0.0

​    inet6 addr: fe80::42:fdff:fecb:f42e/64 Scope:Link

​    UP BROADCAST MULTICAST MTU:1500 Metric:1

​    RX packets:1 errors:0 dropped:0 overruns:0 frame:0

​    TX packets:5 errors:0 dropped:0 overruns:0 carrier:0

​    collisions:0 txqueuelen:0

RX bytes:28 (28.0 B) TX bytes:438 (438.0 B)

 

docker0 Link encap:Ethernet HWaddr 02:42:71:08:11:80

​    inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0

​    inet6 addr: fe80::42:71ff:fe08:1180/64 Scope:Link

​    UP BROADCAST MULTICAST MTU:1500 Metric:1

​    RX packets:3192 errors:0 dropped:0 overruns:0 frame:0

​    TX packets:5240 errors:0 dropped:0 overruns:0 carrier:0

​    collisions:0 txqueuelen:0

​    RX bytes:8274623 (7.8 MiB) TX bytes:911741 (890.3 KiB)

 

ens33  Link encap:Ethernet HWaddr 00:0C:29:6F:A6:FA

​    inet addr:192.168.207.131 Bcast:192.168.207.255 Mask:255.255.255.0

​    inet6 addr: fe80::7ef6:a206:d3ad:5f6f/64 Scope:Link

​    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

​    RX packets:122622 errors:0 dropped:0 overruns:0 frame:0

​    TX packets:42535 errors:0 dropped:0 overruns:0 carrier:0

​    collisions:0 txqueuelen:1000

​    RX bytes:149969818 (143.0 MiB) TX bytes:77332399 (73.7 MiB)

 

lo    Link encap:Local Loopback

​    inet addr:127.0.0.1 Mask:255.0.0.0

​    inet6 addr: ::1/128 Scope:Host

​    UP LOOPBACK RUNNING MTU:65536 Metric:1

​    RX packets:72 errors:0 dropped:0 overruns:0 frame:0

​       TX packets:72 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1

RX bytes:6260(6.1 KiB)TX bytes:6260(6.1 KiB)

3:container 模式

Container 模式允许一个容器共享另一个容器的网络命名空间,即两个容器使用相同的网络配置包括 IP 地址、端口等,利用这种模式使得容器共享统一的网络命名空间。

[root@bogon ~]# docker run -tid --name host1 busybox

f4dd88c8a964c228823962f8402df1eb43bda404003899f1ec0dbd4c7a435f82

# 创建host2容器共享host1容器的网络

[root@bogon ~]# docker run -itd --net=container:host1 --name host2 busybox

3cde5380fe5731c074d4ec472117d49760b718884cd4fe36245df852d2e2eaa3

# 查询host1容器的网络

[root@bogon ~]# docker exec -it host1 ifconfig

eth0   Link encap:Ethernet HWaddr 02:42:AC:11:00:02

​     inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0

​     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

​     RX packets:8 errors:0 dropped:0 overruns:0 frame:0

​     TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

​     collisions:0 txqueuelen:0

​     RX bytes:648 (648.0 B) TX bytes:0 (0.0 B)

lo

  Link encap:Local Loopback

  inet addr:127.0.0.1 Mask:255.0.0.0

  UP LOOPBACK RUNNING MTU:65536 Metric:1

  RX packets:0 errors:0 dropped:0 overruns:0 frame:0

  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

  collisions:0 txqueuelen:1

  RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

 

# 查看 host2 容器的网络,确认和 host1 容器的网络一致

[root@bogon ~]# docker exec -it host2 ifconfig

eth0   Link encap:Ethernet HWaddr 02:42:AC:11:00:02

​     inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0

​     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

​     RX packets:8 errors:0 dropped:0 overruns:0 frame:0

​     TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

​     collisions:0 txqueuelen:0

​     RX bytes:648 (648.0 B) TX bytes:0 (0.0 B)

lo

  Link encap:Local Loopback

  inet addr:127.0.0.1 Mask:255.0.0.0

  UP LOOPBACK RUNNING MTU:65536 Metric:1

  RX packets:0 errors:0 dropped:0 overruns:0 frame:0

  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

  collisions:0 txqueuelen:1

  RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

4: None 模式

在 None 模式下,容器只有一个 lo 回环接口,没有任何外部网络连接。这种模式适用于那些不需要网络通信或者需要手动配置网络的场景,例如某些安全敏感的应用程序。

[root@bogon ~]# docker run -itd --net=none --name none01 busybox sh

c78705a0df04bdfb370c106b24eaba173abdf4cee6ee689eadea46191015548a

 

[root@bogon ~]# docker exec -it none01 sh

/ # ifconfig

lo    Link encap:Local Loopback

​     inet addr:127.0.0.1 Mask:255.0.0.0

​     UP LOOPBACK RUNNING MTU:65536 Metric:1

​     RX packets:0 errors:0 dropped:0 overruns:0 frame:0

​     TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

​     collisions:0 txqueuelen:1

​     RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

5: Overlay 模式

Overlay 模式主要用于 Docker Swarm 集群,它允许容器在不同的 Docker 宿主机之间进行通信。它基于 VXLAN(Virtual eXtensible Local Area Network)技术,在物理网络之上创建一个虚拟的覆盖网络。

当容器之间进行通信时,数据包会被封装在 VXLAN 报头中,通过物理网络进行传输。在接收端,VXLAN 报头会被解封装,还原出原始的数据包。

Overlay 网络是分布式的,每个 Docker 宿主机上都有一个网络代理(如 Docker 的 docker_gwbridge)负责管理和转发数据包。

示例:

# 在 Docker Swarm 集群中创建一个 Overlay 网络

docker network create -d overlay my_overlay_network

# 在不同的宿主机上创建服务并连接到 Overlay 网络

docker service create --name my_service --network my_overlay_network nginx

6: Macvlan 模式

在 Macvlan 模式下,Docker 为每个容器分配一个唯一的 MAC 地址,使得容器在网络中看起来像一个独立的物理设备。

容器直接连接到宿主机的物理网络接口,绕过了 docker0 网桥,从而提高了网络性能。容器可以直接与外部网络进行通信,就像一个独立的主机一样。

每个容器都有自己独立的网络配置,与宿主机和其他容器之间相互隔离。

端口映射

Docker 是一个开源的容器化平台,用于构建、运行和管理应用程序。它使用容器来打包应用程序及其依赖项,使得应用程序可以在不同的环境中快速、可靠地运行。在 Docker 中,端口映射是一个重要的特性,它允许容器内部的应用程序与宿主机进行通信。

2:随机映射端口

在使用 docker run 命令创建并启动容器时,可以使用 -P(大写的 P)参数来实现随机端口映射。

运行一个 Nginx 容器,Nginx 默认监听 80 端口。使用以下命令启动容器:

[root@localhost ~]# docker run --rm -d -P nginx

[root@localhost ~]# docker ps -a

 

CONTAINER ID  IMAGE   COMMAND         CREATED     STATUS     PORTS                   NAMES

bc5031ca1c0c  nginx   "/docker-entrypoint...."  3 seconds ago  Up 2 seconds  0.0.0.0:32768->80/tcp, ::1:32768->80/tcp  naughty_haslett

在 docker run --rm 命令中,–rm 是一个组合的选项,并不是 r 和 m 分别代表不同含义,它是一个整体参数,用于控制容器在停止运行后自动删除。

当你在运行容器时添加 --rm 选项,Docker 会在容器退出时自动删除该容器的文件系统和所有相关资源,这样可以避免产生大量不再使用的容器,节省磁盘空间。

3:指定映射端口

docker run 命令用于创建并启动一个新的容器,通过 -p(小写的 p)参数可以指定容器端口到宿主机端口的映射。

(1) 固定端口

假设你要运行一个 Nginx 容器,并将容器的 80 端口映射到宿主机的 8080 端口,可使用以下命令:

[root@localhost ~]# docker run --rm -d -p 8080:80 nginx

需要注意的是,在映射端口时,所使用的 docker 主机上的端口不能与其他容器或程序的端口冲突。否则,容器无法正常创建。

(2) 宿主机随机端口

当使用小写的 -p 参数时,你可以不指定宿主机的具体端口,只给出容器端口,Docker 会自动将容器端口映射到宿主机的一个随机可用端口上。

[root@localhost ~]# docker run --rm -d -p 80 nginx

 

[root@localhost ~]# docker ps

CONTAINER ID IMAGE COMMAND          CREATED    STATUS    PORTS               NAMES

89d94e902ea1 nginx "/docker-entrypoint …"  2 minutes ago Up 2 minutes 0.0.0.0:32769->80/tcp, ::1:32769->80/tcp amazing_banach

87334308e589  nginx  "/docker-entrypoint …"  2 minutes ago  Up 2 minutes  0.0.0.0:32768->80/tcp  sleepy_merkle

6dbc5d8b8ef4  nginx  "/docker-entrypoint …"  2 minutes ago  Up 2 minutes  0.0.0.0:8080->80/tcp  hopeful_chatterjee

 

三:容器互联

在 Docker 环境中,每个容器默认情况下是相互隔离的,它们有自己独立的网络栈。容器互联就是打破这种隔离,让不同容器能够识别彼此并进行网络通信,就像它们处于同一个本地网络中一样。

1: 使用 --link 选项(已逐渐被弃用)

(1) 创建源容器

[root@localhost ~]# docker run -dit --name web01 centos:7

(2) 创建接收容器

[root@localhost ~]# docker run -dit --name web02 --link web01:myweb01 centos:7

(3) 测试容器互联

[root@localhost ~]# docker exec -it web02 /bin/bash

[root@71591dd4a58e /]# cat /etc/hosts

 

127.0.0.1  localhost

::1 localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

172.17.0.2 myweb01 36411a49ce54

172.17.0.3 71591dd4a58e

 

网站公告

今日签到

点亮在社区的每一天
去签到