注:此處以 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.json和config.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服務否則修改將無效