WSL2 UbuntuでDocker EngineとDocker Composeを使えるようにする
TL;DR 要約
- Ubuntuコンソールの起動
- Dockerが公開しているリポジトリ情報の登録
cat << EOS | sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null Types: deb URIs: https://download.docker.com/linux/ubuntu Suites: $(lsb_release -cs) Components: stable Architectures: $(dpkg --print-architecture) Signed-By: $(curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sed "s/^/ /") EOS
- Docker Engine、Docker Composeのインストール
sudo apt-get update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- Docker Engine、Docker Composeの動作確認
# Docker Engine:Hello Worldの表示確認 docker run hello-world # Docker Compose:Hello Worldの表示確認 ## ディレクトリの作成 mkdir hello-world && cd $_ ## compose.ymlの作成 cat << EOF > compose.yml version: "3" services: hello: image: hello-world:latest EOF ## HelloWorld確認 docker compose run hello
目的
WindowsでLinux開発環境を用意したので、次はDockerを使えるようにしたい。
情報としては上位互換の記事が大量に存在していると思うけど、自分用として導入の過程で調べたことを残しておく。コンテナ技術は必修ってよく耳にする(気がする)ので。
仮想環境とは
Dockerってよく聞くけど、コンテナ型の仮想環境を用意できるぐらいの認識しかない。
ということで、まずはDockerについて調べる。
…と思ったのだが、そもそも前段のコンテナ型の仮想環境がよく分からない。
なので、まずは仮想化方式の概要を調べる。
概略
仮想化ソフトを導入することで、1つのハードウェアの上で、複数の仮想環境を提供することができる。
1つのハードウェアに複数の環境
仮想環境を構築するための仮想化方式は、以下の3つが存在する。
- ホストOS型
- ハイパーバイザー型
- コンテナ型
ホストOS型について
ホストOS型は、インストール済みのOS(ホストOS)の上に、環境を構築する仮想化方式だ。
ホストOS型のメリットは、使い慣れたパソコン上に通常のアプリケーションと同じ感覚でインストールできる導入の簡便さ、使用の容易さにある。
しかし、仮想環境とハードウェアリソースの間に必ずホストOSが介入してしまうため、動作が重く、余分なリソース消費も発生してしまう。
ホストOS型のイメージ
ホストOS型の代表的な仮想化ソフトには「VMware Player」「VirtualBox」がある。
よくある利用用途としては、アプリケーション開発における、ローカルPCでの開発/試験環境の構築である。
学習コストが低いため、開発者が容易に仮想環境を立ち上げることが可能なのだ。
ハイパーバイザー型について
ハイパーバイザー型は、ハードウェアへ直接、仮想化ソフトをインストールして、その上で環境を構築する仮想化方式だ。
ハイパーバイザー型のメリットは、高速な処理能力にある。ホストOSが介入しないため、仮想環境がハードウェアリソースをダイレクトに利用することができる。
一方デメリットは、ハイパーバイザー自体の専門知識が必要であることだ。また、ハイパーバイザーの製品によっては専用のハードウェアが必要となり、気軽に自身のPCに導入できないという点も厳しい。
ハイパーバイザー型のイメージ
ハイパーバイザー型の代表的な仮想化ソフトには「VMware vSphere」「Hyper-V」がある。
よくある利用用途としては、システムの本番環境/検証環境の運用への導入である。
実際に運用する場合は、高速な処理能力を活かさない手はない。
そのため、本番のシステムはハイパーバイザー型で構築されていることが多い。また、本番ミラーである検証用の環境構築も、同様に用いられる傾向にある。
コンテナ型について
コンテナ型は、ホストOSにインストールしたコンテナエンジンの上で、仮想環境(コンテナと呼ぶ)を構築する仮想化方式だ。
ホストOS型との大きな差異はゲストOSを必要としない点にある。コンテナの運用・管理もホストOSが直接行うのだ。
コンテナ型のメリットは、仮想環境ごとのゲストOSで用意するリソースが不要となる点にある。すべての処理をホストOSが担えるため、従来の方式と比べてリソース効率が良くて動作が高速だ。
また、仮想環境ごとのゲストOSの管理が不要な点もメリットといえる。ホストOSだけ管理すればよいのだ。
しかし、勿論デメリットもある。それは、ホストOSに依存してしまうということだ。コンテナ型の場合は、コンテナ毎に別のOSを使用することは叶わないため、要件によっては導入できないことがあるだろう。
コンテナ型の代表的な仮想化ソフトには「Docker」がある。
よくある利用用途としては、アプリケーション開発における、ローカルPCでの開発/試験環境の構築、そして、システムの本番環境/検証環境の運用への導入である。
デメリットを許容できる場合は、従来の仮想化方式と比較して優れているため、主流な仮想化技術というわけだ。
Dockerとは
仮想環境については何となく理解できたため、今度こそDockerの概要を調べる。
概略
Dockerとは、コンテナ型の仮想化方式を用いてアプリケーションの開発/配置/実行を行うためのオープンプラットフォームだ。
公式のドキュメントを見ると、様々なDocker XXXというコンポーネントがある。
Docker Toolbox (ツールボックス) は Mac OS X や Windows デスクトップ上に Docker Engine 、Machine、Compose といった Docker ツールを提供します。
Docker Engine (エンジン) は、Docker イメージの作成と Docker コンテナの実行に必要なコア機能を提供します。Engine を Ubuntu にインストールする方法や、 その他の一覧リスト をご覧ください。
Docker Machine (マシン) は自分のネットワークやクラウド上に、自動的にコンテナをデプロイします。Machine を Windows、Mac OS X、Windows にインストールできます。
Docker Swarm (スウォーム) はホストのクラスタリングとコンテナのスケジューリングに使われます。 “swarm” をデプロイする から、いくつかの短いステップで今日から使えます。
Docker Compose (コンポーズ) は複数のコンテナを使うアプリケーションを定義します。Docker Compose を Ubuntu、Mac OS X や、その他のシステム にインストールできます。
Docker Hub (ハブ) はイメージを管理するためのホステッド・レジストリ・サービス [1] です。Docker Hub と Docker Cloud では無料の Docker ID を使います。サインアップはこちらから です。
Docker Cloud (クラウド) は Docker イメージを自分のホスト上で構築・テスト・デプロイするためのホステッド・サービスです。 導入チュートリアル を確認し、初めてのサービスをデプロイしましょう。
Docker Trusted Registry (トラステッド・レジストリ) (DTR) はプライベートな専用イメージ・レジストリを提供します。チームでの DTR の使い方を学ぶには、概要 をご覧ください。
Docker Universal Control Plane (UCP) は Docker 対応アプリケーションのデプロイや管理を、オンプレミス上やファイアウォールの後ろでも行えるよう支援するツールです。詳しくは 概要 をご覧ください。
引用:https://docs.docker.jp/v1.11/index.html
概要を読む限り、個人開発において特に必要そうな以下の2つのコンポーネントについて、WSL2 Ubuntuに導入したい。
- Docker Engine
- Docker Compose
Docker Engineについて
コンテナ構築のコア機能。Dockerイメージの作成および、Dockerコンテナの実行/管理を担う。
Linuxカーネルを前提とするため、Docker EngineをインストールするホストOSはLinux系が必須となる。
Dockerはクライアント・サーバ型のアーキテクチャとなっている。クライアントからDockerデーモンに対して通信をすることで、コンテナの構築・実行が行える。
Dockerコンテナの起動イメージ
Docker Composeについて
複数のコンテナを使うシステムを定義・実行するためのツール。
本格的なシステムは、複数のコンテナ(アプリコンテナ、DBコンテナなど)を使用して構築される。
各コンテナのネットワークやデータボリュームなどの設定をComposeファイルにまとめて管理し、コマンド1つ実行することで全てのコンテナを作成・起動することができる。
Docker-Composeの使用イメージ
Docker Engine、Docker Composeのインストール
2023/05/07 追記
実は執筆時点でUbuntuのaptを曖昧理解のまま進めていた。そのあたりを調べてコチラの記事にまとめたら、Docker EngineとDocker Composeを同時にインストールする事ができると気付いたため、手順を追記する。
手順
-
リポジトリ情報ファイル(~.sources)を配置する
Dockerが公開しているaptリポジトリに接続するためのファイルを/etc/apt/sources.list.d/
配下に作成する。cat << EOS | sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null Types: deb URIs: https://download.docker.com/linux/ubuntu Suites: $(lsb_release -cs) Components: stable Architectures: $(dpkg --print-architecture) Signed-By: $(curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sed "s/^/ /") EOS
-
Docker Engine、Docker Composeのインストール
Docker公式docより。sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
-
Docker Engine動作確認(Hello from Docker! のメッセージ確認できたら成功)
docker run hello-world
Hello from Docker! -
Docker Compose動作確認(Hello from Docker! のメッセージ確認できたら成功)
# ディレクトリの作成 mkdir hello-world && cd $_ # compose.ymlの作成 cat << EOF > compose.yml version: "3" services: hello: image: hello-world:latest EOF # docker composeの実行 docker compose run hello
Hello from Docker!
トラブルシュート
docker runが実行できない①
以下のようなメッセージが表示されてしまう。
$ docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
原因
Dockerのプロセスが立ち上がってなかった。以下のコマンドでプロセスを立ち上げたら上手くいきました。
sudo service docker start
docker runが実行できない②
パーミッションが拒否されてしまう。
$ docker run hello-world
docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.
原因
dockerグループに所属するユーザか、rootユーザである必要があるとのこと。
インストールに成功しているのであれば、システム情報を表示します。もしも docker: command not found (訳:docker コマンドが見つかりません)や /var/lib/docker/repositories: permission denied (訳:権限がありません)のような表示が出る場合は、Docker のインストールが不完全か、コマンドでマシン上の Docker Engine にアクセスする権限がありません。Docker Engine の標準インストールでは、docker コマンドを実行するには docker グループに所属するユーザ、もしくは root の必要があります。
引用:https://docs.docker.jp/engine/quickstart.html#docker-engine
以下のコマンドでグループを追加すれば解決。
usermod -aG docker #USER名#
【旧】Docker Engineのインストール
【2023/05/07 追記】新規手順を追記しましたが、本手順も使用可能のため残します
WSL2 UbuntuにDocker Engineをインストールする。
導入イメージ
手順
参考手順:https://docs.docker.jp/v1.11/linux/step_one.html
- パッケージ情報の更新
sudo apt-get update
- dockerの最新パッケージをインストール
sudo curl -fsSL https://get.docker.com/ | sh
- インストール後の確認(Hello from Docker! のメッセージ確認できたら成功)
docker run hello-world
Hello from Docker!
【旧】Docker Composeのインストール
【2023/05/07 追記】新規手順を追記しましたが、本手順も使用可能のため残します
WSL2 UbuntuにDocker Composeをインストールする。
導入イメージ
手順
参考手順:https://docs.docker.jp/compose/install/compose-plugin.html#compose-install-using-the-repository
- パッケージ情報の更新
sudo apt-get update
- docker-composeのパッケージをインストール
sudo apt-get install docker-compose-plugin
- インストール後の確認(Hello from Docker! のメッセージ確認できたら成功)
# ディレクトリの作成
mkdir hello-world && cd $_
# compose.ymlの作成
cat << EOF > compose.yml
version: "3"
services:
hello:
image: hello-world:latest
EOF
# docker composeの実行
docker compose run hello
Hello from Docker!
些末な話
Docker Composeの実行コマンドは、ググると2種類あるようだ。
docker-compose version
docker compose version
どうやらComposeのバージョン違いのよう。
- Compose V1:docker-compose
- Compose V2:docker compose
Compose V1は2023年4月でEOLを迎えているため、世の記事で登場するdocker-composeコマンドは全て読み替える必要がある。
参考
仮想化方式について
Dockerについて
Discussion