docker容器的端口映射
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容器的端口映射的更多相关文章
- 如何修改运行中的docker容器的端口映射和挂载目录
在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...
- 教你如何修改运行中的docker容器的端口映射
在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...
- [转帖]教你如何修改运行中的docker容器的端口映射
教你如何修改运行中的docker容器的端口映射 在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当dock ...
- 如何修改运行中的docker容器的端口映射
在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...
- Docker容器内部端口映射到外部宿主机端口的方法小结
转自:https://www.cnblogs.com/kevingrace/p/9453987.html Docker允许通过外部访问容器或者容器之间互联的方式来提供网络服务.容器启动之后,容器中可以 ...
- 修改docker容器的端口映射
大家都知道docker run可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改.通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射. 有没有办法不保存镜像而直接修改 ...
- 修改已经创建的docker容器的端口映射
原始链接:https://stackoverflow.com/questions/19335444/how-do-i-assign-a-port-mapping-to-an-existing-dock ...
- Docker容器内部端口映射到外部宿主机端口 - 运维笔记
Docker允许通过外部访问容器或者容器之间互联的方式来提供网络服务.容器启动之后,容器中可以运行一些网络应用,通过-p或-P参数来指定端口映射. 注意:宿主机的一个端口只能映射到容器内部的某一个端口 ...
- 解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题
在docker中运行第三方服务时,通常需要绑定服务端口到本地主机.但使用 -p 参数进行的端口映射,会自动在iptables中建立规则,绕过firewalld,这对于端口级的黑白名单控制管理是很不利的 ...
随机推荐
- Spring核心(IoC) 入门解读
什么是IoC容器和Bean? 说到容器,就是用来装东西,那么这里边装的是什么那?是bean对象.那么你会问什么是bean?这就要从很久很久以前说起,当我们创建对象的时候,我们会new一个对象出来,但是 ...
- Python中字符的编码与解码
1 文本和字节序列 我们都知道字符串,就是由一些字符组成的序列构成串,那么字符又是什么呢?计算机只能识别二进制的东西,那么计算机又为什么会显示我们的汉字,或者是某个字母呢? 由于最早发明使用计算机是美 ...
- java基础(12):构造方法、this、super
1. 构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方 ...
- java基础(30):DBUtils、连接池
1. DBUtils 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils. DBUtils就是JDBC的 ...
- maven使用问题总结
maven dependencies 报红叉的问题: 第一种:检查bulid path 里面maven dependencies 是否丢失包 miss jar. 解决方法1:https://blog. ...
- DIY客户端框架
C/S类型的客户端做过好多轮了,在架构上每次都调整优化一部分,慢慢的形成了DIY的框架性东西. 可是最近这一看呢,已经不像MVC了,然后有一天看到了MVP概念,咦!很像.再一看,嗯,就该是MVP. M ...
- python中集合
去重 无序 没有索引 #remove 删除元素 >>> s1 = {1,2,3,4,5} >>> s1.remove(2) >>> print(s ...
- css伪类实现行号自动填充
css伪类实现行号自动填充 大多数时候我们需要行号自动填充的时候我们可以 大多数时候是插入元素, 在元素里用js填入行号,或者用 ol > li 实现行号填充, 对于上面的方式,都不太灵活,而且 ...
- centos下载安装libgcc 和 libtiff
1. 查看libtiff 可安装列表: [root@e952aff59318 lib]# yum list | grep "libtiff" libtiff.i686 4.0.9- ...
- 如何把转入成功的XXX.sql导入到自己的数据库里
1.新建自己的mysql连接,mysql连接名随便起,如cxf 密码尽量写123456或者root,防止忘记.按照图示右键(如果想在已有的mysql连接基础上建立数据库连接直接看第二步) 2.右键名 ...