目次

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

イメージにソフトウェアをインストールする方法


 Dockerイメージは、特定のアプリケーションやサービスを実行するための軽量でポータブルな実行環境を提供しますが、デフォルトのDockerイメージには必要なすべてのソフトウェアが含まれているわけではありません。特定のアプリケーションに依存する追加のライブラリ、ツール、またはパッケージなどが必要な場合があります。

 そのような場合、Dockerイメージに特定のソフトウェアをインストールしてオリジナルのイメージを作成する必要があります。このためには、Dockerfileと呼ばれるテキストファイルを使用して、Dockerイメージのビルドプロセスを定義します。Dockerfileには、基本となるベースイメージの指定や追加のパッケージのインストール手順が含まれます。

 ソフトウェアをインストールするためには、一般的にパッケージマネージャーのコマンドを使用します。しかし、異なるディストリビューションでは異なるパッケージマネージャーが利用されています。例えば、DebianやUbuntuではapt、CentOSやRed Hat Enterprise Linuxではyum、Alpine Linuxではapkなどが使われます。

 したがって、Dockerfileを作成する際には、対象となるディストリビューションに合わせて適切なパッケージマネージャーのコマンドを使用する必要があります。それによって、特定のソフトウェアをDockerイメージにインストールし、必要な環境を構築することが可能になります。

パッケージマネージャーの種類

 以下は、一般的なパッケージマネージャーとそれらが使用される主要なディストリビューションの表です。

パッケージマネージャーディストリビューション
aptDebian, Ubuntu
yumCentOS, Red Hat Enterprise Linux
dnfFedora
apkAlpine Linux
パッケージマネージャーの種類

 これらのパッケージマネージャーは、それぞれのディストリビューションに固有のものであり、ソフトウェアのインストールや管理に使用されます。Dockerfileで特定のディストリビューション向けにパッケージマネージャーのコマンドを使用することで、Dockerイメージにソフトウェアをインストールすることができます。

パッケージマネージャーに適したDockerfileの例

 それぞれのパッケージマネージャーに適したDockerfileの例を示します。実際に操作をしながら、それぞれのパッケージマネージャーを使用してPythonをインストールする方法を解説していきます。

 Pythonイメージを利用すれば、わざわざPythonをインストールする必要はないのですが、ここでは、あえて、各ディストリビューションのイメージにPythonをインストールしていきます。

不要な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オブジェクトは異なります。

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

作業ディレクトリ(/desktop/docker)に移動してDockerfileを保存するディレクトリを作成します。

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

  • 「cd desktop/docker」
  • 「mkdir py_ubuntu」
  • 「mkdir py_centos」
  • 「mkdir py_fedora」
  • 「mkdir py_alpine」
PS C:\Users\joeac> cd desktop/docker
PS C:\Users\joeac\Desktop\docker> mkdir py_ubuntu

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

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2024/04/22    23:44                py_ubuntu

PS C:\Users\joeac\Desktop\docker> mkdir py_centos

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

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2024/04/22    23:44                py_centos

PS C:\Users\joeac\Desktop\docker> mkdir py_fedora

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

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2024/04/22    23:44                py_fedora

PS C:\Users\joeac\Desktop\docker> mkdir py_alpine

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

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2024/04/22    23:45                py_alpine

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

apt(Debian, Ubuntu)

・「code ./py_ubuntu/Dockerfile」コマンドを実行して、下の内容を入力して保存します。
# ベースイメージの指定
FROM ubuntu:latest

