WindowsでVagrantを使ったdokcer環境構築

Windows で Vagrant を使った dokcer 環境構築

Windows で docker を使う

Windows で docker を使う場合、まず公式の docker for Windows を使うと思いますが、Linux 系のコンテナを動かそうとすると、ボリュームがうまくマウントされないなどの問題が発生します。

最近では、WSL2 で dokcer を動かすと解決するかもしれませんが、ここでは、Virtualbox + Vagrant で docker 環境を構築する方法を紹介します。
(VMで構築すると、環境のリセットがしやすいなどの利点があります。)

VM の OS は CentOS を使う

OS は CentOS7 を使います。
docker を動かすだけなら、 CoreOS という docker を動かすためだけの軽量な OS があるのですが、今回 SVN 等のツールをインストールしたかったことと、
日頃業務で使っていて慣れているため、この OS で docker 環境を構築します。

VagantFileの作成

下記内容をコピペして Vagrantfile という名前でファイルを作成してください。
CentOSのインストール、初期構築、Dockerにインストールを行う記述をしています。
社内的に、 SVN を利用するので、SVNのインストールも行っていますが、使用しない場合は、削除してもらっても構いません。

Vagrant.configure("2") do |config|
  # VM の IP(好きなIPに書き換えOK) ##############
  $ip = "192.168.33.60"
  ##########################################

  # デフォルトで guest additions によって共有フォルダをマウントしてくれるため bento を使用
  config.vm.box = "bento/centos-7"

  # ネットワーク設定
  config.vm.network "private_network", ip: $ip
  # 後で ホストPCでDockerにアクセスするためのポートを開放する設定
  config.vm.network "forwarded_port", guest: 2375, host: 2375, host_ip: "127.0.0.1"

  # メモリ/CPU
  config.vm.provider "virtualbox" do |vb|
    vb.memory = 2048
    vb.cpus = 2
  end

  # 同期フォルダ(ホストPCにマウントするパス。デフォルトはVagrantfileのあるディレクトリにしているので、適宜変更してOK)
  config.vm.synced_folder ".", "/vagrant", mount_options: ['dmode=777', 'fmode=777'], type: "virtualbox"
  # 初回起動時に実行する処理
  config.vm.provision "shell", inline: $initscript, privileged: false
end

# 初回起動時に実行するスクリプト
$initscript = <<END
    # カーネル更新すると、guest additions のバージョンが合わなくなるため除外
    sudo yum -y update --exclude=kernel*
    # 日本語化
    sudo yum reinstall -y glibc-common
    sudo yum -y install ibus-kkc vlgothic-*
    sudo localectl set-locale LANG=ja_JP.UTF-8
    source /etc/locale.conf
    sudo timedatectl set-timezone Asia/Tokyo
    sudo yum -y install man-pages-ja
    # ファイアーウォール停止
    sudo systemctl stop firewalld
    sudo systemctl disable firewalld
    # SELinux停止
    sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    # 一応初回起動時も無効状態にする
    sudo setenforce 0
    # httpd インストール(Webアプリでよく使用する、apacheユーザを作るためにインストール)
    sudo yum -y install httpd
    # svn インストール
    sudo yum install -y svn
    # ssh接続時のディレクトリを /vagrant にする
    echo "" >> /home/vagrant/.bashrc
    echo "cd /vagrant" >> /home/vagrant/.bashrc
    # sshログイン時に何も表示しない
    touch ~/.hushlogin

    # docker インストール
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    sudo yum install -y docker-ce docker-ce-cli containerd.io

    # latestバージョン番号を取得しつつ docker-compose をインストール
    sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep tag_name | sed -e 's/[^0-9\.]//g')/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose

    # VSCodeで閲覧するための設定
    sudo sed -i "s*ExecStart=/usr/bin/dockerd*ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375*g" /usr/lib/systemd/system/docker.service
    export DOCKER_HOST="tcp://0.0.0.0:2375"
    echo "export DOCKER_HOST=\"tcp://0.0.0.0:2375\"" >> /home/vagrant/.bashrc

    # docker起動
    sudo systemctl start docker
    sudo systemctl enable docker

    # docker group に vagrantを 追加
    sudo usermod -aG docker vagrant
END

Vagrant up によりVM起動

Vagrantfile のあるディレクトリで$ vagrant up するだけで、docker 環境の構築は完了です。

VM が起動したら、$ vagrant ssh で ssh ログインして、 docker, docker-compose コマンドを使うことができます。

下記のように実行できれば無事Docker実行環境が構築できています。

$ docker -v
Docker version 19.03.12, build 48a66213fe
$ docker-compose -version
docker-compose version 1.26.2, build eefe0d31

Hello World コンテナの実行も確認できるはずです。

$ docker run hello-world

出来上がったDocker実行環境で、いろいろ Docker を使ってみてください。
ちなみに、VMを停止する場合は、 $ vagrant halt と実行してください。

注意点

カーネルはupdateしない

guest additions のバージョンが合わなくなり、うまく共有フォルダがマウントされなくなるなどの不具合が起きるため、カーネルは update しないように気をつけてください。

Vagrantfile の内容の補足

docker-compose のインストールについて

# latestバージョン番号を取得しつつ docker-compose をインストール
sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep tag_name | sed -e 's/[^0-9\.]//g')/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

手動で docker-compose のバージョンを指定する方法を紹介されているサイトが多いですが、
ここでは、 github よりバージョンを取得していることで、上記の Vagrantfile をそのままコピペするだけで、docker-composeをインストールできるようにしています。