网站备案之后,怎样弄一个自己的网站,电商网站开发视频教程,应式网站Docker 容器网络及其配置说明 docker容器网络docker的4种网络模式bridge 模式container模式host 模式none 模式应用场景 docker 容器网络配置Linux 内核实现名称空间的创建创建 Network Namespace操作 Network Namespace 转移设备veth pair创建 veth pair实现 Network Namespac… Docker 容器网络及其配置说明 docker容器网络docker的4种网络模式bridge 模式container模式host 模式none 模式应用场景 docker 容器网络配置Linux 内核实现名称空间的创建创建 Network Namespace操作 Network Namespace 转移设备veth pair创建 veth pair实现 Network Namespace 间通信 四种网络模式配置bridge 模式配置none 模式配置container 模式配置host 模式配置 容器的常用操作查看容器的主机名在容器启动时注入主机名手动指定容器要使用的DNS开放容器端口自定义 docker0 网桥的网络属性信息创建新网络使用新创建的自定义桥来创建容器 docker容器网络
Docker在安装后自动提供3种网络, 可以使用 docker network ls 命令查看
[rootMaster ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1924254a040a bridge bridge local
13346f3bc032 host host local
c41bdf0688fe none null localDocker使用 Linux 桥接, 在宿主机虚拟一个 Docker 容器网桥(docker0) , Docker 启动一个容器时会根据 Docker 网桥的网段分配给容器一个 IP 地址, 称为 Container-IP, 同时 Docker 网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥, 这样容器之间就能够通过容器的 Container-IP 直接通信。
docker的4种网络模式
网络模式配置说明host–network host容器和宿主机共享Network namespacecontainer–network container:NAMEORID容器和另外一个容器共享Network namespacenone–network none容器有独立的Network namespace但并没有对其进行任何网络设置如分配veth pair和网桥连接配置IP等bridge–networkbridge默认模式 bridge 模式
当 Docker 进程启动时, 会在主机上创建一个名为 docker0 的虚拟网桥, 此主机上启动的 Docker 容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似, 这样主机上的所有容器就通过交换机连在了一个二层网络中。
从 docker0 子网中分配一个IP给容器使用, 并设置 docker0 的IP地址为容器的默认网关。在主机上创建一对虚拟网卡 veth pair设备Docker将 veth pair 设备的一端放在新创建的容器中并命名为 eth0(容器的网卡)另一端放在主机中以 vethxxx 这样类似的名字命名并将这个网络设备加入到 docker0 网桥中。可以通过 brctl show 命令查看。
bridge 模式是 docker的默认网络模式不写 --network 参数就是 bridge 模式。使用 docker run -p 时docker实际是在 iptables 做了 DNAT 规则实现端口转发功能。可以使用 iptables -t nat -vnL 查看。
bridge 模式如下图所示 假设上图的 Container2 中运行了一个nginx大家来想几个问题
同主机间两个容器间是否可以直接通信比如在 Container1 上能不能直接访问到 Container2 的 nginx 站点在宿主机上能否直接访问到 Container2 的 nginx战点在另一台主机上如何访问 node1 上的这个nginx站点呢 DNAT发布
Docker网桥是宿主机虚拟出来的并不是真实存在的网络设备外部网络是无法寻址到的这也意味着外部网络无法通过直接通过 Container-IP访问到容器。如果容器希望外部访问能够访问到可以通过映射容器端口到宿主主机(端口映射)即docker run 创建容器时候通过 -p 或 -P参数来启用访问容器的时候就通过【宿主机 IP】:【容器端口】访问容器。
container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace而不是和宿主机共享。新创建的容器不会创建自己的网卡、配置自己的IP而是和一个指定的容器共享IP、端口范围等。同样两个容器除了网络方面其它的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过IO网卡设备通信。
host 模式
如果启动容器的时候使用host模式那么这个容器将不会获得一个独立的 Network Namespace而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡配置自己的IP等而是使用宿主机的IP和端口。但是容器的其它方面如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信容器内部的服务端口也可以使用宿主机的端口不需要进行NAThost最大的优势就是网络性能比较好但是 docker host上已经使用的端口就不能再使用了网络的隔离性不好。
Host模式如下图所示
none 模式
使用none模式Docker容器拥有自己的 Network Namespace但是并不为 Docker容器进行任何网络配置。也就是说这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下 容器只有IO回环网络没有其它网卡。none模式可以再容器创建时通过 --network none来指定。这种类型的网络没有办法联网封闭的网络能很好的保证容器的安全性。
应用场景
启动一个容器处理数据比如转换数据格式一些后台的计算和处理任务
none 模式如下图所示
[rootMaster ~]# docker network inspect bridge #查看bridge网络的详细配置
[{Name: bridge,Id: 78cf421b5c970fe40d93582e377187001a352e649ed7edd1e7fcd2f8fb28b8a8,Created: 2024-07-01T19:59:06.06380816908:00,Scope: local,Driver: bridge,EnableIPv6: false,IPAM: {Driver: default,Options: null,Config: [{Subnet: 172.17.0.0/16,Gateway: 172.17.0.1}]},Internal: false,Attachable: false,Ingress: false,ConfigFrom: {Network: },ConfigOnly: false,Containers: {1144c912e93254a920172d234311826e8a60f21b475032c6a19d78336597004a: {Name: rancher-2.6.5,EndpointID: b4ddc0d583862afa0da44e3f29f32456d965c6eeb8dbb9e3cfaa30bb3b78e10a,MacAddress: 02:42:ac:11:00:02,IPv4Address: 172.17.0.2/16,IPv6Address: }},Options: {com.docker.network.bridge.default_bridge: true,com.docker.network.bridge.enable_icc: true,com.docker.network.bridge.enable_ip_masquerade: true,com.docker.network.bridge.host_binding_ipv4: 0.0.0.0,com.docker.network.bridge.name: docker0,com.docker.network.driver.mtu: 1500},Labels: {}}
]
docker 容器网络配置
Linux 内核实现名称空间的创建
ip netns 命令 可以借助 ip netns 命令来完成对 Network Namespace 的各种操作。ip netns 命令来自于 iproute 安装包一般系统会默认安装如果没有的话请自行安装。
注意ip netns 命令修改网络配置时需要 sudo 权限。
可以通过 ip netns 命令完成对 Network Namespace 的相关操作可以通过 ip netns help 查看命令帮助信息
[rootMaster ~]# ip netns help
Usage: ip netns listip netns add NAMEip netns set NAME NETNSIDip [-all] netns delete [NAME]ip netns identify [PID]ip netns pids NAMEip [-all] netns exec [NAME] cmd ...ip netns monitorip netns list-id
默认情况下Linux系统中是没有任何 Network Namespace的所以 ip netns list 命令不会返回任何信息。
[rootMaster ~]# ip netns list
[rootMaster ~]# 创建 Network Namespace
通过命令创建一个名为ns0的命名空间
[rootMaster ~]# ip netns list
[rootMaster ~]# ip netns add ns0
[rootMaster ~]# ip netns list
ns0新创建的 Network Namespace 会出现在 /var/run/netns/目录下。如果相同名字的 namespace已经存在命令会报 Cannot create namespace file “/var/run/netns/ns0”: File exists的错误。
[rootMaster netns]# cd /var/run/netns/
[rootMaster netns]# ll
总用量 0
-r--r--r-- 1 root root 0 7月 2 09:07 ns0
[rootMaster netns]# ip netns add ns0
Cannot create namespace file /var/run/netns/ns0: File exists
[rootMaster netns]# 对于每个 Network Namespace 来说它会有自己独立的网卡、路由表、ARP表、iptables等和网络相关的资源。
操作 Network Namespace
ip 命令提供了 ip netns exec 子命令可以在对应的 Network Namespace 中执行命令。
查看新创建 Network Namespace 的网卡信息
[rootMaster ~]# ip netns exec ns0 ip addr
1: lo: LOOPBACK mtu 65536 qdisc noop state DOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
可以看到新创建的 Network Namespace 中会默认创建一个 lo 回环网卡此时网卡处于关闭状态。若尝试ping 该 lo 回环网卡会提示 Network unreachable
[rootMaster ~]# ip netns exec ns0 ping 127.0.0.1
connect: 网络不可达127.0.0.1是默认回环网卡
通过下面的命令启动 lo 回环网卡
[rootMaster ~]# ip netns exec ns0 ip link set lo up
[rootMaster ~]# ip netns exec ns0 ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq1 ttl64 time0.467 ms
64 bytes from 127.0.0.1: icmp_seq2 ttl64 time0.033 ms
64 bytes from 127.0.0.1: icmp_seq3 ttl64 time0.042 ms
64 bytes from 127.0.0.1: icmp_seq4 ttl64 time0.042 ms
64 bytes from 127.0.0.1: icmp_seq5 ttl64 time0.042 ms
64 bytes from 127.0.0.1: icmp_seq6 ttl64 time0.035 ms
^C
--- 127.0.0.1 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5004ms
rtt min/avg/max/mdev 0.033/0.110/0.467/0.159 ms
转移设备
我们可以在不同的 Network Namespace 之间转移设备(如 veth)。由于一个设备只能属于一个 Network Namespace所以转移后在这个 Network Namespace 内就看不到这个设备了。
其中veth 设备属于可转移设备而很多其它设备(如lo、vxlan、ppp、bridge等)是不可以转移的。
veth pair
veth pair 全称是 Virtual Ethernet Pair是一个成对的端口所有从这对端口一端进入的数据包都将从另一端出来反之也是一样。
引入 veth pair 是为了在不同的 Network Namespace 直接进行通信利用它可以直接将两个 Network Namespace 连接起来。
创建 veth pair
[rootMaster ~]# ip link add type veth
[rootMaster ~]# ip a
1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:6e:81:b7 brd ff:ff:ff:ff:ff:ffinet 192.168.75.100/24 brd 192.168.75.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::11a5:f410:75e5:dc1f/64 scope link noprefixroute valid_lft forever preferred_lft forever
3: docker0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue state UP group default link/ether 02:42:2a:a0:38:5a brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:2aff:fea0:385a/64 scope link valid_lft forever preferred_lft forever
4: docker_gwbridge: NO-CARRIER,BROADCAST,MULTICAST,UP mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:f7:0c:15:a6 brd ff:ff:ff:ff:ff:ffinet 172.18.0.1/16 brd 172.18.255.255 scope global docker_gwbridgevalid_lft forever preferred_lft forever
8: veth780a161if7: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 3e:6b:9c:85:f4:b0 brd ff:ff:ff:ff:ff:ff link-netnsid 1inet6 fe80::3c6b:9cff:fe85:f4b0/64 scope link valid_lft forever preferred_lft forever
9: veth0veth1: BROADCAST,MULTICAST,M-DOWN mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether 02:ba:c5:28:3b:cb brd ff:ff:ff:ff:ff:ff
10: veth1veth0: BROADCAST,MULTICAST,M-DOWN mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether 52:8a:6f:41:d6:aa brd ff:ff:ff:ff:ff:ff可以看到此时系统中新增了一对 veth pair将 veth0 和 veth1 两个虚拟网卡连接起来此时这对 veth pair 处于 “未启动” 状态。
实现 Network Namespace 间通信
下面我们利用 veth pair 实现两个不同的 Network Namespace 之间的通信。刚才我们已经创建了一个名为ns0的 Network Namespace下面再创建一个 Network Namespace命名为ns1
[rootMaster ~]# ip netns add ns1
[rootMaster ~]# ip netns list
ns1
ns0然后我们将 veth0 加入到 ns0将 veth1 加入到 ns1
[rootMaster ~]# ip link set veth0 netns ns0
[rootMaster ~]# ip link set veth1 netns ns1
然后我们分别为这对 veth pair 配置上 ip 地址并启用它们
[rootMaster ~]# ip netns exec ns0 ip link set veth0 up
[rootMaster ~]# ip netns exec ns0 ip addr add 192.0.0.1/24 dev veth0
[rootMaster ~]# ip netns exec ns1 ip link set veth1 up
[rootMaster ~]# ip netns exec ns1 ip addr add 192.0.0.2/24 dev veth1
查看这对 veth pair 的状态
[rootMaster ~]# ip netns exec ns0 ip a
1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
9: veth0if10: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether 02:ba:c5:28:3b:cb brd ff:ff:ff:ff:ff:ff link-netnsid 1inet 192.0.0.1/24 scope global veth0valid_lft forever preferred_lft foreverinet6 fe80::ba:c5ff:fe28:3bcb/64 scope link valid_lft forever preferred_lft forever
[rootMaster ~]# ip netns exec ns1 ip a
1: lo: LOOPBACK mtu 65536 qdisc noop state DOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
10: veth1if9: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether 52:8a:6f:41:d6:aa brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 192.0.0.2/24 scope global veth1valid_lft forever preferred_lft foreverinet6 fe80::508a:6fff:fe41:d6aa/64 scope link valid_lft forever preferred_lft forever
从上面可以看出我们已经成功启用了这个 veth pair并为每个 veth 设备分配了对应的 ip 地址。我们尝试在 ns1 中访问 ns0 中的 ip 地址
[rootMaster ~]# ip netns exec ns1 ping 192.0.0.1
PING 192.0.0.1 (192.0.0.1) 56(84) bytes of data.
64 bytes from 192.0.0.1: icmp_seq1 ttl64 time0.726 ms
64 bytes from 192.0.0.1: icmp_seq2 ttl64 time0.109 ms
64 bytes from 192.0.0.1: icmp_seq3 ttl64 time0.037 ms
64 bytes from 192.0.0.1: icmp_seq4 ttl64 time0.118 ms
64 bytes from 192.0.0.1: icmp_seq5 ttl64 time0.262 ms
64 bytes from 192.0.0.1: icmp_seq6 ttl64 time0.064 ms
^C
--- 192.0.0.1 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5001ms
rtt min/avg/max/mdev 0.037/0.219/0.726/0.237 ms
[rootMaster ~]# ip netns exec ns0 ping 192.0.0.2
PING 192.0.0.2 (192.0.0.2) 56(84) bytes of data.
64 bytes from 192.0.0.2: icmp_seq1 ttl64 time0.378 ms
64 bytes from 192.0.0.2: icmp_seq2 ttl64 time0.090 ms
64 bytes from 192.0.0.2: icmp_seq3 ttl64 time0.131 ms
64 bytes from 192.0.0.2: icmp_seq4 ttl64 time0.140 ms
64 bytes from 192.0.0.2: icmp_seq5 ttl64 time0.138 ms
64 bytes from 192.0.0.2: icmp_seq6 ttl64 time0.130 ms
^C
--- 192.0.0.2 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5001ms
rtt min/avg/max/mdev 0.090/0.167/0.378/0.096 ms
可以看到veth pair 成功实现了两个不同 Network Namespace 之间的网络交互。
四种网络模式配置
bridge 模式配置
[rootMaster ~]# docker run -it --name ti --rm busybox
Unable to find image busybox:latest locally
latest: Pulling from library/busybox
5cc84ad355aa: Pull complete
Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
Status: Downloaded newer image for busybox:latest
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03 inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:8 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:656 (656.0 B) TX bytes:0 (0.0 B)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
在创建容器时添加 --network bridge 与不加 --network选项效果是一致的
[rootMaster ~]# docker run -it --name ti --network bridge --rm busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03 inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:6 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:516 (516.0 B) TX bytes:0 (0.0 B)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)/ #
none 模式配置
[rootMaster ~]# docker run -it --name t1 --network none --rm busybox
/ # ifconfig
lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)/ #
container 模式配置
启动第一个容器
[rootMaster ~]# docker run -dit --name b3 busybox
7af0fc0bafe31a7195e1a3a5c194f5cd1d38700fe8d9369f4070c4f683070c1d
[rootMaster ~]# docker exec -it b3 /bin/sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03 inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:8 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:656 (656.0 B) TX bytes:0 (0.0 B)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)/ #
启动第二个容器
[rootMaster ~]# docker run -it --name b2 --rm busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:04 inet addr:172.17.0.4 Bcast:172.17.255.255 Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:8 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:656 (656.0 B) TX bytes:0 (0.0 B)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)/ #
可以看到名为 b2 的容器 IP地址是172.17.0.4 与第一个容器的IP地址不是一样的也就是说并没有共享网络此时如果我们将第二个容器的启动方式改变一下就可以使名为b2的容器IP与b3容器IP一致也即共享IP但不共享文件系统。
[rootMaster ~]# docker run -it --name b2 --rm --network container:b3 busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03 inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:8 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:656 (656.0 B) TX bytes:0 (0.0 B)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)/ #
此时我们在b3容器上创建一个目录
[rootMaster ~]# docker exec -it b3 /bin/sh
/ # mkdir /tmp/data
/ # ls /tmp/
data
/ #
到b2容器上检查/tmp目录会发现并没有这个目录因为文件系统是处于隔离状态仅仅是共享了网络而已。
[rootMaster ~]# docker run -it --name b2 --rm --network container:b3 busybox
/ # ls /tmp/
/ #
/ # 在b2容器上部署一个站点
[rootMaster ~]# docker run -it --name b2 --rm --network container:b3 busybox
/ # ls /tmp/
/ #
/ # echo hello world /tmp/index.html
/ # ls /tmp/
index.html
/ # httpd -h /tmp
/ # netstat -antl
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 :::80 :::* LISTEN
/ #
在 b3 容器上用本地地址去访问此站点
/ # wget -O - -q 172.17.0.3:80
hello world
/ #
host 模式配置
启动容器时直接指明模式为host
[rootMaster ~]# docker run -it --name b2 --rm --network host busybox
/ # ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:00:67:A1:74 inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0inet6 addr: fe80::42:ff:fe67:a174/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:33140 errors:0 dropped:0 overruns:0 frame:0TX packets:37022 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:5200713 (4.9 MiB) TX bytes:55906242 (53.3 MiB)docker_gwbridge Link encap:Ethernet HWaddr 02:42:E9:16:D2:A1 inet addr:172.18.0.1 Bcast:172.18.255.255 Mask:255.255.0.0UP BROADCAST MULTICAST MTU:1500 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)ens33 Link encap:Ethernet HWaddr 00:0C:29:6E:81:B7 inet addr:192.168.75.100 Bcast:192.168.75.255 Mask:255.255.255.0inet6 addr: fe80::11a5:f410:75e5:dc1f/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:184930 errors:0 dropped:0 overruns:0 frame:0TX packets:229473 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:66831055 (63.7 MiB) TX bytes:54247615 (51.7 MiB)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)veth500b5c6 Link encap:Ethernet HWaddr BA:D6:E4:4F:B2:13 inet6 addr: fe80::b8d6:e4ff:fe4f:b213/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:33140 errors:0 dropped:0 overruns:0 frame:0TX packets:37030 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:5664673 (5.4 MiB) TX bytes:55906898 (53.3 MiB)vethf7d0281 Link encap:Ethernet HWaddr 9E:D9:64:0B:01:A4 inet6 addr: fe80::9cd9:64ff:fe0b:1a4/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:8 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:656 (656.0 B)/ #
此时如果我们在这个容器中启动一个http站点我们就可以直接用宿主机的IP直接在浏览器中访问这个容器中的站点了。
容器的常用操作
查看容器的主机名
[rootMaster ~]# docker run -it --name t1 --network bridge --rm busybox
/ # hostname
beff0ad654d4
/ #
在容器启动时注入主机名
[rootMaster ~]# docker run -it --name t1 --network bridge --hostname ljl --rm busybox
/ # hostname
ljl
/ # 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.4 ljl
/ # cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 223.5.5.5
/ # ping www.baidu.com
PING www.baidu.com (39.156.66.18): 56 data bytes
64 bytes from 39.156.66.18: seq0 ttl127 time10.446 ms
64 bytes from 39.156.66.18: seq1 ttl127 time18.426 ms
64 bytes from 39.156.66.18: seq2 ttl127 time13.849 ms
64 bytes from 39.156.66.18: seq3 ttl127 time11.226 ms
64 bytes from 39.156.66.18: seq4 ttl127 time9.571 ms
^C
--- www.baidu.com ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max 9.571/12.703/18.426 ms
/ #
手动指定容器要使用的DNS
[rootMaster ~]# docker run -it --name t3 --network bridge --hostname ljl --dns 114.114.114.114 --rm busybox
/ # cat /etc/resolv.conf
nameserver 114.114.114.114
/ # nslookup -typea www.baidu.com
Server: 114.114.114.114
Address: 114.114.114.114:53Non-authoritative answer:
Name: www.baidu.com
Address: 39.156.66.14
Name: www.baidu.com
Address: 39.156.66.18/ #
手动往 /etc/hosts 文件中注入主机名到IP地址的映射
[rootMaster ~]# docker run -it --name t1 --network bridge --hostname ljl --add-host www.a.com:1.1.1.1 --rm busybox
/ # 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
1.1.1.1 www.a.com
172.17.0.3 ljl
/ #
开放容器端口
执行 docker run 的时候有个 -p 选项可以将容器中的应用端口映射到宿主机中从而实现让外部主机可以通过访问宿主机的某端口来访问容器内应用的目的。
-p 选项能够使用多次其所能够暴露的端口必须是容器确实在监听的端口。
-p 选项的使用格式 -p containerPort将指定的容器端口映射至主机所有地址的一个动态端口-p hostPortcontainerPort将容器端口 containerPort 映射至指定的主机端口 hostPort-p ip containerPort将指定的容器端口 containerPort 映射至主机指定ip的动态端口-p ip hostPort:containerPort将指定的容器端口 containerPort 映射至主机指定ip的端口 hostPort
动态端口指定的是随机端口具体的映射结果可以使用 docker port 命令查看。
[rootMaster ~]# docker run -dit --name web1 -p 192.168.75.100::80 httpd
Unable to find image httpd:latest locally
latest: Pulling from library/httpd
a2abf6c4d29d: Pull complete
dcc4698797c8: Pull complete
41c22baa66ec: Pull complete
67283bbdd4a0: Pull complete
d982c879c57e: Pull complete
Digest: sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Status: Downloaded newer image for httpd:latest
ba9fa833a86cfd08d8d6456bada7da971b921caf856047af4dc8ee7e4ac8af34
[rootMaster ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba9fa833a86c httpd httpd-foreground 7 seconds ago Up 6 seconds 192.168.75.100:32768-80/tcp web1
1942273f5b57 busybox sh About an hour ago Up About an hour t1
1144c912e932 rancher/rancher:v2.6.5 entrypoint.sh 6 months ago Up 22 hours 0.0.0.0:80-80/tcp, 0.0.0.0:443-443/tcp rancher-2.6.5
[rootMaster ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 192.168.75.100:32768 *:*
LISTEN 0 128 *:111 *:*
LISTEN 0 128 [::]:80 [::]:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 128 [::]:443 [::]:*
LISTEN 0 128 [::]:111 [::]:*
[rootMaster ~]#
以上命令执行会一直占用着前端我们新开一个终端连接连接来看一下容器的80端口被映射到了宿主机的什么端口上
[rootMaster ~]# docker port web1
80/tcp - 192.168.75.100:32768由此可见容器的80端口被暴露到了宿主机的 32768 端口上此时我们在宿主机上访问一下这个端口看是否能访问到容器内的站点。
[rootMaster ~]# curl http://192.168.75.100:32768
htmlbodyh1It works!/h1/body/html
iptables防火墙规则将随容器的创建自动生成随容器的删除自动删除规则。
[rootMaster ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 252 packets, 16128 bytes)pkts bytes target prot opt in out source destination 10 520 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCALChain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 37 packets, 2803 bytes)pkts bytes target prot opt in out source destination 1 60 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCALChain POSTROUTING (policy ACCEPT 38 packets, 2863 bytes)pkts bytes target prot opt in out source destination
12192 780K MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0 0 0 MASQUERADE all -- * !docker_gwbridge 172.18.0.0/16 0.0.0.0/0 0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:4430 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:800 0 MASQUERADE tcp -- * * 172.17.0.4 172.17.0.4 tcp dpt:80Chain DOCKER (2 references)pkts bytes target prot opt in out source destination 0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0 0 0 RETURN all -- docker_gwbridge * 0.0.0.0/0 0.0.0.0/0 0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 to:172.17.0.2:4430 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:801 60 DNAT tcp -- !docker0 * 0.0.0.0/0 192.168.75.100 tcp dpt:32768 to:172.17.0.4:80
[rootMaster ~]#
将容器端口映射到指定IP的随机端口
[rootMaster ~]# docker run -dit --name web1 -p 192.168.75.100::80 httpd
201c8aac8bb57a3f111965fdc112385b87e64f22531489d8d7b3631279aeb822
[rootMaster ~]#
查看端口映射情况
[rootMaster ~]# docker port web1
80/tcp - 192.168.75.100:32769
[rootMaster ~]#
自定义 docker0 网桥的网络属性信息
自定义 docker0 网桥的网络属性信息需要修改 /etc/docker/daemon.json 配置文件
[rootMaster ~]# cd /etc/docker
[rootMaster docker]# cat daemon.json
{
exec-opts: [native.cgroupdriversystemd],
registry-mirrors: [https://registry.docker-cn.com,https://s3d6l2fh.mirror.aliyuncs.com],
bip: 192.168.1.5/24
}[rootMaster docker]# systemctl daemon-reload
[rootMaster docker]# systemctl restart docker
[rootMaster docker]#
[rootMaster docker]# vim /lib/systemd/system/docker.service ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375[rootMaster ~]# systemctl daemon-reload
[rootMaster ~]# systemctl restart docker在客户端上像 dockerd 直接传递 -H|–host选项指定要控制哪台主机上的 docker 容器
[rootMaster docker]# docker -H 192.168.75.100:2375 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1144c912e932 rancher/rancher:v2.6.5 entrypoint.sh 6 months ago Up 9 seconds 0.0.0.0:80-80/tcp, 0.0.0.0:443-443/tcp rancher-2.6.5创建新网络
[rootMaster docker]# docker network create ljl -d bridge
05e8748ed4b1ee29a743c9be2799a735685cbd7d8e03e64bcd95df7eb441016f
[rootMaster docker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b7d9764c841e bridge bridge local
cffaf2d0d5bb docker_gwbridge bridge local
13346f3bc032 host host local
05e8748ed4b1 ljl bridge local
c41bdf0688fe none null local
[rootMaster docker]#
创建一个额外的自定义桥区别于 docker0
[rootMaster docker]# docker network create -d bridge --subnet 192.168.2.0/24 --gateway 192.168.2.1 br0
9565553236d3467668fce59761244051b5f53a409f9e9ce9722baaf08b99ff3d
[rootMaster docker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
9565553236d3 br0 bridge local
b7d9764c841e bridge bridge local
cffaf2d0d5bb docker_gwbridge bridge local
13346f3bc032 host host local
05e8748ed4b1 ljl bridge local
c41bdf0688fe none null local
[rootMaster docker]#
使用新创建的自定义桥来创建容器
[rootMaster docker]# docker run -it --name b1 --network br0 busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:C0:A8:02:02 inet addr:192.168.2.2 Bcast:192.168.2.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:12 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:1032 (1.0 KiB) TX bytes:0 (0.0 B)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)/ #
再创建一个容器使用默认的bridge桥
[rootMaster ~]# docker run --name b2 -it busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:C0:A8:01:02 inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:7 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:586 (586.0 B) TX bytes:0 (0.0 B)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)/ #