何かやってみるブログ

興味をもったこと、趣味のこと、技術について色々書きます。

[Jenkinsメモ] docker-composeで立ち上げたJenkinsコンテナの中でdockerを使えるようにする。

概要

以前、docker-composeで立ち上げたJenkinsコンテナ内でDockerが使用できる環境を作る時に詰まったので、メモに残す。

www.takayasugiyama.com

構築作業

構築には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)