Docker初级网络端口映射的配置

端口映射

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

随机端口映射

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

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

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

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

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

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

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

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

[root@izoq008ryseuupz ~]# docker logs nginx.1
...
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" "-"
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/"
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端口。

[root@izoq008ryseuupz ~]# docker run -itd -p 8083:80 --name nginx.2 nginx
0e62792a194559bf33c2b39f70b64133cb89a48846278ccee651fda68aa6dad1
[root@izoq008ryseuupz ~]# docker ps -l
CONTAINER ID    IMAGE        COMMAND         CREATED       STATUS       PORTS         NAMES
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应用提供的界面的记录。

[root@izoq008ryseuupz ~]# docker logs nginx.2
...
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" "-"
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/"
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上。

[root@izoq008ryseuupz ~]# docker ps
CONTAINER ID    IMAGE        COMMAND         CREATED       STATUS       PORTS          NAMES
0e62792a1945    nginx        "/docker-entrypoint.…"  7 minutes ago    Up 7 minutes    0.0.0.0:8083->80/tcp   nginx.2
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的端口。

C:\Users\Kaven>ping 0.0.0.0

正在 Ping 0.0.0.0 具有 32 字节的数据:
PING:传输失败。常见故障。
PING:传输失败。常见故障。
PING:传输失败。常见故障。
PING:传输失败。常见故障。

0.0.0.0 的 Ping 统计信息:
  数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),

指定地址的指定端口映射

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

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

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

      "Ports": {
        "80/tcp": [
          {
            "HostIp": "127.0.0.1",
            "HostPort": "8083"
          }
        ]
      }

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

docker run -itd -p 8083:80 --name nginx.4 nginx
[root@izoq008ryseuupz ~]# docker run -itd -p 8083:80 --name nginx.4 nginx
a5211ec678440044945e4d6f16fe59f3ac10367192262768096e7b748ebd027c
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.

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

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

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

[root@izoq008ryseuupz ~]# docker ps -a
CONTAINER ID    IMAGE        COMMAND         CREATED       STATUS           PORTS          NAMES
f60dcb586968    nginx        "/docker-entrypoint.…"  19 seconds ago   Up 18 seconds        127.0.0.2:8083->80/tcp  nginx.5
a5211ec67844    nginx        "/docker-entrypoint.…"  2 minutes ago    Created                       nginx.4
a20b18b97fa4    nginx        "/docker-entrypoint.…"  7 minutes ago    Up 7 minutes        127.0.0.1:8083->80/tcp  nginx.3
0e62792a1945    nginx        "/docker-entrypoint.…"  29 minutes ago   Exited (0) 7 minutes ago               nginx.2
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的随机端口。

[root@izoq008ryseuupz ~]# docker run -itd -p 127.0.0.1::80 --name nginx.6 nginx
396b7d9e64c047187c0391485ba1d275587d86409573e882bc68a9357dfcb6f2
[root@izoq008ryseuupz ~]# docker ps -l
CONTAINER ID    IMAGE        COMMAND         CREATED       STATUS       PORTS           NAMES
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选项即可进行多个端口映射。

[root@izoq008ryseuupz ~]# docker run -itd -p 9091:9091 -p 9092:8080 -p 9093:8083 --name nginx.8 nginx
5ac6438dcc2a2d1b7f668eb10d8285085c396a44f896aae0b3dc09935e4e95eb
[root@izoq008ryseuupz ~]# docker ps -l
CONTAINER ID    IMAGE        COMMAND         CREATED       STATUS       PORTS                                      NAMES
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命令可以查看容器的端口映射配置。

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

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

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

(0)

