このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Docker入門】Ubuntuコンテナ

ここでは、Docker Composeコマンドを使ったUbuntuコンテナの構築例を紹介します。

Ubuntuとは

まず、簡単にUbuntuについて簡単におさらいしておきます。

 UbuntuはLinuxのディストリビューションであり、人気と実績を兼ね備えたOSです。カノニカル社からサポートを受けており、半年ごとに最新版をリリースしています。

 Ubuntuは、一般のデスクトップPC用OSとして知名度を高めてきましたが、近年はサーバーOSとしても注目されており、人気を集めています。また、UbuntuはDebianから派生しており、Ubuntuの開発はDebianのソースコードをベースに行われています。

URL:https://jp.ubuntu.com/

学習環境としてのUbuntuコンテナ

 UbuntuはLinuxの学習に最適な選択肢です。その理由はいくつかあります。まず第一に、Ubuntuは使いやすいデスクトップ環境を提供し、初心者でも比較的簡単に操作できます。また、豊富なドキュメントやチュートリアルがあり、学習プロセスをサポートします。さらに、大規模なコミュニティが存在し、フォーラムやオンラインチャットを通じて支援を受けることができます。Ubuntuは多様な用途に対応しており、さまざまな環境での学習を可能にします。

 UbuntuコンテナはLinuxの学習環境としても最適です。さまざまなパッケージをインストールしたり、操作を試してみて、失敗しても使い捨てにすればよいからです。

Ubuntuコンテナの作成

「compose.yaml」を作成して、Ubuntuコンテナを作成します。

不要なDockerオブジェクトの削除

まず、不要なDockerオブジェクトをすべて削除しておきます。

以下のコマンドを実行します。

・「docker system prune -a」コマンドを実行します。

Are you sure you want to continue? [y/N] の質問には「y」と入力します。

PS C:\Users\joeac> docker system prune -a
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
(略)

・「docker system prune -a」コマンドで削除されなかったDockerオブジェクトは、個別に削除しておきます。

環境によって削除されずに残っているDockerオブジェクトは異なります。

compose.yaml の作成

ディレクトリの作成と移動

Docker Composeでコンテナを作成するには、「compose.yaml」ファイルが必要になります。

 デフォルトでは、カレントディレクトリにある「compose.yaml」ファイルが読み込まれるため、作業ディレクトリに移動しておきます。

・「cd desktop/docker」コマンドを実行します。

PS C:\Users\joeac> cd desktop/docker
PS C:\Users\joeac\Desktop\docker>

 「compose.yaml」ファイルを保存する「ubuntu」ディレクトリを作成して、作成したディレクトリに移動します。次のコマンドを実行します。

  • 「mkdir ubuntu」コマンド
  • 「cd ubuntu」コマンド
PS C:\Users\joeac\Desktop\docker> mkdir ubuntu

    Directory: C:\Users\joeac\Desktop\docker

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2024/04/13    23:52                ubuntu

PS C:\Users\joeac\Desktop\docker> cd ubuntu
PS C:\Users\joeac\Desktop\docker\ubuntu>

VSCodeの起動

VSCodeで「compose.yaml」ファイルを作成します。

・「code compose.yaml」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\ubuntu> code compose.yaml

VSCodeが起動します。

「compose.yaml」ファイルの編集

・「compose.yaml」ファイルを以下のように編集して保存します。

services:
  ubuntu:
    image: ubuntu:22.04
    container_name: ubuntu_container
    tty: true

定義内容の解説

「compose.yaml」ファイルの定義を解説します。

フィールド説明
servicesサービスの定義を開始するセクション
ubuntuサービスの名前
image使用するDockerイメージを指定するフィールド
ubuntu:22.04というタグのUbuntuイメージを使用することを指定
container_nameコンテナに付ける名前を指定するフィールド
ubuntu_containerという名前を持つコンテナを作成することを指定
ttyコンテナにTTY(端末)を割り当てるかどうかを指定するブール値のフィールド
trueに設定されており、コンテナにTTYを割り当てることを指定
「compose.yaml」ファイルの定義

 この「compose.yaml」ファイルは、1つのサービス(ubuntu)を定義しています。このサービスは、Ubuntu 22.04のDockerイメージを使用し、ubuntu_containerという名前のコンテナを作成します。また、コンテナにTTYを割り当てるように設定されています。

コンテナとの対話処理

 Dockerコンテナが起動後にすぐに終了してしまう問題は、コンテナがフォアグラウンドで実行されるプロセスがないために発生します。通常、Dockerコンテナは、コンテナ内で実行されるプロセスが終了すると自動的に停止します。このため、コンテナ内に入って作業を行うためには、コンテナが起動したままである必要があります。

 ttyを設定することで、この問題を解決できます。「tty: true」を設定すると、コンテナにTTY(端末)が割り当てられ、コンテナがフォアグラウンドで実行されたかのように振る舞います。つまり、コンテナが起動した後も実行中のプロセスがない場合でも、コンテナが終了することがありません。その結果、ユーザーはコンテナ内に入ってコマンド操作を行うことができます

対話的な操作が必要な場合に、「tty: true」を設定します。

コンテナの作成と実行

「docker compose up -d」コマンドを実行します。

このコマンドは、「compose.yaml」ファイルを配置した場所で実行する必要があります。

PS C:\Users\joeac\Desktop\docker\ubuntu> docker compose up -d
[+] Running 2/2
 ✔ ubuntu 1 layers [⣿]      0B/0B      Pulled                                                                      5.3s
   ✔ bccd10f490ab Pull complete                                                                                    1.4s
[+] Running 1/2
 - Network ubuntu_default      Created                                                                             0.4s
 ✔ Container ubuntu_container  Started

Ubuntuコンテナへの接続

 「docker compose exec」コマンドを使用すると、実行中のコンテナ内でコマンドを実行したり、インタラクティブなシェルセッションを開始したりすることができます。

【構文】
docker compose exec [options] [service] [command]

  • options: オプションを指定する場合があります。例えば、-uオプションを使用してユーザーを指定したり、-Tオプションを使用してTTYの割り当てを制御したりします。
  • service: 実行するコマンドが属するサービス名を指定します。
  • command: 実行するコマンドを指定します。このコマンドは、指定されたサービス内で実行されます。

「docker compose exec ubuntu ls」コマンドを実行します。

Ubuntuコンテナのディレクトリ構成を確認します。

PS C:\Users\joeac\Desktop\docker\ubuntu> docker compose exec ubuntu ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
PS C:\Users\joeac\Desktop\docker\ubuntu>