docker容器的端口映射

摘要:
1.创建一个Nginx容器,先不映射端口[root@localhost~]#dockerrun--namemy_nginx-dnginx7be3673a4c0f8f7ffe79a7b11ab86c4327dacaf734ed574e88e28c1db2243716[root@localhost~]#dockerps-a#可以看到容器启用了80端口,但是在宿主机上没有进行映射CONTAINERIDI
1.创建一个Nginx 容器,先不映射端口
[root@localhost ~]# docker run --name my_nginx -d nginx
7be3673a4c0f8f7ffe79a7b11ab86c4327dacaf734ed574e88e28c1db2243716
[root@localhost ~]# docker ps -a        #可以看到容器启用了80端口,但是在宿主机上没有进行映射
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
7be3673a4c0f        nginx               "nginx -g 'daemon ..."   5 seconds ago       Up 4 seconds        80/tcp              my_nginx
2.获取该容器的网络信息
[root@localhost ~]# docker exec -it my_nginx  /bin/bash  #可以看到Nginx容器非常简洁,很多shell命令都没有,无法查看一些我们想要的信息
root@7be3673a4c0f:/# ip a
bash: ip: command not found
root@7be3673a4c0f:/# ifconfig
bash: ifconfig: command not found
root@localhost ~]# docker network inspect bridge   #我们可以通过inspect查看一下网络信息
        "Containers": {
            "7be3673a4c0f8f7ffe79a7b11ab86c4327dacaf734ed574e88e28c1db2243716": {
                "Name": "my_nginx",
                "EndpointID": "6fa4eedf32d4a9d75b591d102613944d49a3cd40d2e41ea6c386685584fd09a7",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",        #容器的IP地址
                "IPv6Address": ""
            }
        },
        
3.通过宿主机访问一下容器IP地址及端口
[root@localhost ~]# ping 172.17.0.2#可以ping通
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.073ms
[root@localhost ~]# telnet 172.17.0.2 80#Telnet 80端口正常
Trying 172.17.0.2...
Connected to 172.17.0.2.
Escape character is '^]'.
[root@localhost ~]# curl -I 172.17.0.2#访问Nginx容器80端口正常
HTTP/1.1 200 OK

小结:默认创建的容器如果有服务端口那么从宿主机可以访问,外部无法访问

4.创建一个容器,通过-p参数启动端口映射
[root@localhost ~]# docker rm -f my_nginx 
[root@localhost ~]# docker run --name my_nginx -d -p 80:80nginx  #注意-p参数的格式  
f1166a72ab910b425cf32b91ababde2a5b6a4fda6db08852bf7a99d925d4985f
[root@localhost ~]# docker ps -a    #这里的规则映射了0.0.0.0,意味着将接受主机来自所有接口的流量。用户可以通过-p IP:host_port:container_port-p IP::port来指定允许访问容器的主机上的 IP、接口等,以制定更严格的规则
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
f1166a72ab91        nginx               "nginx -g 'daemon ..."   3 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp   my_nginx

如果希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件/etc/docker/daemon.json中添加如下内容:

{
  "ip": "0.0.0.0"
}

通过宿主机IP地址访问(注意端口)

[root@localhost ~]# ifconfig eth0|awk 'NR==2{print $2}'
172.16.150.135

docker容器的端口映射第1张

5.创建一个容器,通过-P参数启动端口映射
[root@localhost ~]# docker rm -f my_nginx
my_nginx
[root@localhost ~]# docker run --name my_nginx -d -P  nginx  #-P直接使用,不需要指定端口
8f9df2a803766862d08709b77054d35e890ca72c0ea17770dac8b3815278d35b
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
8f9df2a80376        nginx               "nginx -g 'daemon ..."   5 seconds ago       Up 5 seconds        0.0.0.0:10000->80/tcp   my_nginx

外部访问(注意端口)

docker容器的端口映射第2张

6.-P及-p参数的用法及区别

