「Docker Desktop」のおかげで docker-compose を使ったテスト環境構築が簡単になったと喜んでいましたが、
2021年8月31日に「Docker Desktop」が有料化されると発表されました。(個人や小規模な企業は無料とのこと)
会社で「Docker Desktop」を使ってテスト環境つくると費用が発生します。
費用がかかると、チームのDocker利用ユーザを管理し、費用計上するようという間接業務が発生してします。単にお金がかかるというだけでなく面倒極まりありません。

Dockerベースの開発環境を、
WSL2 と Ansibleを使って、Windows環境に構築してみます。

  • 実現したいこと(理想像)
    • チームメンバーが簡単に同じテスト環境を入手できること
    • 環境構築のために、手順を見ながら作業をすることを極力少なくしたい。
      手順を見ながら作業をすると、どうしても間違ったり、構築失敗する可能性が高くなる。
      (理想としては バッチやシェルをキックすれば 簡単に同じ環境になる)
    • 開発チーム個別の事情に併せてカスタマイズ可能

今回ご紹介する手順は、
Windows 10 Home」「Windows 10 Enterprise」の両方で実現できました。


前提条件・注意事項

オペレーション前に確認しておことや注意事項

BIOS設定

BIOS 設定で Virtualization Technology を Enabled にしておく必要あり

仮想化に関する Windows 機能を有効に

「Windowsの機能の有効化または無効化」を開いて以下をチェックを付ける (変更した後はWindowsを再起動する)

  • Hyper-V
    または
    Windows ハイパーバイザープラットフォーム
  • Linux 用 Windows サブシステム
  • 仮想化マシン プラットフォーム

管理者権限のコマンドプロンプト

管理者権限でコマンドプロンプトを開くには以下のような方法がある

  • コマンドプロンプトのアイコンを右クリックし「管理者として実行」
  • 通常のコマンドプロンプトで powershell start-process cmd -verb runas を実行する

WSLターミナル

  • ターミナルの起動方法
    • スタートメニューや wslコマンドを実行
    • コマンドプロンプトで wsl を実行
  • Windows Storeでインストールできる「Windows ターミナル」からWSLターミナルを利用できる。高機能でお奨め

ウイルス対策ソフトの影響

  • ウイルス対策ソフトによっては、 sudo apt ... や docker からの接続が遮断されます。ファイアウォールの設定を変更して回避してください。

    • Symantec Endpoint Protectionでは、「IP トラフィックを許可する」指定すると、接続できました。
      (WSL からの接続の場合、アプリケーションからの接続ではなく、Windowsのプロセスからの接続とみなされる模様)

使用するファイルを配置

"C:\abc" ディレクトリ作成し init.sh , testserver-ansible.yml , docker-compose-sample.yml 配置
(ディレクトリ "abc" は特別な意味ありません。異なる場所に配置したい場合は、 各ファイル中で出現する ディレクトリ名やこの後実行するコマンド中のディレクトリも変更してください)

ubuntu_install.bat

@rem *** 使用可能な一覧を参照する ***
@rem wsl --list --online

wsl --install -d Ubuntu-20.04

testserver-ansible.yml

- hosts: "{{ hosts_name }}"
  user: "{{ ansible_user }}"
  vars:
    docker_compose_version: "1.29.2"
    docker_user: "{{ docker_user_name | default('fooboo.user') }}"
  tasks:
  - name: apt update
    become: yes
    apt:
      update_cache: yes
  # 2021-8-9 時点 WSL2 上の Ubuntu20.4 ではエラーになる。(ただし、デフォルトで Winと同じタイムゾーンになっていた)
  # ターミナルで
  #   `sudo dpkg-reconfigure tzdata` を実行し、対話的に設定することで タイムゾーンを変更が可能
  # - name: set timezone to Asia/Tokyo
  #   become: yes
  #   timezone:
  #     name: Asia/Tokyo
  - name: Install packages
    become: yes
    apt:
      name: "{{ packages }}"
      state: present
      update_cache: yes
    vars:
      packages:
      - apt-transport-https
      - ca-certificates
      - curl
      - software-properties-common
      - gnupg-agent
      - git

  - name: Add an apt signing key for Docker
    become: yes
    apt_key:
      url: https://download.docker.com/linux/ubuntu/gpg
      state: present

  - name: Add apt repository for stable version
    become: yes
    apt_repository:
      repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable
      state: present

  - name: Install Docker
    become: yes
    apt:
      name: "{{ packages }}"
      state: present
      update_cache: yes
    vars:
      packages:
      - docker-ce
      - docker-ce-cli 
      - containerd.io

  - name: Add user to docker group
    become: yes
    user:
      name: "{{docker_user}}"
      group: docker

  - name: Download docker-compose {{ docker_compose_version }}
    get_url:
      url : https://github.com/docker/compose/releases/download/{{ docker_compose_version }}/docker-compose-Linux-x86_64
      dest: ~/docker-compose
      mode: '+x'

  - name: Check docker-compose exists
    stat: path=~/docker-compose
    register: docker_compose

  - name: Move docker-compose to /usr/local/bin/docker-compose
    become: yes
    command: mv /home/{{ ansible_user }}/docker-compose /usr/local/bin/docker-compose
    when: docker_compose.stat.exists

