Docker入門!Dockerを使用してPython環境を構築する方法

dockerbegin Linux

新たに技術を理解するにはともかく実際に使ってみるのが最も効率的だと思います。
そこで、この記事ではDockerの使い方を理解したい人向けに、DockerのインストールからDockerコンテナの起動までを具体例と共に紹介していきます。

この記事で学べる内容
  • Dockerのインストール方法
  • Dockerコンテナ作成までの基本的な流れ
  • Dockerコンテナ作成の実践手順と関連コマンド

記事に記載の手順を実施していくことで、Python3.9のDockerコンテナ環境が起動できる構成になっています。それでは早速始めて行きます。

Dockerのインストール

環境
- MacBook Air

Dockerのインストールは公式HPにしたがって簡単に行えます。ここではMacにDockerをインストールする方法を紹介しますが、Windowsでもほぼ同じ手順でインストール可能です。
まず公式HPにアクセスし、Get Dockerをクリックします。そうすると"Docker.dmg"がダウンロードされます。
Windowsの場合はこちらから取得してください。

ダウンロードされた"Docker.dmg"をクリックして実行するとインストールが開始されます。以下の画面が出てきたら"Docker.app"のアイコンを右の"Applicaation"へdrag and dropしましょう。
その後、Applicationにある、Docker.appをダブルクリックするとDockerが起動します。※関連ツールのインストールのためMacのパスワードを求められることがあります。

docker versionコマンドを実行して、正しくインストールされたか確認します。

# docker version
Client: Docker Engine - Community
 Cloud integration: 1.0.2
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        4484c46d9d
 Built:             Wed Sep 16 16:58:31 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.13
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       4484c46d9d
  Built:            Wed Sep 16 17:07:04 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.3.7
  GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

無事Dockerがインストールされましたので、次はDockerイメージを作成しコンテナを起動していきます。

Dockerを実践する

以下の手順①〜④に沿ってイメージの作成からコンテナの起動まで、順に実施していきます。

① Dockerイメージの作成

Dockerイメージの作成は、Dockerfileと呼ばれるDockerイメージ作成用の設計書を用いて行います。Dockerfile作成後に、"docker image build"コマンドを実行することで、Dockerfileの記述に従って、Docker イメージが作成されます。
ちなみに、Dockerfileはテキストファイルなのですが、ファイル名は”Dockerfile”にしておきましょう。

  1. Dockerイメージの作成には"Dockerfile"と呼ばれる、Docker イメージの設計書を利用する。
  2. Dockerイメージを作成するコマンドは、"docker image build"

Dockerfileには、使用するベースイメージ、追加でインストールするパッケージやライブラリ、コンテナ起動時の実行コマンドなどを上から順に記載していきます。
公式サイトにDockerfileのベストプラクティスがありますので、詳しく知りたい方はそちらもご参照ください。
それではDockerfileの具体例を見ていきましょう。

# ベースイメージを指定。
# DockerHubに登録されているpython 3.9.0のイメージを取得。
FROM python:3.9.0-buster

# aptパッケージの更新、エディタ(vim)のインストール
RUN apt update -y && apt upgrade -y && \
    apt install -y vim 
    
# python関連ライブラリのインストール
RUN pip install numpy matplotlib jupyter

# コンテナ起動時にbashを起動
CMD ["/bin/bash"]

以下は、Dockerfileの基本的な命令文です。ENV命令は今回使用していませんが、実際の業務ではDockerイメージに入れるパッケージのバージョンを明示するために、環境変数でバージョンを指定するという使い方がよく用いられます。
他の命令文も知りたい方はこちらの公式サイトから参照できます。

Dockerfileの命令文説明構文/例
FROMDockerイメージを作成する際のベースイメージを指定する。
Docker hubにあるイメージを指定するのが一般的。
- 構文
FROM <image>:<tag>
- 例
FROM ubuntu:20.04
COPYDocker内部にファイルをコピーする。- 例:カレントディレクトリのファイルを/tmp/にコピー
COPY . /tmp/
RUNDockerイメージ上で実行するコマンドを指定する。- 例
RUN apt install vim
CMDコンテナ内部で実行するコマンドを指定する。- 例:コンテナ作成時にbashを起動
CMD ["/bin/bash"]
ENV環境変数を設定する- 例
ENV PYTHON_VERSION=3.9

