Docker 端口映射
程序员文章站
2022-06-04 20:03:17
...
本文使用示例基于nginx镜像。首先我们从镜像仓库下载:
docker pull hub.c.163.com/public/nginx:1.2.1
然后启动一个nginx容器:
docker run -d --name nginx-test hub.c.163.com/public/nginx:1.2.1 /bin/sh -c "while true; do sleep 3600;done"
启动名为nginx-test的nginx容器。
执行:docker network ls结果如下:
NETWORK ID NAME DRIVER SCOPE
dce12ad15e67 bridge bridge local
be63d9693f78 host host local
ec80468730b6 my-bridge bridge local
d1c04eee03c8 none null local
由之前讲的可以知道我们可以通过docker network inspect dce12ad15e67命令来查看默认连接到bridge上的nginx-test容器的ip地址:
"Containers": {
{
"c08c178f374d13bd6f37a5781c067acfc981a3ea3df0ee0689bd4ef54054d3fb": {
"Name": "ngnix-test",
"EndpointID": "c5c92988a73b4884b0c3adac1342821c9954fcdb6fefc51a8347560aaa2db4e1",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
}
可知nginx容器的ip地址为172.17.0.2,16是掩码。
由于nginx是一个web服务器,启动nginx后可以直接访问它的ip地址后有一个欢迎页面。我们在宿主机上可以执行curl命令来访问:
[[email protected] ~]$ curl http://172.17.0.2
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>Welcome to nginx!</h1></center>
</body>
</html>
现在问题在于只有docker所在环境的宿主机(此处为虚拟机)中才可以访问nginx服务,其默认端口为80端口,而有时候我们想在虚拟机外,如本地环境去访问这个nginx服务,此时就访问不了了。
为了解决这个问题,需要将nginx的80端口映射到本地127.0.0.1的80端口,这样我们在本地就可以访问到nginx服务了。
我们将原理的nginx容器stop和rm掉,重新启动一个nginx容器:
docker run -d --name nginx-test -p 80:80 hub.c.163.com/public/nginx:1.2.1
其中-p命令就是将容器中的80端口映射到docker环境所在宿主机的80端口,此时我们直接在宿主机*问127.0.0.1就可以访问到nginx服务了:
[[email protected] ~]$ curl http://127.0.0.1
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>Welcome to nginx!</h1></center>
</body>
</html>
此处宿主机是是本地启动的虚拟机,如果部署到云上,那就相当于访问远程虚拟机的ip地址就可以访问到虚拟机上nginx容器的服务。