Vagrant Docker providerでSSHができるまで

    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

    Profile picture

    Shin'ya Ueoka

    B2B向けSaaSを提供する会社の、元Webエンジニア。今はエンジニアリング組織のマネジメントをしている。