Dockerfileを記述したので、イメージを作成していきます。
Dockerfileを用いてDockerイメージを作成するには、docker image buildコマンドを用います。

# Dockerイメージを作成するコマンド
# 構文:docker image build [OPTIONS] PATH | URL | -
# 頻出オプション
  -t: イメージの名前を指定。コロン(:)区切りでタブ名も指定可能。

# 具体例
$ docker image build -t py39 .

このコマンドによって、カレントディレクトリのDockerfileを読み込み、Dockerイメージの作成(build)が行われます。
例では、py39という名前でDockerイメージを作成しています。実行結果は次の通りです。

$ docker image build -t py39 .
[+] Building 110.6s (9/9) FINISHED                                                                                                                                                  
 => [internal] load build definition from Dockerfile                                                                                                                           0.1s
 => => transferring dockerfile: 414B                                                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                                                              0.1s
 => => transferring context: 2B                                                                                                                                                0.0s
 => [internal] load metadata for docker.io/library/python:3.9.0-buster                                                                                                         2.2s
 => CACHED [1/4] FROM docker.io/library/python:3.9.0-buster@sha256:ac5489b6fffc671a0880dc44d791944f9bdece5331c07e22af424d46ef264b36                                            0.0s
 => [internal] load build context                                                                                                                                              0.0s
 => => transferring context: 64B                                                                                                                                               0.0s
 => [2/4] RUN apt update -y && apt upgrade -y &&     apt install -y vim                                                                                                       48.2s
 => [3/4] RUN pip install numpy matplotlib jupyter                                                                                                                            55.0s 
 => [4/4] COPY ./file /root                                                                                                                                                    0.1s 
 => exporting to image                                                                                                                                                         5.0s 
 => => exporting layers                                                                                                                                                        4.9s 
 => => writing image sha256:e06e263baca1f1b05de9d1a6690b23a85cbcce545763058ce1fb68c25c87296a                                                                                   0.0s 
 => => naming to docker.io/library/py39
$

② Dockerイメージを確認

docker buildコマンドで作成したイメージを確認します。イメージの確認はdocker image ls コマンドを使用します。後述しますが、コンテナ一覧を確認するにはdocker container lsコマンドを使用します。

# Dockerイメージの一覧を確認するコマンド
# 構文:docker image ls [OPTIONS] [REPOSITORY[:TAG]]

# 具体例
$ docker image ls -a
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
py39                       latest              e06e263baca1        25 seconds ago        1.23GB                                         

先ほど作成したDockerイメージ(py39)が、IMAGE ID: e06e263baca1で、25秒前に作成されたことがわかります。
ちなみに、このイメージを削除するにはdocker image rm コマンドを使用します。以下に例を載せますが、イメージはまだ使用するためここでは実行しません。

# Dockerイメージを削除するコマンド
# 構文:docker image rm [OPTIONS] IMAGE [IMAGE...]

# 具体例
$ docker image rm e06e263baca1

では次にDockerコンテナを起動しましょう。

③ Dockerコンテナの起動

作成したDockerイメージを用いてコンテナを起動します。コンテナの起動はdocker container runコマンドを使用します。

# Dockerコンテナを起動するコマンド
# 構文:docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 頻出オプション:
#  -it: コンテナ内に標準入力と接続されたTTYを用意します。
#  —rm: コンテナ終了時に自動的に削除する。

# 具体例
$ docker container run -it —-rm e06e263baca1
root@c1dfe7a9bb7f:/# python --version
Python 3.9.0
root@c1dfe7a9bb7f:/# exit
exit
$


コンテナ起動時に2つのオプション(実際は-i, -tオプションをまとめて-itとしているため3つですが)を指定しています。このコマンドを実行するとコンテナが起動し、インタラクティブシェルが起動します。
コンテナの中でpythonのバージョンを確認するとpython 3.9.0となっており、期待したイメージが動作していることが分かります。

この例では、docker run実行時にフォアグラウンドで、コンテナが起動していますが、バックグラウンドで実行する場合は-dオプションを使用します。

