はじめに
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を使ってみる
1 2 |
> docker pull ubuntu:latest > docker run -it ubuntu /bin/bash |
Docker HUBを参考にFlaskを実行
別記事 FlaskでHello World! でFlaskアプリを動かしましたが、同じことをDockerを使ってやってみます。Docker Hub の ここ を参考にしました。
作業フォルダ(C:¥workと仮定します)の下で、myproject というサブフォルダ内にFlaskアプリ myproject.py を、作業フォルダ直下にDockerfileを配置します。
1 2 3 4 |
C:\work +-- myproject | +-- myproject.py +-- Dockerfile |
- myproject.py
1 2 3 4 5 6 7 8 9 10 11 |
# coding: utf-8 from flask import Flask app = Flask(__name__) @app.route('/') def main(): return "Hello world!" if __name__ == "__main__": app.run(debug=True, host="0.0.0.0") |
- Dockerfile
1 2 3 4 5 6 7 8 9 |
FROM python:alpine RUN pip install flask COPY myproject /src/ EXPOSE 5000 ENTRYPOINT ["python", "/src/myproject.py"] |
- 作業フォルダ C:¥work で次のように実行します。
1 2 |
$ docker build -t flasktest . $ docker run -p 5000:5000 flasktest |
ブラウザから http://localhost:5000 にアクセスすると動作が確認できるはずです。Dockerを使うと、イメージの準備から実行まで簡単にできてしまうことが分かったでしょうか?
イメージ・コンテナを整理する
Dockerを使っているとイメージやコンテナが溜まっていると思いますので、それを整理する方法を説明します。
- コンテナをすべて削除する
1 2 3 |
> docker ps -a (コンテナをすべて、停止中も含めて表示する) > docker stop $(docker ps -q) (コンテナをすべて停止する) > docker rm $(docker ps -aq) (コンテナをすべて削除する) |
- イメージを削除する
1 2 |
docker images (イメージの一覧を表示) docker rmi [イメージID] (指定されたイメージを削除する) |
1 2 3 4 5 6 7 8 9 |
PS C:\work> docker images REPOSITORY TAG IMAGE ID CREATED SIZE flasktest latest 1edfb614842f 2 days ago 910MB ubuntu latest d70eaf7277ea 4 weeks ago 72.9MB alpine latest d6e46aa2470d 4 weeks ago 5.57MB PS C:\Users\ma> docker rmi 1 Untagged: flasktest:latest Deleted: sha256:1edfb614842fb2c5d245c5b3af079b5b108ae5c678e759eb44af70f30e1dc6d0 PS C:\work> |
- コンテナを保存せずに実行する
コンテナを保存する必要が無い場合は、docker run コマンドに –rm オプション(ハイフンは2個続けて)を付けると、コンテナ終了時に自動的に破棄してくれます。一回限りテスト的に実行するには便利です。例えば先に説明したTutorialの例で、次のようにすると実行後にコンテナは残りません。
1 |
docker run -it --rm ubuntu /bin/bash |
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は無視される) |
コメント