takaya030の備忘録

PHP、Laravel、Docker などの話がメインです

Vagrant で ubuntu 20.04 + Docker 環境構築

VagrantVirtualBoxubuntu 20.04 の VM を構築したときの手順メモ

検証環境

Windows10 Home Edition (version 21H1)

chocolatey のインストール

こちらのサイトからインストールします
自分は PowerShell のインストールコマンドでインストールしました

chocolatey.org

Windows のソフトのインストール

PowerShell を管理者として実行
chocolatey で VirtualBoxvagrant、docker-cli、docker-compose をインストールする

PS D:\> choco install -y virtualbox
PS D:\> choco install -y vagrant
PS D:\> choco install -y docker-cli
PS D:\> choco install -y docker-compose

インストールが完了したら各ツールの動作確認

D:\>vagrant version
Installed Version: 2.2.18
Latest Version: 2.2.18

You're running an up-to-date version of Vagrant!

D:\>docker -v
Docker version 19.03.12, build 0ed913b8-

D:\>docker-compose -v
docker-compose version 1.29.2, build 5becea4c

vagrantプラグインのインストール

D:\>vagrant plugin install vagrant-disksize
D:\>vagrant plugin install vagrant-vbguest
D:\>vagrant plugin install vagrant-docker-compose

インストールされたか確認

D:\>vagrant plugin list
vagrant-disksize (0.1.3, global)
vagrant-docker-compose (1.5.1, global)
vagrant-vbguest (0.30.0, global)

Vagrantfile の作成

作業用ディレクトリを作成して vagant init を実行します

D:\>mkdir vagrant\focal64

D:\>cd vagrant\focal64

D:\vagrant\focal64>vagrant init ubuntu/focal64

作成された Vagrantfile を下記の内容に変更します。

# -*- mode: ruby -*-
# vi: set ft=ruby :

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

  config.vm.box = "ubuntu/focal64"

  config.vm.box_check_update = false

  config.vm.network "private_network", ip: "192.168.33.11"

  config.vm.provider "virtualbox" do |vb|
    # Display the VirtualBox GUI when booting the machine
    vb.gui = true
  
    # Customize the amount of memory on the VM:
    vb.memory = "2048"
  end

  config.vm.provision :docker
  config.vm.provision :docker_compose, compose_version: "1.29.2"

  config.vm.provision "shell", inline: <<-SHELL
    apt-get update -y

    gpasswd -a vagrant docker

    mkdir -p /etc/systemd/system/docker.service.d
    touch /etc/systemd/system/docker.service.d/options.conf
    echo '[Service]' > /etc/systemd/system/docker.service.d/options.conf
    echo 'ExecStart=' >> /etc/systemd/system/docker.service.d/options.conf
    echo 'ExecStart=/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2375' >> /etc/systemd/system/docker.service.d/options.conf

    touch /etc/docker/daemon.json
    echo '{"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}}' > /etc/docker/daemon.json
    chmod 600 /etc/docker/daemon.json

    systemctl daemon-reload
    systemctl restart docker

    if [ ! -d "/home/vagrant/google-cloud-sdk" ]; then
      sudo -u vagrant -i curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-389.0.0-linux-x86_64.tar.gz
      sudo -u vagrant -i tar -xf google-cloud-cli-389.0.0-linux-x86_64.tar.gz
    fi
  SHELL
end

仮想マシンの起動

vagrant up仮想マシンを起動します

D:\vagrant\focal64>vagrant up

vagrant ssh仮想マシンにログインします。

D:\vagrant\focal64>vagrant ssh

Google Cloud SDK のインストールを完了させるため、初回ログイン時のみ以下のコマンドを入力します

$ ./google-cloud-sdk/install.sh
$ source .bashrc

Docker の動作確認

プロビジョニングが正常に実行されていれば docker コマンドが使用可能になっています

vagrant@ubuntu-focal:~$ docker -v
Docker version 20.10.8, build 3967b7d

vagrant@ubuntu-focal:~$ docker-compose -v
docker-compose version 1.29.2, build 5becea4c

vagrant@ubuntu-focal:~$ docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Windows からのリモート接続の確認

Windows の docker コマンドが ubuntu の docker エンジンにリモート接続可能か確認します

D:\>set DOCKER_HOST=tcp://192.168.33.11:2375

D:\>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              d1165f221234        6 months ago        13.3kB

D:\>docker run --rm hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

参考サイト

takaya030.hatenablog.com

qiita.com

qiita.com

www.vagrantup.com

qiita.com

dockerlabs.collabnix.com

docs.docker.jp