docker网络
Docker本身的技术依赖于Linux内核虚拟化技术的发展。所以Docker对Linux内核的特性有很强的依赖。
其中Docker使用到的与Linux网络有关的技术分别有:网络名称空间、Veth、Iptables、网桥、路由。
网络名称空间
为了支持网络协议栈的多个实例,Linux在网络协议栈中引入了网络名称空间(Network Namespace),这些独立的协议栈被隔离到不同的命名空间中。处于不同的命名空间的网络协议栈是完全隔离的,彼此之间无法进行网络通信,就好像两个“平行宇宙”。通过这种对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环境,而Docker正是利用这种网络名称空间的特性,实现了不同容器之间的网络隔离。在Linux的网络命名空间内可以有自己独立的Iptables来转发、NAT及IP包过滤等功能。
Linux的网络协议栈是十分复杂的,为了支持独立的协议栈,相关的这些全局变量都必须修改为协议栈私有。最好的办法就是让这些全局变量成为一个Net Namespace变量的成员,然后为了协议栈的函数调用加入一个Namespace参数。这就是Linux网络名称空间的核心。所以的网络设备都只能属于一个网络名称空间。当然,通常的物理网络设备只能关联到root这个命名空间中。虚拟网络设备则可以被创建并关联到一个给定的命名空间中,而且可以在这些名称空间之间移动。
用法 | 含义 |
---|---|
ip netns list | 列出网络命名空间。此命令显示的是 "/var/run/netns" 中的所有网络命名空间。 |
ip netns add NAME | 添加网络命名空间 |
ip [-all] netns delete [NAME] | 删除网络命名空间 |
ip [-all] netns exec [NAME] cmd … | 在指定的网络命名空间中执行命令 |
ip netns set NAME NETNSID | 给网络命名空间分配id |
ip netns identify [PID] | 查看进程的网络命名空间 |
ip netns monitor | 监控对网络命名空间的操作 |
ip netns pids NAME | 查找使用此网络命名空间并将其作为主要网络命名空间的进程。此命令会从 /proc 目录中遍历。 |
#添加并列出network命名空间
[root@docker ~]# ip netns add test01
[root@docker ~]# ip netns add test02
[root@docker ~]# ip netns list
test02
test01
#删除所有network命名空间
[root@docker ~]# ip -all netns delete
[root@docker ~]# ip netns list
Veth设备
引入Veth设备对是为了在不同的网络名称空间之间进行通信,利用它可以直接将两个网络名称空间链接起来。由于要连接的两个网络命名空间,所以Veth设备是成对出现的,很像一对以太网卡,并且中间有一根直连的网线。既然是一对网卡,那么我们将其中一端称为另一端的peer。在Veth设备的一端发送数据时,它会将数据直接发送到另一端,并触发另一端的接收操作。
1.创建Veth设备对
[root@docker ~]# ip link add veth type veth peer name veth001
[root@docker ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:14:00:a2 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:14:00:ac brd ff:ff:ff:ff:ff:ff
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:64:ce:78:66 brd ff:ff:ff:ff:ff:ff
5: veth001@veth: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 6a:f4:72:dd:d8:b4 brd ff:ff:ff:ff:ff:ff
6: veth@veth001: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether ca:99:56:c1:15:e8 brd ff:ff:ff:ff:ff:ff
#生成了两个veth设备, 互为对方的peer。
2.绑定命名空间
[root@docker ~]# ip link set veth001 netns test01
[root@docker ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:14:00:a2 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:14:00:ac brd ff:ff:ff:ff:ff:ff
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:64:ce:78:66 brd ff:ff:ff:ff:ff:ff
6: veth@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether ca:99:56:c1:15:e8 brd ff:ff:ff:ff:ff:ff link-netnsid 0
#已经看不到veth001,需要进入test01命名空间查看
[root@docker ~]# ip netns exec test01 bash
[root@docker ~]# ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth001@if6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 6a:f4:72:dd:d8:b4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
#退出test01命名空间
[root@docker ~]# exit
exit
3.将Veth分配IP
[root@docker ~]# ip netns exec test01 ip addr add 172.16.0.111/20 dev veth001
[root@docker ~]# ip netns exec test01 bash
[root@docker ~]# ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth001@if6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 6a:f4:72:dd:d8:b4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.16.0.111/20 scope global veth001
valid_lft forever preferred_lft forever
#启动veth001
[root@docker ~]# ip netns exec test01 ip link set dev veth001 up
[root@docker ~]# ip netns exec test01 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
7: veth001@if8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
link/ether 46:62:d8:a4:b9:76 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.16.0.111/20 scope global veth001
valid_lft forever preferred_lft forever
4.查看对端Veth设备
[root@docker ~]# ip netns exec test01 ethtool -S veth001
NIC statistics:
peer_ifindex: 8
[root@docker ~]# ip a | grep 8
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
inet6 fe80::20c:29ff:fe14:a2/64 scope link
inet6 fe80::20c:29ff:fe14:ac/64 scope link
link/ether 02:42:64:ce:78:66 brd ff:ff:ff:ff:ff:ff
8: veth@if7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether f2:11:0c:f1:98:77 brd ff:ff:ff:ff:ff:ff link-netnsid 0
5.为对端Veth设备配置IP
[root@docker ~]# ip addr add 172.16.0.112/20 dev veth
[root@docker ~]# ip link set dev veth down
[root@docker ~]# ip link set dev veth up
[root@docker ~]# ping 172.16.0.111
PING 172.16.0.111 (172.16.0.111) 56(84) bytes of data.
64 bytes from 172.16.0.111: icmp_seq=1 ttl=64 time=0.214 ms
64 bytes from 172.16.0.111: icmp_seq=2 ttl=64 time=0.082 ms
[root@docker ~]# ping 172.16.0.112
PING 172.16.0.112 (172.16.0.112) 56(84) bytes of data.
64 bytes from 172.16.0.112: icmp_seq=1 ttl=64 time=0.307 ms
64 bytes from 172.16.0.112: icmp_seq=2 ttl=64 time=0.088 ms
6.删除veth设备(同时在另一个nemespace的设备也被删除了)
#先停止veth001再删除
[root@docker ~]# ip netns exec test01 ip link set dev veth001 down
[root@docker ~]# ip netns exec test01 ip link delete veth001
网桥
Linux 可以支持多个不同的网络,它们之间能够相互通信,就需要一个网桥。 网桥是二层的虚拟网络设备,它是把若干个网络接口“连接”起来,从而报文能够互相转发。网桥能够解析收发的报文,读取目标 MAC 地址的信息,和自己记录的 MAC 表结合,来决定报文的转发目标网口。
网桥设备 brO 绑定了 eth0、 eth1 。对于网络协议械的上层来说,只看得到 brO 。因为桥接是在数据链路层实现的 ,上层不需要关心桥接的细节,于是协议枝上层需要发送的报文被送到 brO ,网桥设备的处理代码判断报文该被转发到 ethO 还是 ethl ,或者两者皆转发。反过来,从 ethO 或从 ethl 接收到的报文被提交给网桥的处理代码,在这里会判断报文应该被转发、丢弃还是提交到协议枝上层。 而有时 ethl 也可能会作为报文的源地址或目的地址 直接参与报文的发送与接收,从而绕过网桥。
1.创建网桥
docker network create [网桥名称]
[root@docker ~]# docker network create old
#参数:
-d : 指定网桥类型。
bridge
host
none
2.查看网桥
docker network ls
#参数:
-f : 过滤网桥
3.删除网桥
docker network rm [网桥的名称]
[root@docker ~]# docker network rm old
#注意:网桥必须是没有任何应用在使用。
4.查看网桥的详细信息
docker inspect [网桥的名称]
[root@docker ~]# docker inspect zzc
[
{
"Name": "zzc",
"Id": "8b3745ae2989a2d3402eb0dbe19d53f951ec1d297e0310ac9eaa97ffed96dd4f",
"Created": "2021-10-26T12:10:38.120689969+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"3ab45509c6a2706536aefa20deec5269e9ed12e83d200d7eb835d7554b3e5eb1": {
"Name": "clever_carson",
"EndpointID": "c376a19ff86d207d4445c96297cb86bf251642555a378f33e5d5f5a3f79b0cf8",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
5.链接上一个容器
docker network connect [OPTIONS] [网桥名称] [容器名称]
#参数:
--alias 为容器添加网络范围的别名
--ip 指定IP地址
--ip6 指定IPv6地址
--link 添加链接到另一个容器
--link-local-ip 添加容器的链接本地地址
1、创建一个subnet的网桥
[root@docker ~]# docker network create --subnet 172.22.0.0/16 test
# --subnet 表示网段的CIDR格式的子网
2、指定IP关联上对应的网桥
[root@docker ~]# docker network connect --ip 172.22.0.10 test nginx
3、将正在运行的容器连接到网络
[root@docker ~]# docker network connect test nginx
4、启动容器时连接到网络
docker run --network=<网桥名称>
[root@docker ~]# docker run -d -it --network=test --name web nginx
f3436ced4d9b81f0fd4b210d84fa7b7927b216f18841812a418dd700e5debc38
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3436ced4d9b nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 80/tcp web
6.断开链接
docker network disconnect [网桥名称] [容器名称]
[root@docker ~]# docker network disconnect test nginx
7.清除所有未被使用到的网桥
[root@docker ~]# docker network prune
#参数:
-f : 免交互删除
8.删除网桥报错
[root@docker ~]# docker network rm test
Error response from daemon: error while removing network: network test id ffdae81a8798efe3063d435eb2dcc944d31e7ca205ef96679c4e8e9ae58a84ed has active endpoints
#查看网桥信息
[root@docker ~]# docker network inspect test
[
{
"Name": "test", #参数一
"Id": "ffdae81a8798efe3063d435eb2dcc944d31e7ca205ef96679c4e8e9ae58a84ed",
"Created": "2021-10-26T15:01:39.89380796+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.22.0.0/16"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"455891260b892202dcc12fbe4bfec2f62f0f47266d0d60fac18ca6b4fb5cd3fb": {
"Name": "nginx", #参数二
"EndpointID": "dbc792bf48714feae45dce93584a5933ae29dc7214dd18d54dcf11c53267a532",
"MacAddress": "02:42:ac:16:00:02",
"IPv4Address": "172.22.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
#记住参数一和参数二,执行以下命令
[root@docker ~]# docker network disconnect test nginx
#删除网桥
[root@docker ~]# docker network rm test
test
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a0e17b29c2ce bridge bridge local
94089d94caa7 host host local
35b1beff62c9 none null local
iptables
在Linux网络协议棋中有一组回调函数挂接点,通过这些挂接点挂接的钩子函数可以在Linux 网络棋处理数据包的过程中对数据包进行 些操作,例如过滤、修改、丢弃等 整个挂接点技术叫作 Netfilter lptables
Netfilter 负责在内核中执行各种挂接的规则,运行在内核模式中:而 lptables 是在用户模式下运行的进程,负责协助维护内核中 Netfilter 的各种规则表 通过 者的配合来实现整个 Linux网络协议战中灵活的数据包处理机制。
设备 | 作用总结 |
---|---|
network namespace | 主要提供了关于网络资源的隔离,包括网络设备、IPv4和IPv6协议栈、IP路由表、防火墙、/proc/net目录、/sys/class/net目录、端口(socket)等。 |
linux Bridge | 功能相当于物理交换机,为连在其上的设备(容器)转发数据帧。如docker0网桥。 |
iptables | 主要为容器提供NAT以及容器网络安全。 |
veth pair | 两个虚拟网卡组成的数据通道。在Docker中,用于连接Docker容器和Linux Bridge。一端在容器中作为eth0网卡,另一端在Linux Bridge中作为网桥的一个端口。 |
Docker网络模式
Docker使用Linux桥接的方式,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
Docker网络模型 | 配置 | 说明 |
---|---|---|
host模式 | –-network=host | 容器和宿主机共享Network namespace。 |
containe模式 | --network=container:ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 |
none模式 | --network=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 |
bridge模式 | --network=bridge | 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。(默认为该模式) |
1.Host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
[root@docker ~]# docker run -d --name web --network host nginx
9b35413bc6b04ee7c4c6d68415e9f53f710346587d558eef05c91f30e7947be4
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b35413bc6b0 nginx "/docker-entrypoint.…" About a minute ago Up About a minute web
455891260b89 nginx:latest "/docker-entrypoint.…" 15 hours ago Up 7 minutes 80/tcp nginx
[root@docker ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1316/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1400/master
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1024/rpcbind
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2573/nginx: master
tcp6 0 0 :::22 :::* LISTEN 1316/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1400/master
tcp6 0 0 :::111 :::* LISTEN 1024/rpcbind
tcp6 0 0 :::80 :::* LISTEN 2573/nginx: master
[root@docker ~]# curl 127.0.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
2.Containe模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
[root@docker ~]# docker run -it --name centos centos bash
[root@8ffae2be2d11 /]#
[root@docker ~]# docker run -d --network "container:centos" --name test nginx
68acbfde3362c2e90caf4b72dad0350829c74db4060e37cd829f67103c0a7f60
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68acbfde3362 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds test
4dc2bf1d4454 centos "bash" 7 minutes ago Up 7 minutes centos
9b35413bc6b0 nginx "/docker-entrypoint.…" 15 minutes ago Up 15 minutes web
455891260b89 nginx:latest "/docker-entrypoint.…" 16 hours ago Up 21 minutes 80/tcp nginx
[root@8ffae2be2d11 /]#
[root@8ffae2be2d11 /]# curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
3.none模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
[root@docker ~]# docker run -it --network none centos bash
[root@57822b977aa4 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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
4.bridge模式
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。
[root@docker ~]# docker network create zzc
8b3745ae2989a2d3402eb0dbe19d53f951ec1d297e0310ac9eaa97ffed96dd4f
[root@docker ~]# docker run -d --network zzc nginx
3ab45509c6a2706536aefa20deec5269e9ed12e83d200d7eb835d7554b3e5eb1
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3ab45509c6a2 nginx "/docker-entrypoint.…" 10 seconds ago Up 10 seconds 80/tcp clever_carson
455891260b89 nginx:latest "/docker-entrypoint.…" 16 hours ago Up 40 minutes 80/tcp nginx
[root@docker ~]# docker run -it --network zzc centos bash
[root@ca1cda1d8f63 /]# curl 127.0.0.1
curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused
[root@ca1cda1d8f63 /]# curl 3ab45509c6a2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
用docker实现部署discuz
#创建网桥
[root@docker ~]# docker network create discuz
#创建mysql容器
[root@docker ~]# docker run -d --network discuz --name mysql -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=discuz mysql:5.7
[root@docker ~]# docker exec -it mysql bash
root@5b56c4f2d36a:/# mysql -uroot -p123
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| discuz |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
#下载php和nginx镜像
[root@docker ~]# docker pull alvinos/php:wordpress-v2
[root@docker ~]# docker pull alvinos/nginx:wordpress-v2
#上传discuz
[root@docker ~]# rz Discuz_X3.4_SC_UTF8_20210926.zip
[root@docker ~]# mkdir /discuz
[root@docker ~]# unzip Discuz_X3.4_SC_UTF8_20210926.zip -d /discuz
[root@docker ~]# chmod -R 777 /discuz/upload/
#配置nginx文件
[root@docker ~]# cat default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
root /usr/share/nginx/html;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
}
#启动php容器
[root@docker ~]# docker run -d --name php --network discuz -v /discuz/upload:/usr/share/nginx/html alvinos/php:wordpress-v2
#启动nginx容器
[root@docker ~]# docker run -d --name nginx --network discuz -v /discuz/upload:/usr/share/nginx/html -v /root/default.conf:/etc/nginx/conf.d/default.conf -p 8090:80 alvinos/nginx:wordpress-v2
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a482aefdc37a alvinos/nginx:wordpress-v2 "/bin/sh -c 'nginx -…" 2 minutes ago Up 2 minutes 443/tcp, 0.0.0.0:8090->80/tcp nginx
32cb74db6133 alvinos/php:wordpress-v2 "php-fpm -F" 5 minutes ago Up 5 minutes 9000/tcp php
5b56c4f2d36a mysql:5.7 "docker-entrypoint.s…" 36 minutes ago Up 36 minutes 3306/tcp, 33060/tcp mysql
#浏览器访问10.0.0.71:8090