🐑

WSL2 UbuntuでDocker EngineとDocker Composeを使えるようにする

2023/04/16に公開

TL;DR 要約

  1. Ubuntuコンソールの起動
  2. 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
    
  3. 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
    
  4. 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つのハードウェアの上で、複数の仮想環境を提供することができる。
virtual image
1つのハードウェアに複数の環境
仮想環境を構築するための仮想化方式は、以下の3つが存在する。

  • ホストOS型
  • ハイパーバイザー型
  • コンテナ型

ホストOS型について

ホストOS型は、インストール済みのOS(ホストOS)の上に、環境を構築する仮想化方式だ。
ホストOS型のメリットは、使い慣れたパソコン上に通常のアプリケーションと同じ感覚でインストールできる導入の簡便さ、使用の容易さにある。
しかし、仮想環境とハードウェアリソースの間に必ずホストOSが介入してしまうため、動作が重く、余分なリソース消費も発生してしまう
HostOS
ホストOS型のイメージ
ホストOS型の代表的な仮想化ソフトには「VMware Player」「VirtualBox」がある。
よくある利用用途としては、アプリケーション開発における、ローカルPCでの開発/試験環境の構築である。
学習コストが低いため、開発者が容易に仮想環境を立ち上げることが可能なのだ。

ハイパーバイザー型について

ハイパーバイザー型は、ハードウェアへ直接、仮想化ソフトをインストールして、その上で環境を構築する仮想化方式だ。
ハイパーバイザー型のメリットは、高速な処理能力にある。ホストOSが介入しないため、仮想環境がハードウェアリソースをダイレクトに利用することができる。
一方デメリットは、ハイパーバイザー自体の専門知識が必要であることだ。また、ハイパーバイザーの製品によっては専用のハードウェアが必要となり、気軽に自身のPCに導入できないという点も厳しい。
Hypervisor
ハイパーバイザー型のイメージ
ハイパーバイザー型の代表的な仮想化ソフトには「VMware vSphere」「Hyper-V」がある。
よくある利用用途としては、システムの本番環境/検証環境の運用への導入である。
実際に運用する場合は、高速な処理能力を活かさない手はない。
そのため、本番のシステムはハイパーバイザー型で構築されていることが多い。また、本番ミラーである検証用の環境構築も、同様に用いられる傾向にある。

コンテナ型について

コンテナ型は、ホストOSにインストールしたコンテナエンジンの上で、仮想環境(コンテナと呼ぶ)を構築する仮想化方式だ。
ホストOS型との大きな差異はゲストOSを必要としない点にある。コンテナの運用・管理もホストOSが直接行うのだ。
コンテナ型のメリットは、仮想環境ごとのゲストOSで用意するリソースが不要となる点にある。すべての処理をホストOSが担えるため、従来の方式と比べてリソース効率が良くて動作が高速だ。
また、仮想環境ごとのゲストOSの管理が不要な点もメリットといえる。ホストOSだけ管理すればよいのだ。
しかし、勿論デメリットもある。それは、ホストOSに依存してしまうということだ。コンテナ型の場合は、コンテナ毎に別のOSを使用することは叶わないため、要件によっては導入できないことがあるだろう。
Container
コンテナ型の代表的な仮想化ソフトには「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デーモンに対して通信をすることで、コンテナの構築・実行が行える。
DockerArchitecture
Dockerコンテナの起動イメージ

Docker Composeについて

複数のコンテナを使うシステムを定義・実行するためのツール。
本格的なシステムは、複数のコンテナ(アプリコンテナ、DBコンテナなど)を使用して構築される。
各コンテナのネットワークやデータボリュームなどの設定をComposeファイルにまとめて管理し、コマンド1つ実行することで全てのコンテナを作成・起動することができる。
DockerCompose
Docker-Composeの使用イメージ

Docker Engine、Docker Composeのインストール

2023/05/07 追記
実は執筆時点でUbuntuのaptを曖昧理解のまま進めていた。そのあたりを調べてコチラの記事にまとめたら、Docker EngineとDocker Composeを同時にインストールする事ができると気付いたため、手順を追記する。

手順

  1. リポジトリ情報ファイル(~.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
    
  2. 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
    
  3. Docker Engine動作確認(Hello from Docker! のメッセージ確認できたら成功)
    docker run hello-world
    
    HelloDocker
    Hello from Docker!
  4. 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
    
    DockerCompose
    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をインストールする。
WSL2UbuntuInDocker
導入イメージ

手順

参考手順:https://docs.docker.jp/v1.11/linux/step_one.html

  1. パッケージ情報の更新
sudo apt-get update
  1. dockerの最新パッケージをインストール
sudo curl -fsSL https://get.docker.com/ | sh
  1. インストール後の確認(Hello from Docker! のメッセージ確認できたら成功)
docker run hello-world

HelloDocker
Hello from Docker!

【旧】Docker Composeのインストール

【2023/05/07 追記】新規手順を追記しましたが、本手順も使用可能のため残します

WSL2 UbuntuにDocker Composeをインストールする。
WSL2UbuntuInDockerCompose
導入イメージ

手順

参考手順:https://docs.docker.jp/compose/install/compose-plugin.html#compose-install-using-the-repository

  1. パッケージ情報の更新
sudo apt-get update
  1. docker-composeのパッケージをインストール
sudo apt-get install docker-compose-plugin
  1. インストール後の確認(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

DockerCompose
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コマンドは全て読み替える必要がある。

参考

仮想化方式について
https://www.splashtop.co.jp/knowhow/42/
https://www.dx-digital-business-sherpa.jp/blog/containerized-virtualization

Dockerについて
https://docs.docker.jp/v1.11/index.html
https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59
https://qiita.com/KEINOS/items/43d9415e351d80f78c8b

Discussion