はじめに
タイトルにあるとおりですがDocker Toolbox
やVirtualBox
を使わないで、docker-composeを使えるようにします。
Windows10 HomeではHyper-V
が動かないためDocker for Windows
を利用する事はできません。
そのためVirtualBox
+ vagrant
を使って構築していましたが、WSL
を試したところDockerを動かすことができました。
ですが、docker-composeは動かなかったため、今回WSL2
に切り替えてみました。
ゴール
- Windows10 Homeで
Docker Toolbox
やVirtualBox
を使わずに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を管理者権限で実行して、下記のコマンドを入力します。
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
下記のように表示されます。
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
にチェックを入れます。
(下の図で、赤い枠が囲われている部分)
3.Windowsを再起動します。
LinuxOSを確認
PowerShellを管理者権限で実行して、下記のコマンドを入力
wsl -l -v
下記のようにLegacy
という文字や、
スタートメニュー > 最近追加されたもの にBash on Ubuntu on Windows
が表示されているかもしれません。
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より変えられます。
ubuntu config --default-user ユーザー名
LinuxOSを確認する
下記のコマンドを入力
wsl -l -v
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
PS C:\WINDOWS\system32> wsl --set-version Ubuntu-18.04 2
数分待った後に変換が完了します。
Windows10 HomeとWSL2のセットアップが完了しました。
Windowsマシンの再起動を行った後にDockerのインストールをはじめます。
ディストリビューションの切り替え
PS C:\WINDOWS\system32> wsl -s Ubuntu18.04
下記のコマンドを入力
wsl -l -v
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パッケージ更新
$ sudo apt update
$ sudo apt upgrade -y
依存パッケージのインストール
$ sudo apt install -y apt-transport-https ca-certificates gnupg-agent software-properties-common curl
GPG keyを追加
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
安定版repositoryを追加
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
もう一度aptパッケージ更新
$ sudo apt update
Docker CEをインストール
$ sudo sudo apt install docker-ce docker-ce-cli containerd.io docker-compose -y
docker-compose インストール
docker-compose.ymlのversion3.4以上を使用する場合に最新を個別にインストールする
$ 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起動
$ sudo service docker start
Dockerfileとdocker-compose.ymlを準備
ユーザー名の配下に下記のフォルダとファイルを用意しました。
docker
└─ helloworld
├─ docker-compose.yml
└─ helloworld.dockerfile
$ cd /mnt/c/Users/ユーザー名/docker/helloworld
Dockerfile
FROM alpine:3.4
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コマンドで起動
$ 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や記事を拝見させていだだき有難うございます。その中でも特に参考にさせていただきました。
-
WSL2でdocker-composeを使えるようにするまで
-
WSL2のインストール方法【WindowsにLinuxを使う!】
その他:一般ユーザを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
これ以上は調べても、解決策の情報にめぐり合わなかったため、覚えておくことにします。