はじめに
現在アサインされているプロジェクトの環境構築をするにあたり、従来はWSLのUbuntu上に環境構築を行い、そこでAPIインターフェースの設計のためにDockerをインストールしていました。
しかし現在はWSLのUbuntu上にDockerコンテナを立て、そこに環境構築を行っており、Dockerコンテナの中でDockerコマンドを使えるようにする必要がありました。
環境
WSL,Ubuntu,Dockerのバージョンは以下の通り。
ツール | バージョン |
---|---|
WSL | 2 |
Ubuntu | 24.04 |
Docker | 26.1.3 |
実際に行ったこと
やり方として2種類あります。
①DinD(Docker in Docker)
コンテナ内に完全なDockerエンジンをインストールして、コンテナ内で他のDockerコンテナを操作できるようにする方法
②DooD(Docker out of Docker)
コンテナ内でDockerデーモンをホストして、コンテナがホストのDockerデーモンに接続する方法
前者ではセキュリティ上のリスクやパフォーマンスの問題があるようなので今回は後者を実践してみます。
手順1:ホストのDockerソケットをコンテナにマウントして新しくコンテナを作成・起動する
docker run -v /var/run/docker.sock:/var/run/docker.sock -it --name <コンテナ名> <イメージ名> bash
簡単コマンド解説
docker run :指定したイメージから新しくコンテナを作成・起動するコマンドdocker run <イメージ名>
オプション | 説明 |
---|---|
-v | ホストのファイルシステムをコンテナにマウントする。 [マウントさせたいファイルまでの絶対パス] : [コンテナ側のディレクトリ] |
--name | コンテナの名前を指定する |
-i | コンテナの標準入力に接続する |
-t | 疑似ターミナルを割り当てる |
vオプションに関して参考になった記事
https://qiita.com/Mayumi_Pythonista/items/41e95a9c0fb02b878521
手順2:Dockerをインストールしてコマンドを実行
sudo apt-get install -y docker.io docker-compose //Dockerのインストール
sudo docker ps -a //稼働しているコンテナを確認
上手くいっていればこれで終了です。お疲れ様でした。
ここで手順1が上手くいっていないと、下記のようなエラーが発生します。
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Docker daemonに接続できませんと怒られています。
以下、理由について私の分かる範囲、調べた範囲で解説します。
注意
情報には細心の注意を払っておりますが、以下説明には誤情報や誤認識のある可能性がございます。
Dockerデーモンに接続できないとコマンドが実行できない理由
端的に言えば、
Dockerクライアントからのリクエストを処理しているのがDockerデーモンだから。
具体的な状況をイメージするために通常時と今回の状況を比較してみましょう。
★コンテナ外でDockerコマンドを実行する場合(通常)
Docker クライアント(例えば、docker ps や docker run などのコマンド)は Docker デーモンにリクエストを送信し、Docker デーモンがリクエストを処理しています。
そして、Dockerクライアントがリクエストを送信するためのインターフェースとしてdocker.sockというソケットファイルが存在しています。
⇒このソケットファイルのおかげでDockerデーモンとの通信が可能!!!
★コンテナ内でDockerコマンドを実行する場合(今回の状況)
①Dockerデーモンと接続するためのソケットファイルがコンテナ内に存在しない
②ホストとコンテナのファイルシステムはお互い独立して存在しているものであり、通常コンテナからホストのファイルシステムにはアクセスできない
⇒①②のため、上記のようなエラーメッセージが表示されます。
そこで、手順1のコマンドにあるようにvオプションを使ってホストのソケットファイルをコンテナにマウントしてあげると...
⇒コンテナ内からでもDockerデーモンとの通信が可能になる!
⇒Dockerコマンドが使用出来る!!!
まとめ
備忘録程度の拙い記事でしたが最後までお読みいただきありがとうございました。
環境構築を機に少しDockerに触れることが出来てよかったです。
そろそろ個人開発にも着手するので、そこで使う技術中心に手広く記事を書いていければと思います。