Docker添加或者更改容器的端口映射

QUESTION:Docker添加或者更改容器的端口映射?

 

ANSWER:

初學Docker容器,按照教程的基本命令,拉取創建了幾個容器,都是在一開始新建的時候 docker  run -p 指定對應的端口,但對於docker start 沒有這個功能,所以查詢了以下幾種方法。

 

方法一:刪除原有容器,重新建新容器

這個解決方案最爲簡單,把原來的容器刪掉,重新建一個。當然這次不要忘記加上端口映射。

優缺點:優點是簡單快捷,在測試環境使用較多。缺點是如果是數據庫鏡像,那重新建一個又要重新配置一次,就比較麻煩了。

 

方法二:修改容器配置文件,重啓docker服務

找到/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json,hash_of_the_container 可以通過 docker inspect 容器名字,id 就是 容器的 hash 數值,在 hostconfig.json 裏有 "PortBindings":{} 這個配置項,

可以改成 "PortBindings":{"3306/tcp":[{"HostIp":"","HostPort":"33306"}]} 這裏 3306是容器端口, 33306是本地端口, 然後在 config.v2.json 裏面添加一個配置項 "ExposedPorts":{"80/tcp":{}} , 將這個配置項添加到 "Tty": true, 前面,我不知道添加到別的地方會不會有影響,因爲經過對比正常的端口映射配置項是在這個位置,這個就是將容器內部端口暴露出來,如果不加這一句端口映射不會成功的,最後重啓 docker的守護進程 service docker restart。

 

 優缺點:這個方法的優點是沒有副作用,操作簡單。缺點是需要重啓整個docker服務,如果在同一個宿主機上運行着多個容器服務的話,就會影響其他容器服務。

 

方法三:利用docker commit新構鏡像

1、停止docker容器

  1. docker stop container01

     

2、commit該docker容器

  1. docker commit container01 new_image:tag

     

3、用前一步新生成的鏡像重新起一個容器

  1. docker run --name container02 -p 80:80 new_image:tag

     

    優缺點:這種方式的優點是不會影響統一宿主機上的其他容器,缺點是管理起來顯得比較亂,沒有第二種方法那麼直觀。

 

方法四:主機與docker中的端口轉發是通過主機的iptables實現的

 

添加端口映射

獲取容器ip  
	docker inspect $container_name | grep IPAddress
添加轉發規則  
	iptables -t nat -A DOCKER -p tcp --dport $host_port -j DNAT --to-destination $docker_ip:$docker_port  

刪除端口映射規則

 

a. 獲取規則編號  
	iptables -t nat -nL --line-number
b. 根據編號刪除規則  
	iptables -t nat -D DOCKER $num

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章