(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