背景:
Docker官方是不建議在容器內(nèi)運行Docker daemon的,但是呢,當我們用Jenkins時,卻又免不了要用到Docker。這個時候,如果我們的Jenkins是安裝在Docker容器中,就會導致無法調(diào)用Docker。
過程:
在安裝Jenkins容器時,把host的docker socket掛載到容器里,直接利用host的docker daemon在容器里跑。同時在容器里安裝docker client。
掛載命令(其他命令根據(jù)自己需要調(diào)整):
docker run -p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins \
jenkins/jenkins
登錄Jenkins容器:
docker exec -it -u root jenkins bash
安裝docker client(docker是ubuntu內(nèi)核,可以直接用ubuntu上一些命令):
apt-get update && \
apt-get -y install apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable" && \
apt-get update && \
apt-get -y install docker-ce
注意事項:
特別需要強調(diào)的是,因為docker內(nèi)部有些功能需要用到root權限(namespace and cgroups),這樣掛載后,容器內(nèi)的命令將能夠影響到host,會導致安全風險。具體問題就需要具體分析了。
參考文檔:
The simple way to run Docker-in-Docker for CI
Docker not found when building docker image using Docker Jenkins container pipeline
Is it possible to install only the docker cli and not the daemon
Can anyone explain docker.sock