# イメージの更新とPythonのインストール
RUN apt-get update && apt-get install -y \
    python3 \
    && rm -rf /var/lib/apt/lists/*

 このDockerfileでは、ubuntu:latestをベースイメージとして使用し、apt-getコマンドを使用してPythonをインストールしています。

コマンド意味
RUN apt-get updateパッケージリストの更新。最新のパッケージ情報を取得する。
&&前のコマンドが成功した場合にのみ、次のコマンドを実行する。
apt-get install -y python3python3パッケージをインストールする。-yオプションは、インストール中に確認プロンプトをスキップし、デフォルトで「はい」を選択する。
\コマンドを複数行にわたって記述する際に使用するエスケープ文字。
&&前のコマンドが成功した場合にのみ、次のコマンドを実行する。
rm -rf /var/lib/apt/lists/*パッケージリストのキャッシュを削除する。不要なデータをクリーンアップしてイメージのサイズを小さくする。
RUNコマンドの意味
・「docker image build -t py_ubuntu:v1 ./py_ubuntu」コマンドを実行します。

PythonがインストールされたUbuntuイメージを作成します。

PS C:\Users\joeac\Desktop\docker> docker image build -t py_ubuntu:v1 ./py_ubuntu
[+] Building 0.0s (0/0)  docker:default
2024/04/23 00:13:04 http2: server: error reading preface from client //./pipe/docker_engine: file has already been close[+] Building 24.7s (7/7) FINISHED                                                                        docker:default
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 243B                                                                               0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest                                                   2.4s
 => [auth] library/ubuntu:pull token for registry-1.docker.io                                                      0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [1/2] FROM docker.io/library/ubuntu:latest@sha256:1b8d8ff4777f36f19bfe73ee4df61e3a0b789caeff29caa019539ec7c9a  1.7s
 => => resolve docker.io/library/ubuntu:latest@sha256:1b8d8ff4777f36f19bfe73ee4df61e3a0b789caeff29caa019539ec7c9a  0.0s
 => => sha256:7af9ba4f0a47d9bc8b1ffa492c6b0276476f1889cf4e699fba2236924e5932ed 2.30kB / 2.30kB                     0.0s
 => => sha256:3c645031de2917ade93ec54b118d5d3e45de72ef580b8f419a8cdc41e01d042c 29.53MB / 29.53MB                   0.8s
 => => sha256:1b8d8ff4777f36f19bfe73ee4df61e3a0b789caeff29caa019539ec7c9a57f95 1.13kB / 1.13kB                     0.0s
 => => sha256:6f6ec53d36a9504f01e3636cf68e0e03761a3b6947a95ba430ae553ee3aaf4d9 424B / 424B                         0.0s
 => => extracting sha256:3c645031de2917ade93ec54b118d5d3e45de72ef580b8f419a8cdc41e01d042c                          0.7s
 => [2/2] RUN apt-get update && apt-get install -y     python3     && rm -rf /var/lib/apt/lists/*                 20.4s
 => exporting to image                                                                                             0.1s
 => => exporting layers                                                                                            0.1s
 => => writing image sha256:3e5030b05919f623dc88b62210dbfc1d387e6f49b5f251afe12d678730a03475                       0.0s
 => => naming to docker.io/library/py_ubuntu:v1                                                                    0.0s

View build details: docker-desktop://dashboard/build/default/default/ikstx1etydejc6mxlxtutzdoh
PS C:\Users\joeac\Desktop\docker>

 以下のコマンドを使って、コンテナを作成してPythonのバージョンを確認し、コンテナが終了すると自動的にコンテナを削除します。

・「docker container run --rm py_ubuntu:v1 python3 --version」コマンドを実行します。
コマンド意味
docker container runDockerコンテナを実行するコマンド。
--rmコンテナが終了した後、自動的にコンテナを削除するオプション。
py_ubuntu:v1実行するイメージの指定。py_ubuntu:v1は、先ほど作成したイメージのタグ。
python3 --versionコンテナ内で実行されるコマンド。ここでは、Pythonのバージョンを表示するコマンド。
RUNコマンドの意味

 以上のコマンドを組み合わせることで、py_ubuntu:v1イメージから新しいコンテナを作成し、その中でPythonのバージョンを確認し、コンテナが終了した後に自動的にコンテナを削除することができます。

PS C:\Users\joeac\Desktop\docker> docker container run --rm py_ubuntu:v1 python3 --version
Python 3.10.12

Pythonのバージョンが表示されます。

yum(CentOS, Red Hat Enterprise Linux)

・「code ./py_centos/Dockerfile」コマンドを実行して、下の内容を入力して保存します。
# ベースイメージの指定
FROM centos:centos7

# イメージの更新とPythonのインストール
RUN yum update -y && yum install -y \
    python3 \
    && yum clean all

 このDockerfileでは、centos:latestをベースイメージとして使用し、yumコマンドを使用してPythonをインストールしています。

コマンド意味
RUN yum update -yインストール可能なパッケージの最新バージョンを取得し、システムを更新する。
&&前のコマンドが成功した場合にのみ、次のコマンドを実行する。
yum install -y python3Python3パッケージをインストールする。-yオプションは、インストール中に確認プロンプトをスキップし、デフォルトで「はい」を選択する。
\コマンドを複数行にわたって記述する際に使用するエスケープ文字。
&&前のコマンドが成功した場合にのみ、次のコマンドを実行する。
yum clean allキャッシュや一時ファイルをクリーンアップする。
RUNコマンドの意味
・「docker image build -t py_centos:v1 ./py_centos」コマンドを実行します。

PythonがインストールされたCentoOSイメージを作成します。

PS C:\Users\joeac\Desktop\docker> docker image build -t py_centos:v1 ./py_centos
2024/04/23 00:32:28 http2: server: error reading preface from client //./pipe/docker_engine: file has already been closed
[+] Building 0.0s (0/0)  docker:default
2024/04/23 00:32:28 http2: server: error reading preface from client //./pipe/docker_engine: file has already been close[+] Building 28.7s (6/6) FINISHED                                                                        docker:default
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 225B                                                                               0.0s
 => [internal] load metadata for docker.io/library/centos:centos7                                                  1.6s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [1/2] FROM docker.io/library/centos:centos7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487  3.8s
 => => resolve docker.io/library/centos:centos7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487  0.0s
 => => sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9 2.75kB / 2.75kB                     0.0s
 => => sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 76.10MB / 76.10MB                   1.7s
 => => sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 1.20kB / 1.20kB                     0.0s
 => => sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f 529B / 529B                         0.0s
 => => extracting sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc                          1.9s
 => [2/2] RUN yum update -y && yum install -y     python3     && yum clean all                                    22.5s
 => exporting to image                                                                                             0.7s
 => => exporting layers                                                                                            0.7s
 => => writing image sha256:844dd3121c655a06ba1c368963cf467c12e25c3d75789f6c17542112e6ee854f                       0.0s
 => => naming to docker.io/library/py_centos:v1                                                                    0.0s

View build details: docker-desktop://dashboard/build/default/default/qkgmhqg8ndzdc9mwti31njpk6
PS C:\Users\joeac\Desktop\docker>

 以下のコマンドを使って、コンテナを作成してPythonのバージョンを確認し、コンテナが終了すると自動的にコンテナを削除します。

・「docker container run --rm py_centos:v1 python3 --version」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker> docker container run --rm py_centos:v1 python3 --version
Python 3.6.8

Pythonのバージョンが表示されます。

dnf(Fedora)

・「code ./py_fedora/Dockerfile」コマンドを実行して、下の内容を入力して保存します。
# ベースイメージの指定
FROM fedora:latest

# イメージの更新とPythonのインストール
RUN dnf install -y \
    python3 \
    && dnf clean all

 このDockerfileでは、fedora:latestをベースイメージとして使用し、dnfコマンドを使用してPythonをインストールしています。

コマンド意味
RUN dnf install -ydnfパッケージマネージャーを使用して、Python3をインストールする。-yオプションは、インストール中に確認プロンプトをスキップし、デフォルトで「はい」を選択する。
python3インストールするパッケージの名前。
&&前のコマンドが成功した場合にのみ、次のコマンドを実行する。
dnf clean alldnfパッケージマネージャーのキャッシュや一時ファイルをクリーンアップする。
RUNコマンドの意味

 これらのコマンドを組み合わせることで、dnfパッケージマネージャーを使用してPython3をインストールし、インストール時に作成されたキャッシュや一時ファイルをクリーンアップします。

・「docker image build -t py_fedora:v1 ./py_fedora」コマンドを実行します。

PythonがインストールされたFedoraイメージを作成します。

PS C:\Users\joeac\Desktop\docker> docker image build -t py_fedora:v1 ./py_fedora
2024/04/23 00:38:09 http2: server: error reading preface from client //./pipe/docker_engine: file has already been closed
[+] Building 0.0s (0/0)  docker:default
2024/04/23 00:38:09 http2: server: error reading preface from client //./pipe/docker_engine: file has already been close[+] Building 31.7s (7/7) FINISHED                                                                        docker:default
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 207B                                                                               0.0s
 => [internal] load metadata for docker.io/library/fedora:latest                                                   2.3s
 => [auth] library/fedora:pull token for registry-1.docker.io                                                      0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [1/2] FROM docker.io/library/fedora:latest@sha256:61864fd19bbd64d620f338eb11dae9e8759bf7fa97302ac6c43865c48dc  3.1s
 => => resolve docker.io/library/fedora:latest@sha256:61864fd19bbd64d620f338eb11dae9e8759bf7fa97302ac6c43865c48dc  0.0s
 => => sha256:61864fd19bbd64d620f338eb11dae9e8759bf7fa97302ac6c43865c48dccd679 975B / 975B                         0.0s
 => => sha256:830a6bcb5c9b30bfa77479b747a904bed02151e9de7ceeb8a1d117b574571fa4 529B / 529B                         0.0s
 => => sha256:5f878605acd6f24f3f11e4085544caf61b046378b31d6b3aa0677a7a3dbe0a17 2.00kB / 2.00kB                     0.0s
 => => sha256:353b74d8db1cf655e87c780b9ac49f52ed72dfaa3ecc4bb0e9245e72c98a45b5 64.61MB / 64.61MB                   1.4s
 => => extracting sha256:353b74d8db1cf655e87c780b9ac49f52ed72dfaa3ecc4bb0e9245e72c98a45b5                          1.6s
 => [2/2] RUN dnf install -y     python3     && dnf clean all                                                     26.2s
 => exporting to image                                                                                             0.0s
 => => exporting layers                                                                                            0.0s
 => => writing image sha256:0dd752f61272ce656d9767045c571c761400f04d9d0d2323d94ce3731638caee                       0.0s
 => => naming to docker.io/library/py_fedora:v1                                                                    0.0s

View build details: docker-desktop://dashboard/build/default/default/yz40pyyxtnqlox9vtagl0a9pr
PS C:\Users\joeac\Desktop\docker>

 以下のコマンドを使って、コンテナを作成してPythonのバージョンを確認し、コンテナが終了すると自動的にコンテナを削除します。

・「docker container run --rm py_fedora:v1 python3 --version」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker> docker container run --rm py_fedora:v1 python3 --version
Python 3.12.1

Pythonのバージョンが表示されます。

apk(Alpine Linux)

・「code ./py_alpine/Dockerfile」コマンドを実行して、下の内容を入力して保存します。
# ベースイメージの指定
FROM alpine:latest

# イメージの更新とPythonのインストール
RUN apk update && apk add --no-cache \
    python3

 このDockerfileでは、alpine:latestをベースイメージとして使用し、apkコマンドを使用してPythonをインストールしています。

コマンド意味
RUN apk updateapkパッケージマネージャーを使用して、パッケージリストを更新する。
&&前のコマンドが成功した場合にのみ、次のコマンドを実行する。
apk add --no-cacheapkパッケージマネージャーを使用して、--no-cacheオプションを指定してPython3をインストールする。
python3インストールするパッケージの名前。
RUNコマンドの意味

 これらのコマンドを組み合わせることで、apkパッケージマネージャーを使用して、パッケージリストを更新し、--no-cacheオプションを指定してPython3をインストールします。

・「docker image build -t py_alpine:v1 ./py_alpine」コマンドを実行します。

PythonがインストールされたAlpineイメージを作成します。

PS C:\Users\joeac\Desktop\docker> docker image build -t py_alpine:v1 ./py_alpine
2024/04/23 00:42:40 http2: server: error reading preface from client //./pipe/docker_engine: file has already been closed
[+] Building 0.0s (0/0)  docker:default
2024/04/23 00:42:40 http2: server: error reading preface from client //./pipe/docker_engine: file has already been close[+] Building 5.3s (7/7) FINISHED                                                                         docker:default
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 201B                                                                               0.0s
 => [internal] load metadata for docker.io/library/alpine:latest                                                   2.3s
 => [auth] library/alpine:pull token for registry-1.docker.io                                                      0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [1/2] FROM docker.io/library/alpine:latest@sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e  0.5s
 => => resolve docker.io/library/alpine:latest@sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e  0.0s
 => => sha256:4abcf20661432fb2d719aaf90656f55c287f8ca915dc1c92ec14ff61e67fbaf8 3.41MB / 3.41MB                     0.3s
 => => sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b 1.64kB / 1.64kB                     0.0s
 => => sha256:6457d53fb065d6f250e1504b9bc42d5b6c65941d57532c072d929dd0628977d0 528B / 528B                         0.0s
 => => sha256:05455a08881ea9cf0e752bc48e61bbd71a34c029bb13df01e40e3e70e0d007bd 1.47kB / 1.47kB                     0.0s
 => => extracting sha256:4abcf20661432fb2d719aaf90656f55c287f8ca915dc1c92ec14ff61e67fbaf8                          0.1s
 => [2/2] RUN apk update && apk add --no-cache     python3                                                         2.3s
 => exporting to image                                                                                             0.1s
 => => exporting layers                                                                                            0.1s
 => => writing image sha256:32df4a7b80af92a0c0956bd324791c3c8daef1ab6ea34dce2f2b2c0a5c39684f                       0.0s
 => => naming to docker.io/library/py_alpine:v1                                                                    0.0s

View build details: docker-desktop://dashboard/build/default/default/khw6bchsd8c36lfbmnnqurpvm
PS C:\Users\joeac\Desktop\docker>

 以下のコマンドを使って、コンテナを作成してPythonのバージョンを確認し、コンテナが終了すると自動的にコンテナを削除します。

・「docker container run --rm py_alpine:v1 python3 --version」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker> docker container run --rm py_alpine:v1 python3 --version
Python 3.11.9

Pythonのバージョンが表示されます。

まとめ

 これらのDockerfileを使用することで、それぞれのディストリビューションに適したパッケージマネージャーを使用してPythonをインストールできます。そして、ビルドしたイメージにはPythonが含まれるため、コンテナを実行する際にPythonを利用できます。