通常在运行容器时,我们都会通过参数 -p来指定宿主机和容器端口的映射,例如
docker run -it -d --restart always --name [指定容器名] -p 8899:8080 [指定镜像名]
上述命令将容器内的8080端口映射到宿主机的8899端口。
参数说明
-d 表示后台运行容器
-t 为docker分配一个伪终端并绑定到容器的标准输入上
-i 是让容器的标准输入保持打开状态
-p 指定映射端口
–restart 指定容器异常停止后是否自动重启
当容器已经运行之后,且容器中已经有配置改动,不方便重新创建逐一修改配置时,则可通过两种方式新增端口映射。
一、将现有的容器打包成镜像并重新运行
如果正在运行的容器已经修改了很多配置,重新创建镜像,修改配置比较麻烦时,可在现有的容器基础上打包一个镜像。然后在运行新镜像时进行端口映射的新增或修改。
step 1. 停止指定容器:
docker stop container-name
step 2. 将容器commit成为一个镜像:
docker commit -a "作者" -m "这里是镜像的注释" [容器名称或id] [打包的镜像名称]:[版本标签]
#常用OPTIONS说明:
# -a :提交的镜像作者
# -c :使用Dockerfile指令来创建镜像
# -m :提交时的说明文字
# -p :在commit时,将容器暂停
或者使用export和import将容器导出为镜像
docker export 容器ID > 压缩包名称.tar
cat 压缩包名称.tar | docker import - 镜像名称:版本标签
#导出
$ docker export 1efca3906 > centos.tar
#导入
$ cat docker/centos.tar | docker import - test/centos:v1
注意:容器在提交之前需要先停止。如果容器正在运行,则提交操作将失败。此外,提交的容器必须是基于一个基础镜像构建的,否则提交操作也将失败。
step 3. 用新镜像运行容器:
docker run -it -d --name container-name -p 8848:8848 -p 9848:9848 new-image-name
至此,原有容器内配置不变,在启动时进行了新的端口映射。
二、修改要端口映射的容器的配置文件(推荐)
step 1. 查看容器信息:
# 查看容器列表
docker ps -a
# 查看容器的端口映射情况,在容器外执行:
docker port [容器id]
# 或
docker port nginx
step 2. 查找要修改容器的容器全Id:
docker inspect [容器id或名称] | grep Id
step 3. 修改配置文件
进入/var/lib/docker/containers目录,找到与上述Id相同的文件夹,修改该文件夹下的 hostconfig.json 和 config.v2.json文件。
在修改之前,还需要停到容器和docker服务。
docker stop [容器id]
systemctl stop docker
修改hostconfig.json,找到key为PortBindings的配置,添加端口绑定"9848/tcp": [{“HostIp”: “”,“HostPort”: “9848”}],表示绑定端口9848:
"PortBindings":{
"8848/tcp":[{"HostIp":"","HostPort":"8848"}],
"9848/tcp":[{"HostIp":"","HostPort":"9848"}]
}
修改config.v2.json文件,在ExposedPorts中加上要暴露的端口,即9848:
"ExposedPorts":{"8848/tcp":{},"9848/tcp":{}}
保存配置文件,重启docker服务和容器:
systemctl start docker
docker start [容器id]