Vagrant Docker providerを使うと、Vagrant から Docker コンテナを起動できます。 VirtualBox と違いオーバーヘッドが少ないので、もりもり環境を量産できて便利です。
Docker image が元に環境が構築されるので、Vagrant Box と違いvagrant sshをするための設定を行う必要があります。
この記事では Vagrant Docker provider でvagrant sshができるまでの、最小のDockerfileとVagrantfileを紹介します。
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
endprovider に"docker"を指定して、ブロック内に Docker の設定を行います。
build_dirでDockerfileを含むディレクトリを指定し、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 -Dopenssh-serverとsudoをインストールします。
そしてVagrantfileで設定したユーザを追加してsudoできるようにします。
最後に、sshdをCMDで起動します。
コンテナを立ち上げる
vagrant upでコンテナを立ち上げます。
裏でdocker buildとdocker runが走ります。
vagrant upDockerfile を更新した場合は、vagrant reloadで再びdocker buildが走り、新たなイメージでコンテナが起動します。
もちろんコンテナなので、データはコンテナ破棄と同時に消えます。
vagrant reloadvagrant sshでログインできて、sudoが確認できれば OK です。
vagrant ssh hello-docker-provider -- whoami
vagrant ssh hello-docker-provider -- sudo whoami