node-index
node-index copied to clipboard
[docker] 入门 - 03 docker网络
Docker网络
主要分为 单机网络 和 多机网络
- 01、基础网络知识
-
02、网络命名空间
- 运行第二个容器
- 创建一个Linux NetWork NameSpace
- 创建一对链接
- 03、bridge
-
04、容器之间的link
- 自己创建一个bridge
- 已经创建好的容器链接到新的bridge上
- 05、容器的端口映射
- 06、host和none
-
07、复杂docker链接示例
- docker安装mysql
- Docker 安装 MongoDB,配置用户名和密码
-
08、多机通信
- 多机通信的实现
- 多级实例
01、基础网络知识
比如笔记本访问别人的网络, 都是通信包访问的, http协议;
略........
路由的概念: 略..........
ip地址和路由:
ip 地址是网络唯一标识 略.........
共有IP 和 私有 IP:
共有IP 是唯一标识, 可以访问internet
私有IP 不可以在互联网使用, 仅供机构内部使用(例如校园网、公司内网)
网络地址转换 NAT:
这个可以理解为一个翻译, 比如作为一个校园网, 有一个或者有几个共有IP地址,
校园内网私有IP 访问外部网络的时候, 先经过 NAT 的转换, NAT 就记住了私有IP和端口, 然后发送请求。
返回成功之后, 回到NAT 就查询是哪个私有地址访问的,然后数据包就回到该访问的私有地址。
Ping(ICMP协议) 和 telnet
Ping:验证IP的可达性
[vagrant@docker-node1 ~]$ ping www.baidu.com
PING www.a.shifen.com (180.97.33.107) 56(84) bytes of data.
64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=1 ttl=63 time=44.0 ms
64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=2 ttl=63 time=91.3 ms
64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=3 ttl=63 time=38.6 ms
64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=4 ttl=63 time=43.5 ms
64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=5 ttl=63 time=55.7 ms
^C
--- www.a.shifen.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4011ms
rtt min/avg/max/mdev = 38.671/54.664/91.302/19.155 ms
telnet: 验证服务的可用性
02、网络命名空间
首先拉取一个 busybox
(非常小的一个linux镜像)
然后运行它: sudo docker run -d --name=test1 busybox /bin/sh -c "while true; do sleep 3600; done"
这个命令就是为了保证这个容器会一直在后台执行
[vagrant@docker-node1 ~]$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3688c4bbc164 busybox "/bin/sh -c 'while t…" 17 seconds ago Up 16 seconds test1
通过交互式命令 进入到容器里面(进入容器内部、进入容器里面): docker exec -it 3688c4bbc164 /bin/sh
在容器里面就可以运行命令了。
首先运行 ip a / ip address
/ # ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
上面就是一个网络的 name space
网络命名空间
在虚拟机本地也可以运行 ip address
命令
[vagrant@docker-node1 ~]$ ip address
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:26:10:60 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
valid_lft 84244sec preferred_lft 84244sec
inet6 fe80::5054:ff:fe26:1060/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:b3:7d:f8 brd ff:ff:ff:ff:ff:ff
inet 192.168.205.10/24 brd 192.168.205.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:feb3:7df8/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ea:c0:4f:9e brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:eaff:fec0:4f9e/64 scope link
valid_lft forever preferred_lft forever
6: veth656a81d@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether fa:eb:9e:97:04:21 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::f8eb:9eff:fe97:421/64 scope link
valid_lft forever preferred_lft forever
上面的也是一个 网络命名空间
两个网络命名空间是不一样的, 而且是完全隔离的。
运行第二个容器
sudo docker run -d --name=test2 busybox /bin/sh -c "while true; do sleep 3600; done"
[vagrant@docker-node1 ~]$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04ac9d71cf7b busybox "/bin/sh -c 'while t…" 5 seconds ago Up 5 seconds test2
3688c4bbc164 busybox "/bin/sh -c 'while t…" 2 days ago Up 28 seconds test1
如果只是想看某一个容器的网络, 就可以直接运行这样的命名: sudo docker exec [container id | name] ip address
例如, 查看第一个容器的IP 地址: sudo docker exec 04ac9d71cf7b ip address
[vagrant@docker-node1 ~]$ docker exec test1 ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
就可以打印出容器的命名空间
查看容器 test2 的命名空空间: docker exec test2 ip address
[vagrant@docker-node1 ~]$ docker exec test2 ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
可以发现 test1 和 test2 的命名空间的区别。
同时可以进入 test1 里面, 是能够ping通test2的。 例如交互式进入test1: [vagrant@docker-node1 ~]$ docker exec -it test1 /bin/sh
/ # ping 127.0.0.3
PING 127.0.0.3 (127.0.0.3): 56 data bytes
64 bytes from 127.0.0.3: seq=0 ttl=64 time=0.077 ms
64 bytes from 127.0.0.3: seq=1 ttl=64 time=0.095 ms
64 bytes from 127.0.0.3: seq=2 ttl=64 time=0.268 ms
64 bytes from 127.0.0.3: seq=3 ttl=64 time=0.243 ms
^
--- 127.0.0.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.077/0.170/0.268 ms
同理, test2 也是可以ping通 test1, 这就说明了, 这两个容器的net work space
是可以相互通信的。
创建一个Linux NetWork NameSpace
查看本机的net work space
: sudo ip netns list
删除本机的net work space
: sudo ip netns delete [nws name]
创建本机的net work space
: sudo ip netns add [nws name]
例如我创建了两个net work space
, 分比为 test1 和 test2。
查看这两个创建好的net work space
的ip: sudo ip netns exec test1 ip address
[vagrant@docker-node1 ~]$ sudo ip netns exec test1 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
会发现有一个本地端口, 端口没有地址,没有up 状态。
输入命令行: ip link
可以查看 链接状态
[vagrant@docker-node1 ~]$ ip link
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 52:54:00:26:10:60 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 08:00:27:b3:7d:f8 brd ff:ff:ff:ff:ff:ff
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 02:42:5e:b4:8e:8d brd ff:ff:ff:ff:ff:ff
6: vethdb34b3d@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
link/ether ea:07:f0:af:67:25 brd ff:ff:ff:ff:ff:ff link-netnsid 0
8: veth9d224da@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default
link/ether 46:18:24:54:94:9e brd ff:ff:ff:ff:ff:ff link-netnsid 1
查看test1 的ip link 状态: sudo ip netns exec test1 ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
如何让 test1 的ip 状态 up 起来: sudo ip netns exec test1 ip link set dev lo up
然后查看link状态
[vagrant@docker-node1 ~]$ sudo ip netns exec test1 ip link
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
发现一个问题, 这个ip 的状态是一个 UNKNOWN
, 而且本机的local 端口也是一个 UNKNOWN
状态。
出现这个情况的原因实际上是以为, ip link 是需要链接起来, 两个 NetWork NameSpace
链接起来之后, 才能是up 状态。 单个端口是没有办法up的。
创建一对链接
通过 ip link
可以查看本机link
添加一对link: sudo ip link add veth-test1 type veth peer name veth-test2
[vagrant@docker-node1 ~]$ sudo ip link add veth-test1 type veth peer name veth-test2
[vagrant@docker-node1 ~]$ ip link
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 52:54:00:26:10:60 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 08:00:27:b3:7d:f8 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:40:85:19:da brd ff:ff:ff:ff:ff:ff
5: veth-test2@veth-test1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 92:b2:ab:20:ed:43 brd ff:ff:ff:ff:ff:ff
6: veth-test1@veth-test2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether b2:28:fa:22:69:34 brd ff:ff:ff:ff:ff:ff
最后一对链接就是新添加的, 没有ip 状态也是down 的。
把 veth-test1
添加到 test1 里面去: sudo ip link set veth-test1 netns test1
[vagrant@docker-node1 ~]$ sudo ip netns exec test1 ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
6: veth-test1@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether b2:28:fa:22:69:34 brd ff:ff:ff:ff:ff:ff link-netnsid 0
执行之后, 发现, 这一条link 添加到 test1 里面去了, 然后本地的 这一条link 不见了。
同理 sudo ip link set veth-test2 natns test2
然后会发现本地, 原来的第五条link 也不见了, 这一天link 被添加到test2 里面去了。
[vagrant@docker-node1 ~]$ sudo ip netns exec test2 ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth-test2@if6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 92:b2:ab:20:ed:43 brd ff:ff:ff:ff:ff:ff link-netnsid 0
这样我们就成功的将这一对link 分别添加到了 两个 netns 中。
会有连个问题, 这两个link 都是down 的状态, 而且没有IP地址。
分别给两个 veth-test
分配地址:
sudo ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1
sudo ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2
但是添加了之后, 查看ip link 依然没有ip 地址
需要先启动这两个link:
sudo ip netns exec test1 ip link set dev veth-test1 up
sudo ip netns exec test2 ip link set dev veth-test2 up
启动完成之后, 就可以通过: sudo ip netns exec test1 ip link
查看link 状态
通过: sudo ip netns exec test1 ip a
这样已经有ip 地址了, 也是up 起来了。 这就说明两个netns 已经完全链接起来了。
[vagrant@docker-node1 ~]$ sudo ip netns exec test1 ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.062 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.064 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.066 ms
64 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=0.065 ms
--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4001ms
rtt min/avg/max/mdev = 0.062/0.064/0.066/0.007 ms
同理 test2 netns 也可以ping 通 test1
03、bridge
上一节说的两个net work space
虽然是完全隔壁的, 但是是可以相互ping 通的。
启动一个容器test1: sudo docker run -d --name=test1 busybox /bin/sh -c "while true; do sleep 3600; done"
查看 docker 的网络: docker network ls
[vagrant@docker-node1 ~]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
dd09816eb1ce bridge bridge local
ad589c9fa968 host host local
0dfc9dbf0808 none null local
其中那个 bridge 就是本机的网络模式
查看docker 网络宿主情况: sudo docker network inspect [network id]
......
"Containers": {
"3688c4bbc1644ec80362ed97fc9159d80f32e62135cdd7e79280c6b7f1aee72f": {
"Name": "test1",
"EndpointID": "d442b1182e6ca30a8107df5ea3c24595cd87423d95ffc215f28070802b187f21",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
......
可以查看本机ip情况
[vagrant@docker-node1 ~]$ 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:26:10:60 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
valid_lft 82167sec preferred_lft 82167sec
inet6 fe80::5054:ff:fe26:1060/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:b3:7d:f8 brd ff:ff:ff:ff:ff:ff
inet 192.168.205.10/24 brd 192.168.205.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:feb3:7df8/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:40:85:19:da brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:40ff:fe85:19da/64 scope link
valid_lft forever preferred_lft forever
8: vetha622445@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 4e:f1:3d:44:92:5b brd ff:ff:ff:ff:ff:ff link-netnsid 2
inet6 fe80::4cf1:3dff:fe44:925b/64 scope link
valid_lft forever preferred_lft forever
其中docker0的 netns 是本机, 那么 test1 container
是如何连接 本机的呢, 就是通过 vetha622445@if7
连接的。
[vagrant@docker-node1 ~]$ docker exec test1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
其中 eth0@if8
和 本机的 vetha622445@if7
实际上是一对link. 通过这样的链接,
就可以链接到主机上面去了, 准确的说是链接到 docker0
的网络上面去了
链接情况的验证: brctl
这个工具是需要安装的: sudo yum install -y bridge-utils
[vagrant@docker-node1 ~]$ brctl show
bridge name bridge id STP enabled i
nterfaces
docker0 8000.0242408519da no vetha622445
如果在创建一个container: sudo docker run -d --name=test2 busybox /bin/sh -c "while true; do sleep 3600; done"
bridge name bridge id STP enabled interfaces
docker0 8000.0242408519da no vetha622445
vethbe1a1b5
就有两个链接了。
两个容器之间的通信:
外网链接:
04、容器之间的link
创建容器之前, 可以给容器一个name, 创建第二个容器的时候, 也给一个name。 两个容器之间可以通过name link 起来, 这样就不需要每次都通过ip link 起来了。
首先启动上一节的test1容器: docker start tset1
重新创建test2 容器, 通过link 的方式:
docker run -d --name=test2 --link test1 busybox /bin/sh -c "while true; do sleep 3600; done"
做了这样的操作之后, 进入test2 的bin/sh: docker exec -it test2 /bin/sh
.
就可以直接ping test1了, 而且还可以ping 通.
[vagrant@docker-node1 ~]$ docker exec -it test2 /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ping test1
PING test1 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.112 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.171 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.150 ms
64 bytes from 172.17.0.2: seq=3 ttl=64 time=0.128 ms
--- test1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.112/0.140/0.171 ms
但是反之, 是ping不通的, 因为link 是单向的。
自己创建一个bridge
命令行: docker network create [OPTIONS] NETWORK [flags]
创建命令: docker network create -d bridge my-bridge
[vagrant@docker-node1 ~]$ docker network create -d bridge my-bridge
c17581e7b9cf62b6a39ab4220313cd9246f9c598f2a1e8a1bf4896cdb8145fc4
[vagrant@docker-node1 ~]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
4159a7a8ff49 bridge bridge local
ad589c9fa968 host host local
c17581e7b9cf my-bridge bridge local
0dfc9dbf0808 none null local
[vagrant@docker-node1 ~]$ brctl show
bridge name bridge id STP enabled interfaces
br-c17581e7b9cf 8000.02425a563121 no
docker0 8000.02422e50fe40 no veth6360140
新建一个container 链接到 新建的 bridge
docker run -d --name=test3 --network my-bridge busybox /bin/sh -c "while true; do sleep 3600; done"
[vagrant@docker-node1 ~]$ brctl show
bridge name bridge id STP enabled interfaces
br-c17581e7b9cf 8000.02425a563121 no veth6467873
docker0 8000.02422e50fe40 no veth6360140
发现新建的就有端口了
可以通过 docker network inspect [bridge id]
查看 链接情况
已经创建好的容器链接到新的bridge上
sudo docker network connect [bridge] [continer]
例如我们希望把 test2
链接到 my-bridge
: docker network connect my-bridge test2
如果是两个容器都link 到自己新建的bridge 上面, 那么就是可以直接默认 --link 在一起。
意思就是, 比如, 我们把test2 和 test3 都链接到了my-bridge
上面, 那么test2和test3 是可以通过ip ping 通。
但是直接ping name 也是可以ping通的。
一个container是可以链接多个 bridge 的。
05、容器的端口映射
如果我们启动一个服务 docker run -d --name web nginx
, 服务已经启动,在docker node 宿主机是可以访问的。 但是外界依然无法访问。
映射本地: docker run -d --name=web -p 80:80 nginx
[vagrant@docker-node1 ~]$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29ac8c1c1d14 nginx "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp web
这个时候外面就可以访问了。
06、host和none
补充一个 docker network option
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
[vagrant@docker-node1 ~]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
4159a7a8ff49 bridge bridge local
ad589c9fa968 host host local
c17581e7b9cf my-bridge bridge local
0dfc9dbf0808 none null local
最后还有两种网络连接一种是 none 还有一种是 host
none 是一种孤立的网络连接方式 这种方式创建的容器, 只能通过 docker exec -it [name/id] /bin/sh
方式连接。没有其他的链接方式了。
host 这种方式创建的容器, 会成为跟住宿机共享所有网络配置, 非常不常用, 会出现网络冲突。
07、复杂docker链接示例
启动一个docker 1 放置node 服务应用, 链接mysql , mysql 启动在docker2
docker安装mysql
<<<<<<< Updated upstream
https://www.cnblogs.com/pwc1996/p/5425234.html
sudo docker run --name pwc-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql
Docker 安装 MongoDB,配置用户名和密码
https://blog.csdn.net/xiaojin21cen/article/details/84994452
======= https://www.cnblogs.com/pwc1996/p/5425234.html
sudo docker pull mysql:5.7
# 启动容器
sudo docker run --name pwc-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql
Stashed changes
sudo docker pull redis
sudo docker run -p 6379:6379 --name redis -v /data/redis/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
-p 6379:6379:把容器内的6379端口映射到宿主机6379端口 -v /data/redis/redis.conf:/etc/redis/redis.conf:把宿主机配置好的redis.conf放到容器内的这个位置中 -v /data/redis/data:/data:把redis持久化的数据在宿主机内显示,做数据备份 redis-server /etc/redis/redis.conf:这个是关键配置,让redis不是无配置启动,而是按照这个redis.conf的配置启动 –appendonly yes:redis启动后数据持久化
08、多机通信
VXLAN
: 多机通信的技术
首先启动两个虚拟机, ip 分别为, 192.168.205.10
和 192.168.205.11
两个虚拟机是可以互相ping 通的。
多机通信的实现
解决出于不同机器上的容器, 是怎么通信的问题。
Overlay 通信方式 , 需要分布式存储
整个方式 请看这里: multi-host-network
多级实例
一个虚拟机部署一个node应用, 另外一个虚拟机部署一个mysql, node链接mysql