71
77

More than 3 years have passed since last update.

Windows10 HomeとWSL2でdocker-composeができるようにする

Last updated at Posted at 2019-10-15

はじめに

タイトルにあるとおりですがDocker ToolboxVirtualBoxを使わないで、docker-composeを使えるようにします。
Windows10 HomeではHyper-Vが動かないためDocker for Windowsを利用する事はできません。
そのためVirtualBoxvagrantを使って構築していましたが、WSLを試したところDockerを動かすことができました。
ですが、docker-composeは動かなかったため、今回WSL2に切り替えてみました。

ゴール

  • Windows10 HomeでDocker ToolboxVirtualBoxを使わずにWSL2を利用してdocker-composeできるようにする。
    • Windows10 Proでは仮想環境Hyper-V + Docker For Desktopの組み合わせでdocker-composeが使えます。

今回インストールした環境

  • Windows10 Home 64bit
  • Build Version: 18999.1 (アップデート後)
    • WindowsOSビルドのバージョンは作業前は上記ではなかったのですがWindows Insider Programで設定を行い、Windows Updateしています
  • WSL (Windows Subsystem for Linux) :2
    • LinuxOS:Ubuntu18.04

WSLを有効にしておきます

WSLはデフォルトで無効になっています。

1.コマンドラインからPowerShellを管理者権限で実行して、下記のコマンドを入力します。

PowerShell
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

下記のように表示されます。

PowerShell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6
PS C:\WINDOWS\system32> Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

Path          :
Online        : True
RestartNeeded : False

2.アプリと機能 > プログラムと機能 > Windowsの機能の有効化または無効化

Windows Sybsystems for Linuxにチェックを入れます。
(下の図で、赤い枠が囲われている部分)
image.png

3.Windowsを再起動します。

LinuxOSを確認

PowerShellを管理者権限で実行して、下記のコマンドを入力

wsl -l -v
下記のようにLegacyという文字や、
スタートメニュー > 最近追加されたもの にBash on Ubuntu on Windowsが表示されているかもしれません。

PowerShell
PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
* Legacy          Stopped         1

WindowsでWSLを利用する準備ができました。

WSL2を利用するためにWindows Updateを行います

※この作業に時間がかかりました。

  • コマンドプロンプトにwinverと入力するとWindowsのバージョン情報が確認できます。

    • OSビルドのバージョンを確認してもしなくても良いです。 (バージョンが18917以降であれば良いらしい)
  • OSビルドのバージョンをあげるにはWindows Insider Programで設定を行いましょう。

    • 設定 > 更新とセキュリティ > Windows Insider Program

Microsoft StoreでUbuntu18.04をインストール

  • WSLを有効化と、OSビルドのバージョンアップ後

Microsoft StoreでUbuntu18と検索すると、複数のUbuntuが表示されるので、Ubuntu18.04を選択します。
好みのバージョンをインストールして良いかと思われます、筆者はこれにしました。

  • 起動します

インストールが完了すると、起動を求められのでターミナルが表示されます。
Ubuntu側でインストールを行う、ユーザー名の作成とパスワードを設定します。

スタートメニュー > 最近追加されたものにUbuntu18.04 TLSが表示されています。

※もし上記のタイミングでターミナルを起動しなかった(ユーザーを作成していない)場合でも、別途Ubuntu18.04起動後はroot権限で立ち上がりますので、adduserコマンドによりユーザーを作成してください。
また、デフォルトで起動した際のユーザーを変更するにはPowerShellより変えられます。

PowerShell
ubuntu config --default-user ユーザー名

LinuxOSを確認する

下記のコマンドを入力
wsl -l -v

PowerShell
PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
  Ubuntu-18.04    Running         1
* Legacy          Stopped         1

WSL2へ切り替える

wsl --set-version <使いたいLinux名> 2
下記のコマンドを入力
wsl --set-version Ubuntu-18.04 2

PowerShell
PS C:\WINDOWS\system32> wsl --set-version Ubuntu-18.04 2

数分待った後に変換が完了します。
Windows10 HomeとWSL2のセットアップが完了しました。
Windowsマシンの再起動を行った後にDockerのインストールをはじめます。

ディストリビューションの切り替え

PowerShell
PS C:\WINDOWS\system32> wsl -s Ubuntu18.04

下記のコマンドを入力
wsl -l -v

PowerShell
PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Stopped         2
  Legacy          Stopped         1

デフォルトのディストリビューションが切り替わりました。

Ubuntu18.04のターミナルを開きます

スタートメニュー > Ubuntu18.04 TLS

WSL用にWindowsのディレクトリが自動的にマウントされる

