首页 > 技术文章 > Docker容器添加新的端口

keh123000 2020-11-06 14:27 原文

注:此处以 Ubuntu 镜像为例

方法一 :将容器提交为新的镜像之后运行镜像并添加端口

1.将容器打包成镜像

docker commit :从容器创建一个新的镜像。
语法
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS说明:
    • -a :提交的镜像作者;
    • -c :使用Dockerfile指令来创建镜像;
    • -m :提交时的说明文字;
    • -p :在commit时,将容器暂停。

docker commit -m 'no port' ubuntu np-ubuntu:v1

2.运行镜像并添加端口

docker run -itd --name=ubuntu1 -p 5022:22 np-ubuntu:v1 /bin/bash

5022:22 代表:主机端口:容器内部的端口

 执行示例如下:

 方法二:端口转发

1. 获取容器IP

docker inspect : 获取容器/镜像的元数据。
语法
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
    
OPTIONS说明:
-f :指定返回值的模板文件。
-s :显示总的文件大小。
--type :为指定类型返回JSON。
docker inspect `container_name` | grep IPAddress1

docker inspect ubuntu | grep IPAddress

注:容器需在运行中

2. iptable转发端口

iptables详解请参考:iptables入门指南 --- iptables详解 ---iptbales 防火墙

将容器的 22 端口映射到docker主机的 6022 端口

iptables -t nat -A  DOCKER -p tcp --dport 6022 -j DNAT --to-destination 172.17.0.2:22

执行示例如下:

 

 补充:

查看iptables到底设置了什么规则
sudo iptables -t nat -vnL
如果加错了或者想修改:
先显示行号查看
sudo iptables -t nat -vnL DOCKER --line-number
删除规则3
sudo iptables -t nat -D DOCKER 3 

操作示例如下:

 方法三:修改容器对应的配置文件

即:修改/var/lib/docker/containers/[containerId]目录下,hostconfig.jsonconfig.v2.json 两个配置文件。

1. 停止容器,停止docker服务

docker stop container_id

systemctl stop docker

 2. 修改配置文件

2.1 修改 hostconfig.json文件,修改点

hostconfig.json 里有 "PortBindings":{} 这个配置项,可以改成"PortBindings":{"22/tcp":[{"HostIp":"","HostPort":"5022"}]} 这里 22 是容器端口, 5022 是本地端口

 2.2 修改 config.v2.json 文件,修改点

config.v2.json 里面添加一个配置项 "ExposedPorts":{"22/tcp":{}}

配置项 "Ports": {} 修改成 "Ports": {"22/tcp": [{"HostIp": "0.0.0.0","HostPort": "5022"}]}

 :修改配置文件前必须先停掉容器及docker服务否则修改将无效

推荐阅读