固定ip是很常見的一種使用情境,但一樣,docker預設就是動態ip,固定ip需要額外設定。
這邊以一個案例來做說明,注意,這邊都還是用bridge的網路進行固定ip的設定。
會開始這一系列的文章是因為架設Drone+Gogs(之前本來是用Jenkins+Gitlab但很肥),一個是CI/CD工具(Drone),一個是Git Server(Gogs),都希望以Docker的方式架設,但發生了一直發生兩個容器無法互通的網路問題,不單單只是容器讓它們都在同一個網卡環境而已,重點是官方Drone連線Gogs的資訊都放在環境變數內,如果兩邊的IP都用Docker配置,通常就會動態配置,這時會想用Docker DNS(後面會研究)來互連,但不知道為什麼在環境變數的地方無法用Docker DNS,這部份後續會嘗試研究看看原因(Docker要熟練重點還是要會除錯),所以這邊我們就先以ip的方式互連吧,ip就不用動態配置,而用固定ip的方式處理
預計我們要做的架構:
docker network create --ip-range 172.31.0.0/24 --subnet 172.31.0.0/24 --gateway 172.31.0.1 cicd
下ifconfig,看到確實已經建立好了
接下來參考docker hub gogs跟drone官方說明,開始啟動兩個container
docker pull gogs/gogs
docker volume create gogs_data
docker run -d -p 3000:3000 -p 22:22 --name=gogs -v gogs_data:/data --network=cicd --ip=172.31.0.3 gogs/gogs
服務就直接輸入 http://172.31.0.3:3000 ,使用sqlite3,建立管理者帳號,然後建立了一個coderepo repos。
參考:
https://hub.docker.com/r/gogs/gogs
參考:
https://docs.drone.io/server/provider/gogs/
docker pull drone/drone:2.20.0
docker volume create drone_data
docker run \
--volume=drone_data:/data \
--env=DRONE_AGENTS_ENABLED=true \
--env=DRONE_GOGS_SERVER=http://172.31.0.3:3000 \
--env=DRONE_RPC_SECRET=super-duper-secret \
--env=DRONE_SERVER_HOST=172.31.0.2 \
--env=DRONE_SERVER_PROTO=http \
--publish=80:80 \
--publish=443:443 \
--restart=always \
--detach=true \
--name=drone \
--env=TZ=Asia/Taipei \
--ip=172.31.0.2 \
--network=cicd \
drone/drone:2.20.0
先進入 http://172.31.0.2 設定gogs帳號,然後進入gogs嘗試用webhook跟drone連線,結果出現錯誤
錯誤訊息:
Payload URL resolved to a local network address that is implicitly blocked.
可能是gogs的限制,這邊嘗試cat出app.ini設定檔
參考:
https://blog.csdn.net/catoop/article/details/128454236
docker exec -it gogs cat /data/gogs/conf/app.ini
發現security確實沒有允許LOCAL_NETWORK_ALLOWLIST設定
嘗試最後一行塞入 LOCAL_NETWORK_ALLOWLIST=172.31.0.2
docker exec -it gogs sh
vi /data/gogs/conf/app.ini
接下來砍掉container再啟動
docker rm -f gogs
sudo docker run -d -p 3000:3000 -p 22:22 --name=gogs -v gogs_data:/data --network=cicd --ip=172.31.0.3 gogs/gogs
成功!!!
調整好gogs後,發現drone出現錯誤
gogs還是可以正常登入,drone還是可以連線到gogs
目前已經被開bug,還是open狀態,我們只能追蹤下去,這邊只展示固定ip跟容器互通的情境
https://github.com/gogs/gogs/issues/7172
網路部份參考:
https://docs.docker.com/engine/reference/commandline/network_create/
請問Docker宿主機是個VM:192.168.1.123,Docker服務使用port 3000,請問怎麼讓區域網Lan中的User直接透過192.168.1.123:3000取得Docker服務?