docker-compose-sample.yml

version: "3.8"
services:
  hello:
    image: hello-world:latest

以下オペレーション

Ubuntuインストール

管理者権限のコマンドプロンプトで実行

cd "C:\abc"
ubuntu_install.bat
  • インストール時に、Ubuntu用のユーザ名やパスワードの入力が求められる

Ansible インストール

コマンドプロンプトで WSLを一度停止する(ネットワーク環境を初期化するために実施)

wsl --shutdown
  • WSLターミナルで実行
cd ~; ln -s /mnt/c/abc ./abc
cd abc

sudo apt update
sudo apt install software-properties-common
sudo apt install ansible

ansible --version

テスト用Ubuntuのセットアップ

  • WSLターミナルで実行
cd ~/abc
ansible-playbook testserver-ansible.yml  --connection=local --extra-vars '{"docker_user_name":"<Ubuntu作成時のユーザ>","ansible_user":"<Ubuntu作成時のユーザ>","hosts_name":"127.0.0.1"}' --ask-become-pass

コマンドプロンプトで WSLを一度停止する(ネットワーク環境を初期化するために実施)

wsl --shutdown

docker デーモン確認と起動

WSL2 では、2021-9-13現在、デーモンが自動起動しないため (しぶしぶ) 手動で docker デーモンを起動する

sudo service docker start
  • docker デーモン起動状況は sudo service docker status で確認可能

docker-compose 動作確認

WSL2 で docker-compose -f docker-compose-sample.yml up を実行

  • 実行結果例
$ cd ~
$ docker-compose -f docker-compose-sample.yml up
Starting  ...(省略)
...
hello_1  | For more examples and ideas, visit:
hello_1  |  https://docs.docker.com/get-started/
hello_1  |
????_hello_1 exited with code 0

特記事項

Ansibleインストール

  • Ansible公式のインストール では、
    sudo add-apt-repository --yes --update ppa:ansible/ansible を実行するよう書かれているが、
    Ubuntu-20.04 ではエラーになる。

Windows ,WSL の相互ファイルアクセス

  • Windowsから WSLのディレクトリ参照
    \\wsl$\Ubuntu-20.04\
  • wsl Linux から Windows ディレクトリ参照
    /mnt/c/

    • Windows のファイルシステムに対して、シンボリックリンクを貼れる
      • (例) ln -s /mnt/c/_vm/testserver-ansible.yml testserver-ansible.yml

wsl VM のタイムゾーン指定

  • sudo dpkg-reconfigure tzdata で対話入力すると変更可能


感想

十分使えそうという印象。今後実際に使っていきたい

カスタマイズについて

  • VM 自体にインストールするパッケージについては、 Ansible 用 PlayBook をカスタマイズしてチーム配布すればよい。
    Ansible は非常に強力。やりたいことに合わせてカスタマイズ可能。(ただし、Ansible のノウハウ要)
  • 開発用 Docker 環境は、docker-compose 用のファイルを充実させることで対応可能。
    カスタマイズした docker-compose.yml をチームに配布すれば良い。(これが 今回の一連の手順の一番の目的)
  • よく使う Linuxコマンドや Winコマンドは シェルや batファイルを配布すれば、
    チームメンバー全員が同じ環境を共有できそう

良い

  • コマンド1発で完了とまでは否かないが、手順は比較的容易。許容範囲かと思う
  • Vagrant(VirtualBox使用)の定義ファイルを使って同様に環境構築を半自動するのと比較して、WSL2で構築するほうが圧倒的に早く構築できる。
  • Windows ,WSL の相互のファイルアクセス可能な点が非常に開発しやすい
  • 開発都合でのカスタマイズは比較的やりやすそう

悪い

  • WSL2ならでわの制約がある模様。使っているとほかにもハマりポイントがあるのではないかという点が心配
    (今回の手順でも以下の点がある)

    • デーモン確認が自動起動しない。
      systemctl , systemd などが簡易的に実現されているためとのこと
    • インストール関連の作業をすると "wsl --shutdown" しないと、VMからインターネットにアクセスできないことが発生する。
  • Kubernetes の管理の範囲(cpu、メモリのサイズ)などはこの構成ではむずかしい。
    (ただし、ローカルテスト環境でこのレベル求めるケース少ない認識)