Cドライブの場合、自動でこのようにマウントされています/mnt/c
例: /mnt/c/Users/ユーザー名/

aptパッケージ更新

Ubuntu18.04
$ sudo apt update
$ sudo apt upgrade -y

依存パッケージのインストール

Ubuntu18.04
$ sudo apt install -y apt-transport-https ca-certificates gnupg-agent software-properties-common curl

GPG keyを追加

Ubuntu18.04
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

安定版repositoryを追加

Ubuntu18.04
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

もう一度aptパッケージ更新

Ubuntu18.04
$ sudo apt update

Docker CEをインストール

Ubuntu18.04
$ sudo sudo apt install docker-ce docker-ce-cli containerd.io docker-compose -y

docker-compose インストール

docker-compose.ymlのversion3.4以上を使用する場合に最新を個別にインストールする

Ubuntu18.04
$ sudo curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/bin/docker-compose
$ sudo chmod +x /usr/bin/docker-compose

Docker起動

Ubuntu18.04
$ sudo service docker start

Dockerfileとdocker-compose.ymlを準備

ユーザー名の配下に下記のフォルダとファイルを用意しました。

フォルダ構成とファイル
docker
 └─ helloworld
    ├─ docker-compose.yml
    └─ helloworld.dockerfile
Ubuntu18.04
$ cd /mnt/c/Users/ユーザー名/docker/helloworld

Dockerfile

helloworld.dockerfile
FROM alpine:3.4

docker-compose.yml

docker-compose.yml
version: '3.7'

services:

  helloworld:
    build:
      context: .
      dockerfile: helloworld.dockerfile
    container_name: helloworld
    working_dir: /app/helloworld
    ports:
      - 80:80
    volumes:
      - .:/app/helloworld
    tty: true

docker-composeコマンドで起動

Ubuntu18.04
$ sudo docker-compose up -d
Creating network "helloworld_default" with the default driver
Building hello-world
Step 1/1 : FROM alpine:3.4
3.4: Pulling from library/alpine
c1e54eec4b57: Pull complete
Status: Downloaded newer image for alpine:3.4
 ---> b7c5ffe56db7

Successfully built b7c5ffe56db7
Successfully tagged helloworld_helloworld:latest
WARNING: Image for service helloworld was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating helloworld ... done 

起動してくれました!

今回はWindows10 Homeの環境でWSL2を利用しました。

おわりに

この記事ではsudoを付加してdockerコマンドを行っていますが、
一般ユーザをDockerグループに登録する事によりsudoは省略可能です。

しかし後述の「一般ユーザをDockerグループに登録せずに、非rootユーザで実行できるようにする」にもあるとおり、セキュリティ重視から、sudoをする方法にしておきます(sudoは結局rootで動かしている)
Rootlessモードを利用できるように継続して調べてみます。

参考

いろいろなQiitaや記事を拝見させていだだき有難うございます。その中でも特に参考にさせていただきました。

その他:一般ユーザをDockerグループに登録せずに、非rootユーザで実行できるようにする

参考: RootlessモードでDockerをより安全にする [DockerCon発表レポート]

Rootlessモードとは
Rootlessモードは、Dockerデーモン及びコンテナを、非rootユーザで実行する技術です。Rootlessモードを用いることにより、万一Dockerに脆弱性や設定ミスがあっても、攻撃者にホストのroot権限を奪取されることを防ぐことが出来ます。

RootlessモードのDockerをインストールする
RootlessモードのDockerは, curl -fsSL https://get.docker.com/rootless | sh コマンド1行で、ユーザのホームディレクトリ内に簡単にインストールすることが出来ます。sudo は不要です。ただし、 /etc/subuid および /etc/subgid が事前に設定されている必要がありますが、最近のLinuxディストリビューションではユーザ作成時に自動的に設定されることが多いので、たいていは考慮不要です。

今回、Rootlessモードのコマンドを実行してみたのですが、エラーとなり断念しました。

$ curl -fsSL https://get.docker.com/rootless | sh
cat: /lib/modules/4.19.72-microsoft-standard/modules.builtin: No such file or directory
# Missing system requirements. Please run following commands to
# install the requirements and run this installer again.
# Alternatively iptables checks can be disabled with SKIP_IPTABLES=1

cat <<EOF | sudo sh -x

modprobe ip_tables
EOF
$ cat <<EOF | sudo sh -x
> modprobe ip_tables
> EOF
+ modprobe ip_tables
modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/4.19.72-microsoft-standard/modules.dep.bin'
modprobe: FATAL: Module ip_tables not found in directory /lib/modules/4.19.72-microsoft-standard

これ以上は調べても、解決策の情報にめぐり合わなかったため、覚えておくことにします。

71
77
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
71
77