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 ..." seconds ago Up seconds /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) () bytes of data.
bytes from 172.17.0.2: icmp_seq= ttl= time=0.073 ms [root@localhost ~]# telnet 172.17.0.2 #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 OK

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

4.创建一个容器,通过-p参数启动端口映射
[root@localhost ~]# docker rm -f my_nginx
[root@localhost ~]# docker run --name my_nginx -d -p : nginx #注意-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 ..." seconds ago Up seconds 0.0.0.0:->/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

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 ..." seconds ago Up seconds 0.0.0.0:->/tcp my_nginx

外部访问(注意端口)

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 as a
range of ports. When specifying ranges for both, the number of container ports in the range must match the number of host ports in the range. (e.g.,
docker run -p -:- --name thisWorks -t busybox but not docker run -p -:- --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

-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 :
MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:
DNAT tcp -- !docker0 * 0.0.0.0/ 0.0.0.0/ tcp dpt: to:172.17.0.2:

使用 -P 时:

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

docker容器的端口映射的更多相关文章

  1. 如何修改运行中的docker容器的端口映射和挂载目录

    在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...

  2. 教你如何修改运行中的docker容器的端口映射

    在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...

  3. [转帖]教你如何修改运行中的docker容器的端口映射

    教你如何修改运行中的docker容器的端口映射   在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当dock ...

  4. 如何修改运行中的docker容器的端口映射

    在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...

  5. Docker容器内部端口映射到外部宿主机端口的方法小结

    转自:https://www.cnblogs.com/kevingrace/p/9453987.html Docker允许通过外部访问容器或者容器之间互联的方式来提供网络服务.容器启动之后,容器中可以 ...

  6. 修改docker容器的端口映射

    大家都知道docker run可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改.通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射. 有没有办法不保存镜像而直接修改 ...

  7. 修改已经创建的docker容器的端口映射

    原始链接:https://stackoverflow.com/questions/19335444/how-do-i-assign-a-port-mapping-to-an-existing-dock ...

  8. Docker容器内部端口映射到外部宿主机端口 - 运维笔记

    Docker允许通过外部访问容器或者容器之间互联的方式来提供网络服务.容器启动之后,容器中可以运行一些网络应用,通过-p或-P参数来指定端口映射. 注意:宿主机的一个端口只能映射到容器内部的某一个端口 ...

  9. 解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题

    在docker中运行第三方服务时,通常需要绑定服务端口到本地主机.但使用 -p 参数进行的端口映射,会自动在iptables中建立规则,绕过firewalld,这对于端口级的黑白名单控制管理是很不利的 ...

随机推荐

  1. Python中model转dict

    问题 在query出来的行信息object中有一个dict变量,这个变量存储了字典信息 for u in session.query(User).all(): print u.__dict__ 但是这 ...

  2. java高并发系列 - 第5天:深入理解进程和线程

    进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.程序是指令.数据及其组织形式的描述,进程是程序的实体. 进程具有的 ...

  3. NET EF 连接Oracle 的配置方法记录

    主要记录下如何在EF 中连接Oracle s数据库,很傻瓜式,非常简单,但是不知道的童鞋,也会搞得很难受,我自己就是 1.创一个控制台程序,并且添加  Oracle.ManagedDataAccess ...

  4. python_正则表达式学习

    re.match()函数: 函数语法: re.mathch ( pattern , string , flags = 0) 参数说明: pattem 匹配的正则表达式 string 要匹配的字符串 f ...

  5. SSRS 关于日期参数的范围限制

    在进行SSRS Report开发的时候,我们往往会有日期\时间范围限制的需求,但参数的报表参数并没有相关的事件\属性来设置. 所以,我们需要曲线救国. 这里要说的这种方法,仅支持Microsoft S ...

  6. MySQL 部署分布式架构 MyCAT (三)

    配置垂直分表 修改 schema.xml (db1) cd /data/mycat/conf cp schema.xml schema.xml.rwh # 修改配置 vi schema.xml < ...

  7. Python—基本数据类型

    核心数据类型: 数字(int整型.float浮点型.complex复数.bool布尔型) 字符串 str 列表(List) 元组(Tuple) 字典(Dictionary) 集合() 数字 整数,浮点 ...

  8. [PHP] 现代化PHP之路:composer的安装和升级

    1.下载一个脚本文件 wget https://getcomposer.org/installer 2.php执行下这个php脚本 php installer 3.把下载的文件转移到一个PATH环境变 ...

  9. CentOS服务器apache绑定多个域名的方法

    这篇文章主要为大家详细介绍了CentOS服务器apache绑定多个域名的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 Apache是最流行的HTTP服务器软件之一,其以快速.可靠(稳定) ...

  10. Pwn-level3

    题目地址 https://dn.jarvisoj.com/challengefiles/level3.rar.2047525b05c499c9dd189ba212bba1f8 借鉴 https://w ...