# コンテナをバックグラウンドで起動する。(-d オプション)
# 具体例
$ docker container run -it -d e06e263baca1
1848b929d74a8634669bde19f710c1d9a2b28b4801108d066537c32c36dcd277
$

バックグラウンドで起動しているコンテナに入るには、docker container execコマンドを利用し、コンテナ内でシェルコマンドを実行することで実現可能です。

# Dockerコンテナ内でコマンドを実行する
# 構文:docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]
# 頻出オプション:
#  -it: コンテナ内に標準入力と接続されたTTYを用意します。

# 具体例
$ docker container exec -it 1848b929d74a /bin/bash
root@1848b929d74a:/# 

④ Dockerコンテナの確認

バックグラウンドで起動しているコンテナを確認するにはdocker container lsコマンドを使用します。

# Dockerコンテナの一覧を表示するコマンド
# 構文:docker container ls [OPTIONS]

# 具体例
$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1848b929d74a        e06e263baca1        "/bin/bash"         8 seconds ago       Up 7 seconds                            practical_shamir

イメージID e06e263baca1のコンテナ1848b929d74aが、8秒前に作成(CREATED)され、7秒間起動している状態(STATUS)であることが分かります。
ちなみに、オプションの-aを付けないと起動しているコンテナのみが表示されます。

コンテナを停止するにはdocker container stopコマンドを使用します。

# Dockerコンテナを停止するコマンド
# 構文:docker container stop [OPTIONS] CONTAINER [CONTAINER...]

# 具体例
$ docker container stop 1848b929d74a
1848b929d74a
$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
1848b929d74a        e06e263baca1        "/bin/bash"         27 minutes ago      Exited (0) 4 seconds ago                       practical_shamir
$

最後に停止したコンテナを削除します。コンテナを削除するにはdocker container rmコマンドを使用します。

# Dockerコンテナを削除するコマンド
# 構文:docker container rm [OPTIONS] CONTAINER [CONTAINER...]

# 具体例
docker container rm 1848b929d74a

終わりに

Dockerのインストールから、Dockerコンテナの起動までの一連の流れを実践してきました。今回は基本的な全体像を紹介したので、今後は項目ごとに深掘りした内容も記載していく予定です。
最後に、今回使用したDockerコマンドを表にまとめておきます。

Dockerコマンドまとめ

Dockerコマンド説明
docker image buildDockerfileからDockerイメージを作成する。

◆構文
docker image build [OPTIONS] PATH | URL | -

◆代表的なオプション
-t: イメージの名前を指定。コロン(:)区切りでタブ名も指定可能。
◆実行例
$ docker image build -t py39 .
docker image lsDockerイメージの一覧を表示する。

◆構文
docker image ls [OPTIONS] [REPOSITORY[:TAG]]
◆具体例
$ docker image ls -a
docker container runイメージからコンテナを起動する。

◆構文
docker container run <option> <docker image>

◆実行例
docker container run -it -d —name test
◆代表的なオプション
-it: コンテナ内に標準入力と接続されたTTYを用意します。
-d: dockerコンテナをバックグラウンドで実行する
—name: コンテナの名前を設定
-v: コンテナ内のディレクトリとコンテナ外のディレクトリを紐づけます。
—rm: コンテナ終了時に自動的に削除する。
docker container lsDocker コンテナの一覧を表示する。

◆構文
docker container ls [OPTIONS]
◆具体例
$ docker container ls -a
docker container execDockerコンテナ内でコマンドを実行する。

◆構文
docker container exec [OPTIONS] CONTAINER COMMAND [ARG…]

◆頻出オプション
-it: コンテナ内に標準入力と接続されたTTYを用意します。
◆具体例
$ docker container exec -it 1848b929d74a /bin/bash
docker container stop起動しているDockerコンテナを停止する。

◆構文
docker container stop [OPTIONS] CONTAINER [CONTAINER…]
◆具体例
$ docker container stop 1848b929d74a
docker container rmDockerコンテナを削除する。

◆構文
docker container rm [OPTIONS] CONTAINER [CONTAINER…]
◆具体例
docker container rm 1848b929d74a
docker image rmDockerイメージを削除する。

◆構文
docker image rm [OPTIONS] IMAGE [IMAGE...]

参考リンク

コメント

タイトルとURLをコピーしました