vagrantで構築したubuntuにdocker-composeを設定するサンプル

普段使いしているmacでちょっとした検証しようと思った時によく使うサンプルです。
※virtualboxとvagrantがインストールされていることが前提、この二つのインストールに関しては公式からパッケージダウンロードしてインストールするだけでいいと思います。
なお、私が初回にインストールした時にvagrant upが失敗して下記エラーが出ましたが
下記記事を参考にして動くようになりました。
https://qiita.com/nemui_/items/e6eb45210c173651b6ff

```
There was an error while executing `VBoxManage`, a CLI used by Vagrant for controlling VirtualBox. The command and stderr is shown below.
```

#概要
ubuntuを３台構築し、その中にdockerとdocker-composeをインストールします。

ネットワークは３台ともブリッジとホストオンリーアダプタ接続となっています。
ブリッジ接続：192.168.1.0/24(自宅のPCが192.168.1.0/24のため適当にIP降ってます）
ホストオンリーアダプタ接続：192.168.33.0/24

なお、vagrantfileにはブリッジ接続に使用するNICの名前を入力する必要があります。
具体的には「en0: Wi-Fi (Wireless)」この部分を「nmcli d s」とか「ifoncifg」で出力されたNIC名に書き換えてあげれば動作します。
※1 仮にvagrantfileに入力したNIC名が間違っていたとしても、vagrantからどのNICを使うか？というメッセージが出力されます。
そこで出力されたNIC名の番号を入力すれば正常に動作します。
※2 ブリッジで接続していれば基本的に何も考えずにインターネットも含めすべて接続できますが、
会社だと適当なIPを割り振りできないため、ホストオンリーアダプタの記載も書いています。
参考：https://qiita.com/feifo/items/0fde474005589afcff68



#使い方

###### ホームディレクトリ作成
ホームディレクトリ配下に「vagrant」ディレクトリを作成します。

```
$ mkdir -p ~/vagrant/provision
```

###### Vagrantfile作成
下記コマンドでVagrantfileを配置します。

```
cat <<EOF > ~/vagrant/Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # All Vagrant configuration is done here. The most common configuration
  # options are documented and commented below. For a complete reference,
  # please see the online documentation at vagrantup.com.

  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "bento/ubuntu-20.04"
  config

  config.vm.provider "virtualbox" do |vb|
    vb.cpus = 1
    vb.memory = 1028
  end

  config.vm.define :ubuntu1 do | ubuntu1 |
    ubuntu1.vm.hostname = "ubuntu1"
    ubuntu1.vm.network :private_network, ip: "192.168.33.10", virtualbox__intnet: "intnet"
    ubuntu1.vm.network "public_network", ip: "192.168.1.151", bridge: "en0: Wi-Fi (Wireless)"
    
  end

  config.vm.define :ubuntu2 do | ubuntu2 |
    ubuntu2.vm.hostname = "ubuntu2"
    ubuntu2.vm.network :private_network, ip: "192.168.33.20", virtualbox__intnet: "intnet"
    ubuntu2.vm.network "public_network", ip: "192.168.1.152", bridge: "en0: Wi-Fi (Wireless)"
  end

  config.vm.define :ubuntu3 do | ubuntu3 |
    ubuntu3.vm.hostname = "ubuntu3"
    ubuntu3.vm.network :private_network, ip: "192.168.33.30", virtualbox__intnet: "intnet"
    ubuntu3.vm.network "public_network", ip: "192.168.1.153", bridge: "en0: Wi-Fi (Wireless)"
  end



  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "provision/vagrant.yml"
  end

end
EOF
```

###### ansibleファイル作成

docker設定用のansibleファイルを配置します。

```
cat <<EOF > ~/vagrant/provision/vagrant.yml
- name: provisioning
  hosts: all
  become: yes
  gather_facts: True
  max_fail_percentage: 0
  vars:
    app_path: /vagrant
    home: /home/vagrant
    ruby_version: 2.5.1
  tasks:
    - name: set timezone to Asia/Tokyo
      timezone:
        name: Asia/Tokyo
    - name: set timezone to Asia/Tokyo
      timezone:
        name: Asia/Tokyo

    - name: Add docker GPG key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
      become: yes
    
    - name: Install basic list of packages
      apt:
        name: "{{ packages }}"
        state: present
        update_cache: yes
      vars:
        packages:
          - apt-transport-https
          - ca-certificates
          - curl
          - gnupg-agent
          - software-properties-common
      become: yes
    
    - name: Add apt repository
      apt_repository:
        repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
      become: yes
    
    - name: Install Docker packages
      apt:
        name: "{{ packages }}"
        state: present
      vars:
        packages:
          - docker-ce
          - docker-ce-cli
          - containerd.io
      become: yes
    
    - name: Add user to docker group
      user:
        name: "{{ ansible_env.USER }}"
        groups: docker
        append: yes
      become: yes
    
    - name: Ensure docker service is enabled
      systemd:
        name: docker
        state: started
        enabled: yes
      become: yes
    
    - name: Install docker-compose
      get_url:
        url: "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-{{ ansible_system }}-{{ ansible_architecture }}"
        dest: /usr/local/bin/docker-compose
        mode: +x
      become: yes
EOF
```

###### vagrant起動
下記コマンドでvagrantを起動させます。

```
$ cd ~/vagrant
$ vagrant up
```

起動が完了したら vagrant ssh ubuntu1 でSSH接続可能です。