大數據

Docker容器端口映射規則調整方案

1.概述

 Docker提供三種用戶自定義(user-defined)的網絡驅動:bridge,overlay和macvlan。通常,我們使用的是Docker默認的網絡模式Bridge模式,bridge模式可以將各個容器的端口設為對立的,這樣外部宿主機或者容器需要通過該容器所在ip+該容器的端口進行訪問,並且本宿主機可以訪問本宿主機中的容器。
 創建宿主機與容器的端口映射,需要在docker run創建並運行容器的時候,通過-p指定端口映射規則。但是,我們也經常遇到創建容器時忘記設置端口映射,或者設置錯了需要修改的情況。docker start運行容器後,並沒有提供一個選項或設置可以修改指定的端口映射規則。那麼這種情況我們該怎麼處理呢?本文將以Mac for DockerDesktop為例進行說明。

2.解決方案

2.1.重建容器

 這種方法比較簡單直接,即刪除原有的缺少端口映射的容器,重新創建一個指定端口映射規則的容器。
 由於此方案需要重建容器,所以僅適用於創建鏡像後還沒開始配置或容器配置簡單、配置成本較小的情況。

2.2.修改配置文件

 通過修改配置文件hostconfig.json和config.v2.json,可以實現docker容器端口映射規則的修改,具體操作步驟如下。

  • 1.確定容器ID
docker container inspect $ContainerName |grep Id
或者
docker inspect $ContainerName |grep Id 

示例:
image.png

  • 2.停止容器
docker stop $ContainerName

示例:
image.png

  • 3.停止docker服務
     以Mac for Docker Desktop為例,示例如下:

image.png

  • 4.進入docker容器配置文件所在目錄
cd ~/Library/Containers/com.docker.docker/Data/vms/0/
  • 5.進入Docker內部Linux
     容器配置文件所在目錄中有一個tty文件,通過這個文件可以登錄docker內部的Linux。
screen tty 
遇到空白命令行,直接回車即可。 
  • 6.進入容器對應文件夾
cd /var/lib/docker/containers/
cd $ContainerId

示例:
image.png

 如上圖所示,容器對應目錄內包含config.v2.json和hostconfig.json兩個配置文件,下一步分別對兩個文件進行修改即可(務必都進行修改)。

  • 7.編輯修改config.v2.json

    • a.執行如下命令查看config.v2.json
cat /var/lib/docker/containers/{容器id}/config.v2.json

image.png

  • b.本地進行json格式化,雖然config.v2.json是json文件,但沒有格式化,所以在本地對齊進行格式化,方便參數修改。
  • c.編輯ExposedPorts和Ports參數,參考之前內容或如下格式添加端口映射。
    image.png

image.png

  • d.添加完成後,將文件內容壓縮成一行並覆蓋寫入config.v2.json即可。
  • 8.編輯修改hostconfig.json
     操作步驟同上,需要修改的參數為PortBindings,添加內容示例如下,端口配置之間用英文字符逗號隔開。

image.png

  • 9.退出docker的虛擬Linux
     這一步很關鍵,如果沒有正常退出,配置文件將無法覆蓋舊文件,修改無法生效。

    • a.按Ctrl+A+D,退出screen命令。
    • b.使用screen -ls命令,查看當前會話。
      image.png
    • c.使用kill命令,殺死當前會話。
    • d.退出會話
screen -wipe 
There is a screen on: 
    41557.ttys004.YandeMacBook-Pro  (Removed) 
1 socket wiped out. 
No Sockets found in /var/folders/d0/y2ythxgd2p54y1p46bv90wpm0000gn/T/.screen. 
  • 10.重啟docker
     重新啟動Mac for DockerDesktop,並啟動容器。
docker start $ContainerName

2.3.構建自定義鏡像

 通過docker commit將原有容器及容器中的文件、配置信息commit為新的自定義鏡像,然後再通過這個自定義鏡像創建容器。在docker run創建並運行容器的時候,通過-p指定所需的端口映射規則,具體操作如下。

  • 1.停止原有docker容器。
docker stop $ContainerName
  • 2.提交原有docker容器為自定義鏡像。
docker commit [OPTIONS] $container [REPOSITORY[:TAG]]
OPTIONS說明:
-a :提交的鏡像作者;
-c :使用Dockerfile指令來創建鏡像;
-m :提交時的說明文字;
-p :在commit時,將容器暫停。

image.png

  • 3.基於自定義鏡像創建容器
docker run -it --name $new_containername -p 80:80 $imagename:tag

 到這裡,添加指定端口映射的新容器就可以使用了。

3.總結

 綜上,以上三種方式均可實現為運行中的容器調整端口映射規則,三種方式的優劣對比如下:

  • 優勢

    • 通過刪除原有容器並重建新容器的方式實現調整端口,操作簡單、直接。
    • 修改配置文件的方式沒有副作用,無需重新配置容器。
    • 通過構建自定義鏡像、重建容器的的方式,操作簡單且不會影響同一宿主機上的其他容器。
  • 劣勢

    • 方案1重建容器後需要重新配置容器,比較麻煩。
    • 方案2修改配置文件後,需要重啟整個docker服務,如果在同一個宿主機上運行著多個容器服務的話,會影響其他容器服務。
    • 方案3實現方式曲折,在管理上會略顯混亂。

Leave a Reply

Your email address will not be published. Required fields are marked *