Docker容器技术:容器的端口映射

855 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

1. 引子-使用nginx容器

首先我们利用nginx的镜像来创建一个对应的容器:

sudo docker run --name web -d nginx

但是这个nginx的服务我们可以访问吗?目前只能通过交互式的命令进入容器其中并尝试运行一些命令,:

我们发现很多的shell工具都没有装,包括ip a 都使用不了

1.1 获取nginx容器的网络

所以这里我们可以使用几种方式来获取nginx的network情况:

sudo docker network inspect bridge

这里可以看到他的IP地址,我们在外面ping一下看看:

1.2 本机访问nginx的80端口

接着我们尝试访问nginx的80端口:

发现其实可以访问的,接着我们通过curl命令来访问:

curl http://172.17.0.2

所以这里本机访问nginx容器是比较简单的,上面访问之后直接把一个nginx的html拉下来了~

1.3 外部如何访问

那么这个nginx正常情况下肯定是希望外面也可以访问到了,这里应该如何操作呢?这里就需要使用docker的端口映射功能--portMap功能

2.docker的端口映射

其实核心是把容器的80端口映射到主机的80端口上面,这样理论上外部就可以访问主机从而访问到容器的服务了,这样不需要访问容器的IP,直接访问本机就可以了。

2.1 重建一个nginx容器

这里我们需要重建一个容器,并通过-p 参数来进行映射:

sudo docker run --name web -d -p 80:80 nginx

这里PORT我们可以看到一个80 -> 80的访问,然后我们访问本地:

curl 127.0.0.1

2.2 外网访问

然后外网如何访问呢?这里我们本机是搭建在vagrant的虚拟机上面,它上面其实也是做了一个映射

我们的虚拟机其实是在docker-node1上面的,这个节点映射成了8888,所以上述80端口的服务被映射到了笔记本的8888端口,所以输入127.0.0.1:8888就可以了:

2.3 图片分析

对于nginx容器来说,他的服务端口是容器IP:80.

然后创建容器加了一个端口映射,访问Linux虚拟机的本地IP:80端口流量转发到容器IP:80端口。

接着我们通过vargrantFile的配置文件做了一个端口转发,访问本地笔记本:8888端口时候转发到了虚拟机的80端口从而完成访问nginx容器的目的。(如果虚拟机有public的IP地址,例如云服务器,那么直接访问IP:80就可以了)

3. 阿里云的例子

这里我们在阿里云安装了docker-machine来安装一个虚拟机,然后看一下公有IP:

然后我们在虚拟机里面启动一个nginx容器并进行端口映射:

docker run -d -p 80:80 --name web nginx

然后再访问虚拟机就出现对应界面了:

这个功能很有用的,如果通过容器提供Web服务经常需要这样操作,例如把容器内部数据库服务映射到本身~