WSL2でDocker

はじめに

Docker とは何か? ここでは詳しく説明しませんので基本的なことは自分で学習してください。まず Youtube の これ とか これ なんか見ると全体像が分かるかもしれません。

これまで Docker の実行環境を作るのは敷居が高く苦労したものですが、Windows 10 で WSL2がリリースされてからずいぶん改善されました。Docker Desktop が WSL2 に対応したおかげで Windows Home でも実行することができるようになりました。ただしWindows 10 のバージョン2004以降であることが条件です。

この記事ではWSL2がインストールされたWindows 10 を前提としてDockerの使い方を説明します。下記のサイトを参考にさせていただきました。

Windows 10 Home で WSL 2 + Docker を使う

WSL2のインストールについては 別記事 を参考にしてください。Macもほぼ同じですが、Apple Silicon を搭載したMacについてはDockerが対応中とのことです。

なお、誤解しないで欲しいのは、WSL2のシェルの中でDockerコマンドが使えるようになるのではありません。直接使うのはパソコン上のアプリ Docker Desktop であり、そのバックエンドでWSL2が動きます。

Docker Desktop をインストール

  • Docker Hub

まず Docker Hub にサインアップしておいてください。Docker HUB はここです。 Docker Hub のアカウントで Docker Desktop にもサインインします。

  • Docker Desktop

Dockerのサイト からWindowsまたはMac用の Docker Desktop をダウンロードしてください。バージョンを選択する場合は名前に (stable) と書かれた安定版を選んでください。

インストールを実行しますが、Windowsの場合は “Configuration” の画面で表示される “Enable WSL 2 Windows Features” のチェックを外さないように注意してください。

インストーラーが終わるとWindowsを一旦サインアウトするよう誘導されます。再ログインするとDocker Desktopが起動して、タスクトレイにDockerアイコン(クジラのアイコン)があるはずです。Tutorialが表示されますがスキップして構いません。

Docker Desktop の初期画面の歯車アイコンからSettings画面に入り、下記の2点について確認してください。
(1) [General] タブの中、”Use the WSL 2 based engine” がチェックされていること。
(2) [Resources]→[WSL INTEGRATION] の中、”Enable integration with my default WSL distro” がチェックされていること。

  • イメージの保存場所

Dockerを使っているとイメージやコンテナでパソコンのストレージをどんどん使ってしまいます。D:ドライブ等があるなら、保存場所を変更しておくとC:ドライブが圧迫されずに済みます。その方法は例えば ここ を参照してください。

Tutorial

簡単なTutorialをやってみましょう。コマンドはPowerShell(Macの場合はターミナル)を使います。テキストエディタに VSCode(Visual Studio Code)を使っているなら、VSCodeのターミナル機能でも構いません。

Ubuntuを使ってみる

これだけでUbuntuのシェルに入ります。Dockerがいかに手軽に動作するか感じてもらえると思います。Linuxコマンドをいくつか試してください。シェルを抜けるのは exit です。

Docker HUBを参考にFlaskを実行

別記事 FlaskでHello World! でFlaskアプリを動かしましたが、同じことをDockerを使ってやってみます。Docker Hub の ここ を参考にしました。

作業フォルダ(C:¥workと仮定します)の下で、myproject というサブフォルダ内にFlaskアプリ myproject.py を、作業フォルダ直下にDockerfileを配置します。

  • myproject.py

  • Dockerfile

  • 作業フォルダ C:¥work で次のように実行します。

ブラウザから http://localhost:5000 にアクセスすると動作が確認できるはずです。Dockerを使うと、イメージの準備から実行まで簡単にできてしまうことが分かったでしょうか?

イメージ・コンテナを整理する

Dockerを使っているとイメージやコンテナが溜まっていると思いますので、それを整理する方法を説明します。

  • コンテナをすべて削除する
  • イメージを削除する
指定するイメージIDは、他のIDと区別できれば先頭の数文字で構いません。下はその例です。
  • コンテナを保存せずに実行する

コンテナを保存する必要が無い場合は、docker run コマンドに –rm オプション(ハイフンは2個続けて)を付けると、コンテナ終了時に自動的に破棄してくれます。一回限りテスト的に実行するには便利です。例えば先に説明したTutorialの例で、次のようにすると実行後にコンテナは残りません。

Cheat Sheet

  • 環境
docker Help表示
docker help Help表示
docker version バージョン表示
docker info Dockerの状態を表示
  • イメージ関係
docker images イメージの一覧
docker pull [イメージ名:タグ名] 例: docker pull ubuntu:latest イメージの入手
“:タグ名” を省略すると “latest” になる
docker build -t [イメージ名:タグ名] [DockerfileのPath] ビルド実行
docker rmi [イメージID] イメージを削除する
  • コンテナ実行
docker run [オプション] [–name {コンテナー名}] {イメージ名}[:{タグ名}] [コンテナーで実行するコマンド] [引数] 例: docker run hello-world ビルドしてコンテナ実行。イメージが無ければビルドする。
docker start [オプション] コンテナID コンテナを実行。ビルドはしない。
docker exec [オプション] コンテナID 既に起動しているコンテナでコマンドを実行する

docker run コマンドのオプション

-it コンソールに結果を出力
-p {公開ポート番号:コンテナ内ポート番号} ポートフォワーディングの指定
-d バックグラウンドで実行する
–rm コンテナ停止と同時に破棄する
  • コンテナ停止と破棄・管理
docker ps コンテナ一覧(実行中のコンテナのみ表示する)
docker ps -a
<Option>
-a
-q
コンテナ一覧(実行してないコンテナも含めて表示する)
-a  : Allの意味
-q  : Quietの意味でコンテナIDだけを表示する
(他のコマンド組み合わせて良くつかわれる)
docker stop $(docker ps -q) コンテナを全部停止
docker rm [コンテナID] 指定したコンテナを削除。IDは区別できる先頭の数文字でOK
docker rm $(docker ps -aq) コンテナを全部削除

Dockerfile の Cheat Sheet

FROM 作成するイメージのベースとなるイメージを指定。alpine(Alpine Linux)は軽量で Docker と相性が良いのでよく使われる。
LABEL 作者のサインなど。
RUN ビルド時にコンテナ内で実行するコマンド。aptでモジュールをインストールしたり等。
COPY ホスト上のファイルやディレクトリをコンテナ内にコピーする。
ADD COPYに似ているがアーカイブを記述すると展開してくれる。
ENV コンテナ内で使える環境変数。
WORKDIR コンテナの作業ディレクトリ。
CMD ・コンテナ内で実行されるコマンド。コマンドを空白で区切って配列で渡す。
例: [“python”, “/src/app.py”] ・配列の形で渡さない場合はシェルで実行され、実行環境が少し異なる。
・docker run の引数でコマンドは上書きされて無視される。
ENTRYPOINT ・CMDと違い、上書きができない(例外: docker run –entrypoint=”” で上書き可能)
・docker run で引数指定すると、ENTRYPOINTのコマンドへの引数になる。
・CMDとENTRYPOINTを併記した場合、
– CMDの内容はENTRYPOINTへの引数になる。
– docker run の引数はENTRYPOINTのコマンドへの引数になる(CMDは無視される)

 

コメント