概要
以前、docker-composeで立ち上げたJenkinsコンテナ内でDockerが使用できる環境を作る時に詰まったので、メモに残す。
構築作業
構築にはVirtualBox、Vagrantを使用した。
Vagrant.configure("2") do |config| config.vm.box = "ubuntu/xenial64" config.vm.box_download_insecure = true config.vm.network "forwarded_port", guest: 8080, host: 8080, host_ip: "127.0.0.1" config.vm.network "forwarded_port", guest: 50000, host: 50000, host_ip: "127.0.0.1" config.vm.synced_folder "./workspace", "/home/vagrant/workspace" config.vm.provider "virtualbox" do |vb| vb.memory = "1024" end end
Jenkinsでは8080番ポートと50000番ポートを使用するので開けておく設定を追加しておく。
version: "3.9" services: jenkins: build: . ports: - "8080:8080" - "50000:50000" volumes: - jenkins_home:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock volumes: jenkins_home:
volumesでVMにインストールしたDockerのソケットファイルをJenkinsコンテナにマウントさせている。
FROM jenkins/jenkins:lts USER root RUN mkdir -p /tmp/download && \ curl -L https://download.docker.com/linux/static/stable/x86_64/docker-18.03.1-ce.tgz | tar -xz -C /tmp/download && \ rm -rf /tmp/download/docker/dockerd && \ mv /tmp/download/docker/docker* /usr/local/bin/ && \ rm -rf /tmp/download && \ groupadd -g 999 docker && \ usermod -aG docker jenkins USER jenkins
DockerfileをbuildしてJenkinsコンテナ内にDockerをインストールし、jenkinsユーザーをdockerグループに入れている。
Vagrantを立ち上げてvagrant sshでVMに入ってDockerとdocker-composeをインストールする。 その後、docker-composeでJenkinsコンテナを立ち上げる。
vagrant up vagrant ssh # Dockerとdocker-composeが入っていない場合はインストールする。 # https://docs.docker.com/engine/install/ubuntu # ここからVM vagrant@ubuntu-xenial:~/workspace/jenkins/dockers$ docker-compose up -d --build vagrant@ubuntu-xenial:~/workspace/jenkins/dockers$ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------- dockers_jenkins_1 /sbin/tini -- /usr/local/b ... Up 0.0.0.0:50000->50000/tcp, 0.0.0.0:8080->8080/tcp
そしてJenkisコンテナでDockerが使えるか確認する。
vagrant@ubuntu-xenial:~/workspace/jenkins/dockers$ docker-compose exec jenkins bash # ここからJenkinsコンテナ jenkins@4b9925af6d61:/$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4b9925af6d61 dockers_jenkins "/sbin/tini -- /usr/…" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp dockers_jenkins_1
上記のようにVMで立ち上げたDockerプロセスがJenkinsコンテナにインストールしたDockerに共有されていることを確認した。
ハマったこと
Docker for MacでVagrantとVirtualBoxを使用せず、上記のようにして環境を構築してコンテナ内でdockerが使えるかどうか試してみたところ以下のようにPermissionエラーがでた。
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.37/containers/json: dial unix /var/run/docker.sock: connect: permission denied
調べてみるとコンテナ内でDockerを使いたい場合かつホストマシンとのsocketを共有したい場合、コンテナ内ユーザーがホストの一般ユーザーとuidを同一にする必要があるらしい。
コンテナ内のJenkinsユーザーのuidは1000になっているが、ホストマシンに同様のuidをもつユーザーがいなかったことが原因と思われる。
ホストマシンにユーザーを追加するのが億劫だったので、上記のようにVagrantで作成したUbuntuのVM環境を使用した。 Vagrantユーザーのuidはデフォルトで1000だったのでuidをいじることなく環境を作成できた。
# Jenkinsコンテナ jenkins@4b9925af6d61:/$ id jenkins uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins),999(docker)
# VM vagrant@ubuntu-xenial:~/workspace/jenkins/dockers$ id vagrant uid=1000(vagrant) gid=999(docker) groups=999(docker)