Vagrant and Docker

Vagrant Docker providerを使うと、VagrantからDockerコンテナを起動できます。 VirtualBoxと違いオーバーヘッドが少ないので、もりもり環境を量産できて便利です。

Docker imageが元に環境が構築されるので、Vagrant Boxと違いvagrant sshをするための設定を行う必要があります。 この記事ではVagrant Docker providerでvagrant sshができるまでの、最小のDockerfileVagrantfileを紹介します。

Vagrantfile/Dockerfile

まず次のようなVagrantfileを記述します。

Vagrant.configure("2") do |config|

  # SSHの認証情報
  config.ssh.username = "vagrant"
  config.ssh.password = "vagrant"

  config.vm.define "hello-docker-provider" do |node|
    node.vm.provider "docker" do |docker|
      docker.build_dir = "."  # Dockerfileを含むディレクトリ
      docker.has_ssh = true   # コンテナはSSHが有効か
    end
  end
end

providerに"docker"を指定して、ブロック内にDockerの設定を行います。 build_dirDockerfileを含むディレクトリを指定し、has_sshでコンテナでSSHが有効かどうかを指定します。 config.sshでVagrantが鍵の埋め込みなどに使うための認証情報を指定します。 この認証情報でログインできるようなコンテナを作る必要があります。

続いてDockerfileです。

FROM ubuntu:16.04
RUN apt update && \
    apt install -y --no-install-recommends openssh-server sudo

RUN useradd --create-home --user-group vagrant && \
    echo -n 'vagrant:vagrant' | chpasswd && \
    echo 'vagrant ALL=NOPASSWD: ALL' >/etc/sudoers.d/vagrant

RUN mkdir -p /var/run/sshd
CMD /usr/sbin/sshd -D

openssh-serversudoをインストールします。 そしてVagrantfileで設定したユーザを追加してsudoできるようにします。 最後に、sshdCMDで起動します。

コンテナを立ち上げる

vagrant upでコンテナを立ち上げます。 裏でdocker builddocker runが走ります。

vagrant up 

Dockerfileを更新した場合は、vagrant reloadで再びdocker buildが走り、新たなイメージでコンテナが起動します。 もちろんコンテナなので、データはコンテナ破棄と同時に消えます。

vagrant reload

vagrant sshでログインできて、sudoが確認できればOKです。

vagrant ssh hello-docker-provider -- whoami
vagrant ssh hello-docker-provider -- sudo whoami