Ubuntu里設置docker容器內的服務隨開機自動啟動
要讓docker容器內的服務能在開機加電后自動啟動,要解決三個問題:
1.docker服務能隨OS啟動而啟動
2.docker容器能隨docker服務啟動而啟動
3.docker容器內的服務能隨docker容器啟動而啟動
Ubuntu18.04上,docker service 默認沒有enable,所以Ubuntu18.04啟動后不會自動啟動docker service,在手工執行docker ps之類的docker命令時docker service才啟動,顯然采用的是lazy loading策略,這個可以在新安裝的環境里啟動Ubuntu 18.04后查看docker的進程確認,要讓docker service隨Ubuntu啟動,需要先enable它。
Docker容器要能隨Docker service的啟動而啟動,那么啟動策略需要設置為always。
Docker容器內init.d之類的初始化執行機制都沒有了,所以像平時在物理機的Ubuntu里那樣加開機啟動的service或者桌面應用之類的是沒效果的,需要在執行docker run命令時指定容器啟動后立即執行的腳本來啟動需要啟動的服務。
Ubuntu上執行下列步驟可以實現:
1A. sudo systemctl enable docker.service + sudo systemctl start docker.service # Ubuntu18.04,start命令可不用執行,執行docker命令時docker.service會自動啟動。
1.B sudo service docker start
2.設置容器的啟動策略:用docker run命令創建並運行容器時,加上 --restart=always參數即可,因此可以跳過這步。對於既有容器可以采用兩種辦法改變啟動策略的設置為always:
1) docker update --restart=always <容器名字>
2) 修改容器對應的hostconfig.json,例如/data1/dockerspace/containers/c64fc2d6f34d8bc78cfa7356a1830ebe2f86de8b3ae7a06b2c7e31b904c7289f/hostconfig.json
"RestartPolicy":{"Name":"no","MaximumRetryCount":0} 改為 "RestartPolicy":{"Name":"always","MaximumRetryCount":0}
再執行systemctl restart docker重啟docker service
3.執行帶 --restart=always參數和初始化腳本路徑的docker run命令創建運行容器,例如:
sudo docker run --runtime nvidia -it -d --ipc=host --network host --restart=always --name pytorch1.2_centernet-efficientdet-cascadercnn-full -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix -v /data/workspace:/home arm64v8/ubuntu18.04/nvidia-cuda:pytorch1.2-cec-full /home/start_server.sh
對於第3步,一個新創建的容量里肯定是沒有這種初始執行的腳本的(例如/home/start_server.sh),一般是需要在一個容器內編輯准備好一個這樣的腳本,執行這個腳本測試確實可以啟動你需要啟動的服務了,用docker commit制作一個鏡像,然后使用上面這樣的帶 --restart=always參數和初始化腳本路徑的docker run命令來基於這個鏡像創建並運行一個新的容器,容器啟動后立即執行這個指定的初始化執行腳本,例如上面的/home/start_server.sh
這個初始執行腳本的寫法也有需要注意的地方,不是隨便寫個里面執行啟動你需要的服務的shell腳本就行,至少需要做三件事:i)設置服務所需要的環境變量,ii)以后台方式啟動服務,iii)執行bash,三者缺一不可,沒有第一項你的服務啟動不了或者啟動后不能正常運行(例如,不設置中文字符集可能你的服務遇到中文就傻了或者直接因解析錯誤而崩潰),如果沒有第三項,啟動docker容器后容器立即退出或者永遠處於restarting狀態,無法連接上去。
給個示例:
#!/bin/bash
export LANG=C.UTF-8
export CUDA_HOME=/usr/local/cuda
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
cd /home/model_serving_flask
nohup python -u efficientdet_fire_model_server.py >nohup.fire.log &
/bin/bash