官方文档文档:

   -P, --publish-all=true|false
      Publish all exposed ports to random ports on the host interfaces. The default is false.
   When set to true publish all exposed ports to the host interfaces. The default is false. If the operator uses -P (or  -p)  then  Docker  will  make  the
   exposed  port  accessible on the host and the ports will be available to any client that can reach the host. When using -P, Docker will bind any exposed
   port to a random port on the host within an ephemeral port range defined by /proc/sys/net/ipv4/ip_local_port_range. To find the mapping between the host
   ports and the exposed ports, use docker port.
   -p, --publish=[]
      Publish a container's port, or range of ports, to the host.

   Format:  ip:hostPort:containerPort  |  ip::containerPort  | hostPort:containerPort | containerPort Both hostPort and containerPort can be specified asa
   range of ports.  When specifying ranges for both, the number of container ports in the range must match the number of host ports inthe  range.   (e.g.,
   docker  run  -p 1234-1236:1222-1224 --name thisWorks -t busybox but not docker run -p 1230-1236:1230-1240 --name RangeContainerPortsBiggerThanRangeHost‐
   Ports -t busybox) With ip: docker run -p 127.0.0.1:$HOSTPORT:$CONTAINERPORT --name CONTAINER -t someimage Use docker port to  see  the  actual  mapping:
   docker port CONTAINER $CONTAINERPORT

-P:

在宿主机上通过随机端口映射容器内启用端口,随机的端口范围通过/proc/sys/net/ipv4/ip_local_port_range配置获取
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_local_port_range
10000    65000

-p:

可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。
端口映射支持的格式有:
  ip:hostport:containerport   #指定ip、指定主机port、指定容器port
  ip::containerport           #指定ip、未指定主机port、指定容器port
  hostport:container          #未指定ip port、指定主机port、指定容器port 
多次使用-p标记可以绑定多个端口,例  -p 00:80 -p 8088:8080
可以指定范围,例
-p 1234-1236:1222-1224

不管用那种办法,其实也是在本地的iptable的 nat 表中添加相应的规则:

使用-p 80:80时:

[root@localhost ~]#  iptables -t nat -vnL|grep :80
    0     0 MASQUERADE  tcp  --  *      *       172.17.0.2           172.17.0.2           tcp dpt:80
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:80

使用-P时:

[root@localhost ~]#  iptables -t nat -vnL|grep :80
    0     0 MASQUERADE  tcp  --  *      *       172.17.0.2           172.17.0.2           tcp dpt:80
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:10000 to:172.17.0.2:80

免责声明:文章转载自《docker容器的端口映射》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇说下hangfire吧ERROR: Cannot set priority of registrydns process 33740下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

docker 安装 maven 私有库 nexus3

1,使用 docker-compose 构建 1,创建一个目录,并创建配置文件,可以选择在自己有读写权限的任意目录下创建 cd /root mkidr nexues cd nexus vi docker-compose.yml 2,docker-compose.yml 配置文件 version: '3.1' services: nexus:...

TCP接收方对于重叠报文的处理

一、接受方有效负载的判断 在rfc793中说明了对于判断接收到的报文是否有负载的判断在Page 24和Page 25之间,其中的原文说明为  A segment is judged to occupy a portion of valid receive sequence   space if       RCV.NXT =< SEG.SEQ <...

Linux性能优化实战学习笔记:第四十六讲

一、上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU、内存、文件系统和磁盘 I/O、以及网络的性能分析和优化。相信你已经掌握了这些基础模块的基本分析、定位思路,并熟悉了相关的优化方法。 接下来,我们将进入最后一个重要模块—— 综合实战篇。这部分实战内容,也将是我们对前面所学知识的复习和深化。 我们都知道,随着 Kubernetes、Do...

Socket编程:UDP和TCP概论及案例

网络编程的三要素: 1.IP地址 2.端口 3.协议 什么是Socket? Socket就是通信链路的端点称"套接词". 基于TCP协议的Socket网络通信:用来实现双向安全连接网络通信Socket通信模型:进行网络通信时,Socket需要借助数据流来完成数据的传递工作 Socket网络编程一般可以分成如下步骤进行,如图所示: UDP、TCP概述:...

Jellyfin 安装 Docker 版

Deploy jellyfin by Docker Ref Pre-requirement Docker please(Docker-Compose is optional) Installation Download the latest container's image:docker pull jellyfin/jellyfin Create pe...

idea配置docker

一、idea安装docker插件 欢迎页->Configure->Plugins插件使用说明 二、docker服务器开放监听端口 根据官网信息,docker默认只接受本地客户端的请求;若需要接受远程访问,可以使用docker.service系统单元文件来配置Docker以接受远程连接,该文件用于使用systemd的Linux发行版,例如RedH...