Docker网络操作

查看docker网络接口信息

命令ifconfig(命令输出详解在之前的博文中介绍过)
[root@VM_116_112_centos ~]# ifconfig
docker0: flags=4163 mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:4c:1c:ed:53 txqueuelen 0 (Ethernet)
RX packets 36810 bytes 2123908 (2.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 49339 bytes 68854258 (65.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

PS:注意一点docker0这个网络接口,是docker默认分配的,它的IP地址属于 172.16.0.0—172.31.255.255 的私有IP地址。

expose Docker的网络端口

当我们在docker上运行网络应用,我们需要在外部访问docker中运行的应用,利用端口映射的方式来将宿主机上空闲的端口映射到容器中对外开放的端口。一般的方式是在运行docker run命令时添加-p或者-P来实现的。
-P:宿主机会为应用随机分配一个空闲的端口号,映射到容器对外开放的端口。从而向网络暴露docker的端口。
接下来我们用一个例子来演示一下:
这个例子我们需要用到docker hub上的名为training/webapp的镜像。
docker search training/web
[root@VM_116_112_centos gitDockerfile]# docker search training/webapp
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
training/webapp 46 [OK]
dcransto/training-webapp This is a training webapp 0 [OK]
dilam/webapp-training Docker Class training 0 [OK]
amouat/webapp-training 0 [OK]
zbbfufu/training-webapp 0
选择第一个
docker run -d -P -name=webapp training/web python app.py
运行容器
docker ps查看容器信息
[root@VM_116_112_centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ff3ccabdd209 training/webapp "python app.py" 7 seconds ago Up 4 seconds 0.0.0.0:32770->5000/tcp webapp

关注这个0.0.0.0:32770->5000/tcp,docker将宿主机上的32770端口映射到容器的对外开放的5000上。并且遵循了tcp协议。
[root@VM_116_112_centos ~]# docker logs -f webapp
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
查看日志可以看到客户端对服务器的请求。

-p:可以指定宿主机上的端口映射到容器端口上。
格式分为3种:
1. ip:hostPort:containerPort
2. ip::containerPort
3. hostPort:containerPort
举个例子
[root@VM_116_112_centos ~]# docker run -d -p 80:5000 training/webapp python app.py
4d2f1c8cd7db560eefc581e6cb3f8172925edf8594f63341183083bba4b3795f
docker: Error response from daemon: driver failed programming external connectivity on endpoint sharp_wilson (0eada8fb582eb2f1d0ad33cf9b64e2d4b2c736af0b46b8832b5df580b6f09827): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use.

这个例子将宿主机上的80端口映射到容器的5000上,但是由于我的宿主机上的80端口被nginx占用,所以出现了报错。
再试一次在5000端口的
[root@VM_116_112_centos ~]# docker run -d -p 5000:5000 training/webapp python app.py
d21c8bde96230a59b88a2671e042045392d9238268800437af6b677b28e29036
[root@VM_116_112_centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d21c8bde9623 training/webapp "python app.py" 7 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp tiny_carson

这次创建成功了。
docker port 容器名 容器内端口号可以查询相对应的宿主机的端口号。
接下来再举几个例子:
1. docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
77822a8854743c1ea1aee107e1dbd406c6983460462c787fa908e98d0e114704
[root@VM_116_112_centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77822a885474 training/webapp "python app.py" 5 seconds ago Up 3 seconds 127.0.0.1:5000->5000/tcp gigantic_keller
在宿主机的回环地址上的5000端口映射到容器的对外开放的端口5000上。
2. [root@VM_116_112_centos ~]# docker run -d -p 127.0.0.1::5000 training/webapp python app.py
478e47aeffedd21e6ee8aa50243a35413ff38f763ab2fc5df3c7b350a0273803
[root@VM_116_112_centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
478e47aeffed training/webapp "python app.py" 6 seconds ago Up 4 seconds 127.0.0.1:32768->5000/tcp reverent_panini
指定本地回环地址的随机的空闲端口映射到容器的5000
3. [root@VM_116_112_centos ~]# docker run -d -p 5000:5000 -p 4000:80 training/webapp python app.py
ee27dfc51fd0e4331b52a8e69c40920352c9f18dd138485d5019d2db8a46d579
[root@VM_116_112_centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee27dfc51fd0 training/webapp "python app.py" 4 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp, 0.0.0.0:4000->80/tcp grave_mcclintock
暴露多个端口,一一对应。

查看网络配置

docker inspect --format '{{.NetworkSettings}}' 容器ID
输出{{ a38f47ab450b59e12a04d202de4a2524971b4b513a246637d1e2dd04ab2cd121 false 0 map[5000/tcp:[{0.0.0.0 5000}] 80/tcp:[{0.0.0.0 4000}]] /var/run/docker/netns/a38f47ab450b [] []} {7dc55cd4714f43424b5cd80e5be4c9f7100179cb8bdf20e181ad34bd178f1b5e 172.17.0.1 0 172.17.0.2 16 02:42:ac:11:00:02} map[bridge:0xc8200b8780]}

这样看的好不直观。
docker inspect 容器ID
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "a38f47ab450b59e12a04d202de4a2524971b4b513a246637d1e2dd04ab2cd121",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"5000/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "5000"
}
],
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "4000"
}
]
},
在输出中找到这段有关的

如果你只想查看容器IP地址
docker inspect --format '{{.NetworkSettings.IPAddress}}' 容器ID
例如
[root@VM_116_112_centos ~]# docker inspect --format '{{.NetworkSettings.IPAddress}}'docker ps -q
172.17.0.2

我们可以ping一下
[root@VM_116_112_centos ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.045 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.103 ms
网络可达。

你可能感兴趣的:(docker)