经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Docker » 查看文章
Docker初级网络端口映射的配置
来源:jb51  时间:2021/2/19 12:01:24  对本文有异议

端口映射

Docker容器启动之前,如果不进行端口映射,在容器外部是无法通过网络来访问容器内的网络应用和服务。因为容器中常常会运行一些网络应用和服务,如果想在容器外部通过网络来访问容器内的网络应用和服务,就需要对该容器进行端口映射,可以通过docker run命令中的-P-p选项来进行端口映射。

随机端口映射

当通过docker run命令中的-P选项来进行端口映射时,Docker会随机映射一个端口到容器开放的网络端口。

nginx为例,先拉取nginx的镜像。

  1. [root@izoq008ryseuupz ~]# docker image pull nginx
  2. Using default tag: latest
  3. latest: Pulling from library/nginx
  4. 852e50cd189d: Already exists
  5. 571d7e852307: Pull complete
  6. addb10abd9cb: Pull complete
  7. d20aa7ccdb77: Pull complete
  8. 8b03f1e11359: Pull complete
  9. Digest: sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3
  10. Status: Downloaded newer image for nginx:latest
  11. docker.io/library/nginx:latest
  12. [root@izoq008ryseuupz ~]# docker images
  13. REPOSITORY TAG IMAGE ID CREATED SIZE
  14. nginx latest bc9a0695f571 2 days ago 133MB

再以nginx镜像创建容器nginx.1,使用-P选项来进行随机的端口映射。

  1. [root@izoq008ryseuupz ~]# docker run -itd -P --name nginx.1 nginx
  2. 91e3c7ed957f8196fd631eb7bce21acaa96bc253551303ecba2bf193201284ba

通过docker ps -l命令,可以看到本地主机的32775端口被映射到了容器的80端口。此时访问本地主机的32775端口即可访问容器内nginx应用提供的界面。

  1. [root@izoq008ryseuupz ~]# docker ps -l
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 91e3c7ed957f nginx "/docker-entrypoint.…" 17 minutes ago Up 5 seconds 0.0.0.0:32775->80/tcp nginx.1

在这里插入图片描述

