今天需要修改一個容器A的外部映射的端口,在宿主機上跑着許多容器,所以在解決這個問題的時候需要考慮兩個硬性條件:
1、宿主機上docker的service服務本身不能重啟,影響其他線上容器。
2、該容器A不能刪除,因為有數據存在。
網上有不少的解決方案,但是在這種場景下適合的特別少,常用的有下面兩種(不過對於我這次的場景來講,只能使用方案二解決):
方案一:修改容器A配置文件,重啟容器A
我們知道宿主機上默認存放所有容器的配置目錄是在/var/lib/docker/containers/目錄下,在該目錄下有許多個容器ID的目錄,每一個ID表示一個容器。因此要找到容器A的配置文件那么需要先查詢出容器A的ID號即可。使用“docker ps | grep Container_Name”。得到容器A的ID號之后再去/var/lib/docker/containers/目錄下使用tab鍵補全目錄並進入即可,然后就可以看到容器A的配置文件。如下所示:
容器A的主要的配置文件是hostconfig.json這個文件,我們打開並編輯內容即可。里面的信息較多,我們只需要找到PortBindings這一行的信息,需要編輯:
"PortBindings":{"9200/tcp":[{"HostIp":"","HostPort":"9201"}],"9300/tcp":[{"HostIp":"","HostPort":"9301"}]}
文檔中PortBings這一項中,其中“9200/tcp”是對應容器內部的9200端口。而“HostPort”:"9201"則對應的是映射到宿主機的端口9201。后面的9300端口也是統一如此。修改完端口之后,重啟docker服務service即可。
缺點:此方法需要重啟容器服務,因此會影響其他的docker容器,因此不建議使用。
方案二:使用docker commit新構鏡像
docker commit把一個容器的文件改動和配置信息commit到一個新的鏡像中,然后用這個新的鏡像重啟一個容器,這對之前的容器不會有影響。
主要是三步驟:
1、先stop容器A
2、commit容器A
docker commit old_container new_image:tag
3、使用前一步新生成的鏡像重新啟動一個容器。
docker run --name container_name02 -p 9202:9200 new_image:tag
優點:可以解決問題,比較推薦