## 1.容器之間通信原理。

>圖中不是veth 而是eth.
> 所以兩個容器之間是可以相互訪問的。
> 容器也是可以訪問外網的。
* 查看容器網絡
```
[root@VM_0_11_centos ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8b6bb29854ad bridge bridge local
ef67345c3edf host host local
fdec26c25201 none null local
```
> 容器是鏈接bridge網絡的。
* 在宿主機運行ip a命令
```
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:46:7d:24:3c brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global docker0
valid_lft forever preferred_lft forever
19: veth269b564@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether d6:cf:71:81:0c:f7 brd ff:ff:ff:ff:ff:ff link-netnsid 1
33: veth63f619c@if32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether ce:31:7b:fb:f0:f9 brd ff:ff:ff:ff:ff:ff link-netnsid 0
37: veth8c78dc6@if36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether fe:9b:91:60:65:a5 brd ff:ff:ff:ff:ff:ff link-netnsid 2
```
* 因為我啟動了三個容器,所以有三個eth連在docker0上。
## 2.容器之間link
* 運行兩個容器,進入查看ip
```
[root@VM_0_11_centos ~]# docker exec -it brave_pike /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
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
36: eth0@if37: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:04 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.4/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ping www.baidu.com
PING www.baidu.com (180.101.49.11): 56 data bytes
64 bytes from 180.101.49.11: seq=0 ttl=47 time=7.548 ms
64 bytes from 180.101.49.11: seq=1 ttl=47 time=7.662 ms
```
```
[root@VM_0_11_centos ~]# docker run -itd busybox /bin/sh
a063a351dd9193c5845acd64ee65f4d26a3959ec8a605311a90269cfad0cf4d4
[root@VM_0_11_centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a063a351dd91 busybox "/bin/sh" 26 seconds ago Up 24 seconds amazing_dewdney
0543cb9b4df1 busybox "/bin/sh" 9 hours ago Up 9 hours brave_pike
09342d7e903d bizzbee/centos-in-vim "/bin/bash" 11 hours ago Up 11 hours focused_hertz
30bc495d1944 bizzbee/python-flask-python3.7 "python app.py" 2 days ago Up 2 days 0.0.0.0:5000->5000/tcp loving_euclid
[root@VM_0_11_centos ~]# docker exec -it amazing_dewdney /bin/sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
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
38: eth0@if39: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:05 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.5/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
```
> 他們互相是可以用ip ping通的。原因上面說了。
> 但是他們不能用名字ping通。如果要用名字ping通。啟動時要加link參數。
* 刪掉一個容器,重新啟動一個,link到另一個容器。
```
[root@VM_0_11_centos ~]# docker run -itd --link brave_pike busybox /bin/sh
b30821e691f5398971524880abc3e334fd2c6e1bdabbf3096aa932f758679af4
[root@VM_0_11_centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b30821e691f5 busybox "/bin/sh" 2 seconds ago Up 1 second blissful_cori
0543cb9b4df1 busybox "/bin/sh" 9 hours ago Up 9 hours brave_pike
09342d7e903d bizzbee/centos-in-vim "/bin/bash" 11 hours ago Up 11 hours focused_hertz
30bc495d1944 bizzbee/python-flask-python3.7 "python app.py" 2 days ago Up 2 days 0.0.0.0:5000->5000/tcp loving_euclid
```
* 創建成功后進入新創建的容器。
```
[root@VM_0_11_centos ~]# docker exec -it blissful_cori /bin/sh
ping brave_pike
PING brave_pike (172.18.0.4): 56 data bytes
64 bytes from 172.18.0.4: seq=0 ttl=64 time=0.106 ms
64 bytes from 172.18.0.4: seq=1 ttl=64 time=0.069 ms
64 bytes from 172.18.0.4: seq=2 ttl=64 time=0.076 ms
```
* 成功了。
## 3.容器端口映射
> 只需要啟動容器的時候加上-p參數,映射到宿主機的端口。
```
docker run -p 5000:5000 bizzbee/python-flask-python3.7
```
* 以上把容器的5000端口到宿主機5000端口。