通过docker logs nginx.1命令,可以看到刚刚用浏览器访问容器中nginx应用提供的界面的记录。

  1. [root@izoq008ryseuupz ~]# docker logs nginx.1
  2. ...
  3. 111.8.49.168 - - [27/Nov/2020:09:03:53 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36" "-"
  4. 2020/11/27 09:03:53 [error] 21#21: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 111.8.49.168, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "ip:32775", referrer: "http://ip:32775/"
  5. 111.8.49.168 - - [27/Nov/2020:09:03:53 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://ip:32775/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36" "-"

指定端口映射

通过docker run命令中的-p选项来进行指定的端口映射。将本地主机的8083端口映射到容器的80端口。

  1. [root@izoq008ryseuupz ~]# docker run -itd -p 8083:80 --name nginx.2 nginx
  2. 0e62792a194559bf33c2b39f70b64133cb89a48846278ccee651fda68aa6dad1
  3. [root@izoq008ryseuupz ~]# docker ps -l
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 0e62792a1945 nginx "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:8083->80/tcp nginx.2

此时访问本地主机的8083端口即可访问容器内nginx应用提供的界面。

在这里插入图片描述

通过docker logs nginx.2命令,同样可以看到刚刚用浏览器访问容器中nginx应用提供的界面的记录。

  1. [root@izoq008ryseuupz ~]# docker logs nginx.2
  2. ...
  3. 111.8.49.168 - - [27/Nov/2020:09:28:32 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36" "-"
  4. 2020/11/27 09:28:32 [error] 28#28: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 111.8.49.168, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "ip:8083", referrer: "http://ip:8083/"
  5. 111.8.49.168 - - [27/Nov/2020:09:28:32 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://ip:8083/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36" "-"

通过docker ps命令,可以看到之前创建的两个容器的端口映射都是在本地主机的0.0.0.0上。

  1. [root@izoq008ryseuupz ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 0e62792a1945 nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:8083->80/tcp nginx.2
  4. 91e3c7ed957f nginx "/docker-entrypoint.…" 53 minutes ago Up 36 minutes 0.0.0.0:32775->80/tcp nginx.1

网上对于0.0.0.0的解释

首先,0.0.0.0是不能被ping通的。在服务器中,0.0.0.0并不是一个真实的的IP地址,它表示本机中所有的IPV4地址。监听0.0.0.0的端口,就是监听本机中所有IP的端口。

  1. C:\Users\Kaven>ping 0.0.0.0
  2.  
  3. 正在 Ping 0.0.0.0 具有 32 字节的数据:
  4. PING:传输失败。常见故障。
  5. PING:传输失败。常见故障。
  6. PING:传输失败。常见故障。
  7. PING:传输失败。常见故障。
  8.  
  9. 0.0.0.0 Ping 统计信息:
  10. 数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),

指定地址的指定端口映射

可以通过ip:hostPort:containerPort这种格式来进行指定地址的指定端口映射,比如127.0.0.1:8083

  1. [root@izoq008ryseuupz ~]# docker stop nginx.2
  2. nginx.2
  3. [root@izoq008ryseuupz ~]# docker run -itd -p 127.0.0.1:8083:80 --name nginx.3 nginx
  4. a20b18b97fa4bf7576f6a0d769394a390cfb64ad5fc895453b548bf3f75105ca
  5. [root@izoq008ryseuupz ~]# docker ps -l
  6. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  7. a20b18b97fa4 nginx "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 127.0.0.1:8083->80/tcp nginx.3

通过docker inspect nginx.3命令,也可以看到端口映射信息。

  1. "Ports": {
  2. "80/tcp": [
  3. {
  4. "HostIp": "127.0.0.1",
  5. "HostPort": "8083"
  6. }
  7. ]
  8. }

下面这条命令启动不了容器,因为它会默认使用0.0.0.0,报错的原因也正是如此 - 地址已在使用中address already in use

  1. docker run -itd -p 8083:80 --name nginx.4 nginx
  1. [root@izoq008ryseuupz ~]# docker run -itd -p 8083:80 --name nginx.4 nginx
  2. a5211ec678440044945e4d6f16fe59f3ac10367192262768096e7b748ebd027c
  3. docker: Error response from daemon: driver failed programming external connectivity on endpoint nginx.4 (809bed1de2bb89f5d54b5b200503701279a153e60dac08b93e13af8c40a02e36): Error starting userland proxy: listen tcp 0.0.0.0:8083: bind: address already in use.

而下面这条命令却可以启动容器。

  1. docker run -itd -p 127.0.0.2:8083:80 --name nginx.5 nginx
  1. [root@izoq008ryseuupz ~]# docker run -itd -p 127.0.0.2:8083:80 --name nginx.5 nginx
  2. f60dcb586968471e7a8127ccef4cb4e89c4198df748da404f78afaff4afa42de

通过docker ps -a命令,可以看到所有容器的一些信息。

  1. [root@izoq008ryseuupz ~]# docker ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. f60dcb586968 nginx "/docker-entrypoint.…" 19 seconds ago Up 18 seconds 127.0.0.2:8083->80/tcp nginx.5
  4. a5211ec67844 nginx "/docker-entrypoint.…" 2 minutes ago Created nginx.4
  5. a20b18b97fa4 nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 127.0.0.1:8083->80/tcp nginx.3
  6. 0e62792a1945 nginx "/docker-entrypoint.…" 29 minutes ago Exited (0) 7 minutes ago nginx.2
  7. 91e3c7ed957f nginx "/docker-entrypoint.…" About an hour ago Up 58 minutes 0.0.0.0:32775->80/tcp nginx.1

指定地址的随机端口映射

可以通过ip::containerPort这种格式来进行指定地址的随机端口映射,比如127.0.0.1的随机端口。

  1. [root@izoq008ryseuupz ~]# docker run -itd -p 127.0.0.1::80 --name nginx.6 nginx
  2. 396b7d9e64c047187c0391485ba1d275587d86409573e882bc68a9357dfcb6f2
  3. [root@izoq008ryseuupz ~]# docker ps -l
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 396b7d9e64c0 nginx "/docker-entrypoint.…" 9 seconds ago Up 9 seconds 127.0.0.1:32768->80/tcp nginx.6

可以看到Docker将127.0.0.132768端口映射到了容器的80端口,而这个32768端口是由Docker随机指定的。

多个端口映射

使用多个-p选项即可进行多个端口映射。

  1. [root@izoq008ryseuupz ~]# docker run -itd -p 9091:9091 -p 9092:8080 -p 9093:8083 --name nginx.8 nginx
  2. 5ac6438dcc2a2d1b7f668eb10d8285085c396a44f896aae0b3dc09935e4e95eb
  3. [root@izoq008ryseuupz ~]# docker ps -l
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 5ac6438dcc2a nginx "/docker-entrypoint.…" 6 seconds ago Up 4 seconds 80/tcp, 0.0.0.0:9091->9091/tcp, 0.0.0.0:9092->8080/tcp, 0.0.0.0:9093->8083/tcp nginx.8

查看端口映射配置

docker port命令可以查看容器的端口映射配置。

  1. [root@izoq008ryseuupz ~]# docker port nginx.6 80
  2. 127.0.0.1:32768
  3. [root@izoq008ryseuupz ~]# docker port nginx.5 80
  4. 127.0.0.2:8083
  5. [root@izoq008ryseuupz ~]# docker port nginx.3
  6. 80/tcp -> 127.0.0.1:8083
  7. [root@izoq008ryseuupz ~]# docker port nginx.8
  8. 8080/tcp -> 0.0.0.0:9092
  9. 8083/tcp -> 0.0.0.0:9093
  10. 9091/tcp -> 0.0.0.0:9091

Docker容器的端口映射就介绍到这里。

到此这篇关于Docker初级网络端口映射的配置的文章就介绍到这了,更多相关Docker 端口映射内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号