備忘
DooD(Docker outside of Docker)環境Jenkins
環境
- Fedora Linux 35 (Workstation Edition)
- Docker version 20.10.9, build c2ea9bc
- dockerデーモンは起動済み
- 操作ユーザーはdocker groupに属する (sudo usermod -aG docker $USER)
- jenkins_home は操作ユーザーの $HOME/jenkins_home とする
環境構築
Dockerfile
明瞭さを優先し、jenkins/jenkinsにget-docker.shを用いてdockerを導入
FROM jenkins/jenkins
USER root
RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && rm get-docker.sh
USER jenkins
docker build および docker run
$ mkdir $HOME/jenkins_home
$ docker build . -t jenkins-dood
...
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jenkins-dood latest b07c3629294e 21 hours ago 944MB
jenkins/jenkins 2.322-jdk11 a7aa4a28243e 4 days ago 442MB
jenkins/jenkins latest a7aa4a28243e 4 days ago 442MB
$ docker run -d \
--name jenkins-dood \
-u $(id -u):$(id -g) \
--group-add $(awk -F: '$1 == "docker" {print $3}' /etc/group) \
-v $HOME/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-p 8080:8080 \
-p 50000:50000 \
jenkins-dood
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b38450bc7dd jenkins-dood "/sbin/tini -- /usr/…" 12 seconds ago Up 11 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins-dood
$ docker logs jenkins-dood # 初期キーフレーズ確認などのため
...
podmanへの置き換えの可能性を考慮し、docker-composeの利用は一旦保留。
http://localhost:8080 にアクセスすることでJenkins管理画面に接続可能
コンテナ内からdockerコマンドが使用可能であることの確認
$ docker exec -it jenkins-dood /bin/bash
jenkins@6b38450bc7dd:/$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b38450bc7dd jenkins-dood "/sbin/tini -- /usr/…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins-dood
jenkins@6b38450bc7dd:/$ exit
exit
$
課題1: jenkins_homeのパーミッション
Jenkinsの設定などがおかれるjenkins_homeは、ローカルとシェアして永続化する。
docker run時、デフォルトではコンテナ内ではuidが1000のjenkinsユーザーとなる為、作成されるjenkins_home内のファイルもuid 1000となる。
これでは使い勝手が悪い為、docker run時に、-u $(id -u):$(id -g)オプションを指定し、jenkins_home内のファイルの所有者、所有グループをコマンド実行ユーザーに合わせる。
課題2: /var/run/docker.sock へのアクセス許可
コンテナ内からもdockerを使えるようにする為、/var/run/docker.sockを共有させている。
外の/var/run/docker.sockは、所有グループのdockerグループに対する権限許可によりアクセスを可能としている。
$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 Nov 27 10:18 /var/run/docker.sock
コンテナ内のプロセスも/var/run/docker.sockへのアクセスの為には、外のdockerグループのgidのグループに参加させる必要がある為、docker run時に、--group-add $(awk -F: '$1 == "docker" {print $3}' /etc/group) オプションを指定する。
$()内の以下は、/etc/groupから、:区切りの第1項目がdockerの行の第3項目を出力する
awk -F: '$1 == "docker" {print $3}' /etc/group