相关推荐

  • 详解Docker 端口映射与容器互联

    1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-p或-P参数来指定端口映射.当使用-P(大写P)标记时,Docker会随机映射一个端口到内部容器开放的网络端口(端口范围在Linux系统使用的端口之外,一般都过万): [root@docker ~]# docker run -d --name nginx_1 -P nginx:latest

  • Docker 端口映射详细介绍

    Docker 端口映射: 最近抽空,把Docker 端口映射的资料整理了一下,以便后续项目应用,大家也可以参考下. # Find IP address of container with ID <container_id> 通过容器 id 获取 ip $ sudo docker inspect <container_id> | grep IPAddress | cut -d '"' -f 4 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的.此外

  • Docker端口映射实现网络访问的方法

    Docker运行容器之后却发现没IP,没端口,那要如何访问容器呢? 下面我来介绍下docker通过端口映射来实现网络访问 一.从外部访问容器应用 在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的. 当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数指定端口映射. 先来说说p和P吧 -p 可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器 -P 它会随机映射一个端口至容器内部开放的网络端口(范围不详,似乎都上万) 先申明

  • Docker 动态修改容器端口映射的方法

    前言:Docker端口映射往往是Docker Run命令时通过-p将容器内部端口映射到宿主机的指定端口上,一般来说容器的端口所对应的端口是提前确定需要映射的.但是有些情况下不得不需要临时映射端口,例如Docker中运行着MySQL容器,默认端口是不开放的.那么有什么办法可以让运行中的容器暴露指定的端口呢?客官请往下看---> 方法一:更改Docker配置文件(有风险) 通过修改Docker的配置文件来达到我们的目的,一般来说需要修改以下的文件config.v2.json和hostconfig.j

  • docker容器启动后添加端口映射

    概要 网上有许多人在查找关于容器启动后能否进行端口映射的问题.我曾经也问过度娘,很遗憾我没找到.本文就这个问题给出一个解决方法,旨在抛砖引玉.本文的思路是使用iptables的端口转发,这也是docker端口映射内部的实现机制,只不过我是显示地写出来罢了,为的就是让查找这个问题的人对docker的端口映射有一个直观的了解. 结论:容器启动后是可以添加端口映射的,但不建议手工添加,最好使用docker提供的功能. 步骤 创建两个容器并进行了端口映射,结果如图所示: 假如,我start一个容器,其内

  • Docker端口映射的实现

    docker容器在启动的时候,如果不指定端口映射参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的. 亦可使用Dockerfile文件中的EXPOSE指令来配置. 端口映射可使用-p.-P来实现: -p指定要映射的端口,一个指定端口上只可以绑定一个容器 -P将容器内部开放的网络端口随机映射到宿主机的一个端口上 端口映射支持的格式: ip:hostport:containerport #指定ip.指定宿主机port.指定容器port ip::containerport #指定ip.未指定

  • Docker学习笔记之Docker端口映射

    最近在学习docker,今天了解了Docker端口映射,给自己留个小笔记,也分享给大家 为什么要端口映射? 在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部程序是无法访问虚拟机的,因为没有端口. 端口映射的指令是什么? docker指令:docker run -p ip:hostPort:containerPort redis 使用-p参数会分配宿主机的端口映射到虚拟机. IP表示主机的IP地址. hostPort表示宿主机的端口. containerPort表示虚拟机的端口. 支持的格

  • 运行中的docker容器端口映射如何修改详解

    前言 在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设置,让你修改指定端口映射规则.那么这种情况我们该怎么处理呢?今天Docker君教你如何修改运行中的docker容器的端口映射? 方法一:删除原有容器,重新建新容器 这个解决方案最为简单,把原来的容器删掉,重新建一个.当然这次不要忘记加上端口映射. 优缺点:优点是简单快捷,在测试环境使用较多.缺

  • docker端口映射及外部无法访问问题

    docker容器内提供服务并监听8888端口,要使外部能够访问,需要做端口映射. docker run -it --rm -p 8888:8888 server:v1 此时出现问题,在虚机A上部署后,在A内能够访问8888端口服务,但是在B却不能访问. 这应该是由于请求被拦截. 一.查看firewall-cmd --state 如果输出的是"not running"则FirewallD没有在运行,且所有的防护策略都没有启动,那么可以排除防火墙阻断连接的情况了. 如果输出的是"

  • Docker初级网络端口映射的配置

    端口映射 Docker容器启动之前,如果不进行端口映射,在容器外部是无法通过网络来访问容器内的网络应用和服务.因为容器中常常会运行一些网络应用和服务,如果想在容器外部通过网络来访问容器内的网络应用和服务,就需要对该容器进行端口映射,可以通过docker run命令中的-P或-p选项来进行端口映射. 随机端口映射 当通过docker run命令中的-P选项来进行端口映射时,Docker会随机映射一个端口到容器开放的网络端口. 以nginx为例,先拉取nginx的镜像. [root@izoq008r

  • Docker容器修改端口映射的实现

    目录 可解决问题如下 解决方案 可解决问题如下 (1) 在不删除现有容器的情况下, 修改原有容器的端口映射; (2) 创建容器的时候指定了一个端口映射, 但是创建之后的容器存在多个端口映射; 具体描述 1 首先创建一个容器并指定端口映射; sudo docker run -it --name forge_restful -v /data01/wangxiaofei01/project/restful/wanmingTask/forge_restful_api -p 8076:8076 -d 01

  • 详解Docker修改容器端口映射的方法

    直接解决方法 具体可参考Stack Overflow链接 docker运行时存在守护程序,所以我们需要停止docker内运行的容器和docker服务.具体可参考官网给出的守护程序解释 docker stop 容器id //CentOS下停止docker服务(Ubuntu类似) sudo systemctl stop docker 使用以下命令找到已创建容器的hostconfig.json和config.v2.json配置文件. find / -name hostconfig.json //或co

  • Docker容器网络端口配置过程详解

    暴露网络端口 实际上,Docker中涉及暴露网络端口的参数有两个,分别是-p和-P.下面分别来介绍. -P 使用-P,Docker会在宿主机上随机为应用分配一个未被使用的端口,并将其映射到容器开放的端口,以Nginx 为例,如下: 可以看到,Docker为应用分配了一个随机端口32768,使用该端口即可访问容器中的 nginx(http://lcalhost:32768). -p -p参数则有几种不同的用法: hostPort:containerPort 这种用法是将宿主机端口和容器端口绑定起来

  • docker设置了端口映射,不能访问的解决方案

    #docker ps 查看, 所有端口都 做了映射 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 764b158ba491 open-falcon-plus-02:v-daiyi-01 "/bin/bash" 2 days ago Up 3 hours 0.0.0.0:4444->4444/tcp, 0.0.0.0:6030-6031->6030-6031/tcp, 0.0.0.0:6070-6071->6

随机推荐