1、端口映射实现访问容器
1.从外部访问容器应用
在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的。
当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-p或-P参数来指定端口映射。当使用-P(大写P)标记时,Docker会随机映射一个端口到内部容器开放的网络端口(端口范围在Linux系统使用的端口之外,一般都过万):
[root@docker ~]# docker run -d --name nginx_1 -P nginx:latest f769af3e98478b27b87e008f3ad785e2055da4047442c4a8dcb8f621f810dbea [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f769af3e9847 nginx:latest "nginx -g 'daemon ..." 3 seconds ago Up 2 seconds 0.0.0.0:32768->80/tcp nginx_1 [root@docker ~]#
通过docker ps可以看到nginx_1容器的80端口被映射到本机的32768端口上。访问宿主主机的32768端口就可以访问容器内的应用程序提供的Web界面:

同样,可以通过docker logs命令查看应用信息:
[root@docker ~]# docker logs nginx_1 10.0.0.253 - - [29/Nov/2017:06:25:38 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0" "-" 10.0.0.253 - - [29/Nov/2017:06:25:39 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0" "-" 2017/11/29 06:25:39 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.0.0.253, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "10.0.0.31:32768" 10.0.0.253 - - [29/Nov/2017:06:25:39 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0" "-" 2017/11/29 06:25:39 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.0.0.253, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "10.0.0.31:32768" 10.0.0.253 - - [29/Nov/2017:06:26:55 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" "-" 10.0.0.253 - - [29/Nov/2017:06:26:56 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://10.0.0.31:32768/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" "-" 2017/11/29 06:26:56 [error] 5#5: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.0.0.253, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "10.0.0.31:32768", referrer: "http://10.0.0.31:32768/" [root@docker ~]#
-p(小写p)可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。支持的格式有:IP:HostPort:ContainerPort | IP::ContainerPort | HostPort:ContainerPort 。
2.映射所有接口地址
使用HostPort:ContainerPort格式将本地的5000端口映射到容器的5000端口:
[root@docker ~]# docker run -itd -p 5000:5000 --name nginx_2 nginx:latest 5bdca2bde33d7db72861399ca49e82f0d209d13289d20b181843da5b10e6f2d3 [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5bdca2bde33d nginx:latest "nginx -g 'daemon ..." 8 seconds ago Up 7 seconds 80/tcp, 0.0.0.0:5000->5000/tcp nginx_2 f769af3e9847 nginx:latest "nginx -g 'daemon ..." 15 minutes ago Up 15 minutes 0.0.0.0:32768->80/tcp nginx_1 [root@docker ~]#
此时默认会绑定本地所有接口上的所有地址。多次使用-p参数可以绑定多个端口:
[root@docker ~]# docker run -itd -p 3000:2700 -p 2389:8863 --name nginx_3 nginx:latest 65fbfbe9761eb5146501311016d681f210b1891ca5f5af62dc978ad6f2a22750 [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 65fbfbe9761e nginx:latest "nginx -g 'daemon ..." 3 seconds ago Up 2 seconds 80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp nginx_3 5bdca2bde33d nginx:latest "nginx -g 'daemon ..." 2 minutes ago Up 2 minutes 80/tcp, 0.0.0.0:5000->5000/tcp nginx_2 f769af3e9847 nginx:latest "nginx -g 'daemon ..." 18 minutes ago Up 18 minutes 0.0.0.0:32768->80/tcp nginx_1 [root@docker ~]#
3.映射到指定地址的指定端口
可以使用IP:HostPort:ContainerPort格式指定映射使用一个特定地址:
[root@docker ~]# docker run -itd -p 10.0.0.31:89:8081 --name nginx_4 nginx:latest 16a476837222d413926053e1c8175c993b0495732073fbc6251dfd4696db8242 [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 16a476837222 nginx:latest "nginx -g 'daemon ..." 4 seconds ago Up 3 seconds 80/tcp, 10.0.0.31:89->8081/tcp nginx_4 65fbfbe9761e nginx:latest "nginx -g 'daemon ..." 2 minutes ago Up 2 minutes 80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp nginx_3 5bdca2bde33d nginx:latest "nginx -g 'daemon ..." 5 minutes ago Up 5 minutes 80/tcp, 0.0.0.0:5000->5000/tcp nginx_2 f769af3e9847 nginx:latest "nginx -g 'daemon ..." 20 minutes ago Up 20 minutes 0.0.0.0:32768->80/tcp nginx_1 [root@docker ~]#
4.映射到指定地址的任意端口
使用IP::ContainerPort格式绑定本机的任意端口到容器的指定端口:
[root@docker ~]# docker run -itd -p 10.0.0.31::8082 --name nginx_5 nginx:latest 3436fd5fbdca6529c70c664f42edfd10d51edb0fb541b096b47c9b168887b2ca [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3436fd5fbdca nginx:latest "nginx -g 'daemon ..." 2 seconds ago Up 2 seconds 80/tcp, 10.0.0.31:32769->8082/tcp nginx_5 16a476837222 nginx:latest "nginx -g 'daemon ..." 2 minutes ago Up 2 minutes 80/tcp, 10.0.0.31:89->8081/tcp nginx_4 65fbfbe9761e nginx:latest "nginx -g 'daemon ..." 4 minutes ago Up 4 minutes 80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp nginx_3 5bdca2bde33d nginx:latest "nginx -g 'daemon ..." 7 minutes ago Up 7 minutes 80/tcp, 0.0.0.0:5000->5000/tcp nginx_2 f769af3e9847 nginx:latest "nginx -g 'daemon ..." 22 minutes ago Up 22 minutes 0.0.0.0:32768->80/tcp nginx_1 [root@docker ~]#
容器启动后,本机会随机自动分配一个未被占用的端口。
5.查看映射端口配置
使用docker port命令来查看当前映射的端口配置,也可以查看绑定的地址
[root@docker ~]# docker port nginx_1 80/tcp -> 0.0.0.0:32768 [root@docker ~]# docker port nginx_2 5000/tcp -> 0.0.0.0:5000 [root@docker ~]# docker port nginx_3 2700/tcp -> 0.0.0.0:3000 8863/tcp -> 0.0.0.0:2389 [root@docker ~]# docker port nginx_4 8081/tcp -> 10.0.0.31:89 [root@docker ~]# docker port nginx_5 8082/tcp -> 10.0.0.31:32769 [root@docker ~]#
注意:
容器有自己的内部网络和IP地址,使用docker inspect +容器ID可以获取容器的具体信息。
2、互联机制实现便捷访问
容器的互联是一种让多个容器中应用进行快速交互的方式,它会在源和接收容器之间建立连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。
1.自定义容器命名
连接系统依据容器的名称来执行。因此,首先要给容器定义一个简单好记的名字

