仅需2小时-让你轻松学会使用docker-网络管理篇(6)

Docker 网络很重要,重要的,我们在容器中部署的所有东西都依赖于网络才能工作。

端口映射

默认情况下,容器和宿主机之间网络是隔离的,我们可以通过端口映射的方式,将容器中的端口,映射到宿主机的某个端口上。这样我们就可以通过 宿主机的ip+port的方式来访问容器里的内容

端口映射的种类

随机映射 -P(大写)

指定映射 -p(小写) 宿主机端口:容器端口

注意:生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突,不管哪种映射都会影响性能,因为涉及到映射。

随机映射实践

默认随机映射

命令格式
1
docker run -d -P [镜像名称]
命令演示
启动一个nginx镜像
1
2
Tony-iMac:diandian_blog tony$ docker run -d -P nginx
ed36e66a2b40146fa006cc0b4d0258ef27471645c672c5171d241a625daf6499
查看容器运行状态
1
2
3
Tony-iMac:diandian_blog tony$ docker ps 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed36e66a2b40 nginx "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 0.0.0.0:32768->80/tcp elated_hopper

从运行状态可以看出宿主机的32768倍映射到了容器的80端口。

-P 动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动随机选择,但是如果连续启动多个容器的话,则下一个容器的端口默认是当前容器占用端口号+1

宿主机访问测试

在宿主机浏览器访问http://localhost:32768或127.0.0.1:32768,甚至是宿主机ip:32768,y因为映射的ip是0.0.0.0。效果如下

指定主机随机映射

命令格式
1
docker run -d -p [宿主机ip]::[容器端口] --name [容器名称] [镜像名称]
命令演示
启动一个nginx镜像

并且指定了宿主机的ip

1
2
Tony-iMac:diandian_blog tony$ docker run -d -p 192.168.10.184::80 --name mynginx nginx
bf7e3fa9a968443fa716874781ed94a65349e2fa3a8e60a339f9d69ff8c1cfda
查看容器运行状态
1
2
3
Tony-iMac:diandian_blog tony$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf7e3fa9a968 nginx "/docker-entrypoint.…" 4 seconds ago Up 2 seconds 127.0.0.1:32768->80/tcp mynginx

可以看到映射的ip不在是0.0.0.0,而是127.0.0.1了

宿主机访问

此时使用宿主机ip加端口,可以正常访问nginx容器,而是用localhost或者127.0.0.1均无法访问该nginx了。

指定映射实践

指定端口映射

命令格式
1
docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字] [镜像名称]

注意,如果不指定宿主机ip的话,默认使用0.0.0.0,容器端口必须清除,而且必须写出来

命令演示
运行容器并制定映射端口

给容器一个指定的访问端口8999

1
docker run -d -p 8999:80 --name mynginx nginx
查看新容器ip
1
2
Tony-iMac:diandian_blog tony$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mynginx
172.17.0.2
进入容器查看ip
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Tony-iMac:diandian_blog tony$ docker exec -it mynginx /bin/bash
root@b815ec249737:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 6160 bytes 9012134 (8.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3296 bytes 179493 (175.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
查看端口映射
1
2
3
Tony-iMac:diandian_blog tony$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b815ec249737 nginx "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:8999->80/tcp mynginx
查看宿主机开启端口

我这里宿主机是mac,linux命令还是常用的netstat -tunlp。

1
2
Tony-iMac:diandian_blog tony$ lsof -n -P -i TCP -s TCP:LISTEN |grep docke
com.docke 731 tony 41u IPv6 0x26cc22f287cb69ed 0t0 TCP *:8999 (LISTEN)
浏览器访问

不管是用宿主机ip,或者localhost和127.0.0.1都可以正常访问docker中应用了。

多端口映射

命令格式
1
docker run -d -p [宿主机端口1]:[容器端口1]  -p [宿主机端口2]:[容器端口2] --name [容器名称] [镜像名称]
命令演示
运行容器并开启多端口映射
1
2
Tony-iMac:diandian_blog tony$ docker run -d -p 6868:443 -p 9899:80 --name myos nginx
f099f241cf875bcb829dfd0a28644adee9aed9bdc7d0152cd3e075be34a466be
查看容器状态
1
2
3
Tony-iMac:diandian_blog tony$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f099f241cf87 nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:9899->80/tcp, 0.0.0.0:6868->443/tcp myos