Docker×Python_docker composeコマンドでイメージをビルドしてコンテナ化する #129日目
DockerでPythonの実行環境を作ることについて学んでいます。
YouTubeに大変分かりやすく解説してくださっている動画がありました。
Dockerを学んでみたい方にはとてもおすすめです。
Dockerとは自分のコンピューターの環境とは隔離された場所で仮想のOSを作り、その中でアプリを作ったり実行したりできるコンテナ技術を用いたサービスです。コンテナ技術の中では最も有名なものになります。
自分の環境を汚す必要がない、かつ環境の違いによる誤動作を防ぐことができ、どんな環境でも同じように実行できます。
上記のチュートリアルでは仮想のLinux環境を作って、その中でPythonを動かしてみるところまで実施されています。
イメージとは
仮想環境を作るためのテンプレートファイルのようなものです。イメージをコピーする形でコンテナが作られます。イメージがPythonのクラスだとしたら、コンテナはインスタンスです。
つまりイメージを作らないとコンテナが作れないのですが、イメージを作る方法は大きく2つあります。
①Dockerが公式に用意しているイメージをダウンロード
②自分で1から作る
上記のチュートリアルは公式をベースに必要なものを足していく形で進められています。
最初に「Dockerfile」「docker-compose.yml」「sample.py」という3つのファイルを作成します。sample.py以外は予約されたファイル名のため、スペルミスがないように作る必要があるのでご注意ください。
Dockerfileとは
Dockerイメージを作成する際の環境設定を記述する部分です。どういうOSを使いたいのか、OSに対してどういうライブラリを最初にインストールしておきたいのか、等を指定します。今回はDockerが用意している「python」というオフィシャルイメージを使います。
何回も使うモジュールはここでpipインストールして含めておくと便利です。コンテナ化した後でもモジュールの追加はできますが、それらはコンテナが削除されたら一緒に削除されてしまうので、よく使う共通のモジュールはここで予めイメージに含めておきます。
[Dockerfile]
# Dockerの公式が用意してくれている「python」というオフィシャルイメージを使う
FROM python:3
USER root
# 以下はLinuxのコマンド。日本語やpip、jupyterlabの設定をしている
RUN apt-get update
RUN apt-get -y install locales && \
localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN python -m pip install jupyterlab
docker-compose.ymlとは
イメージをビルドしたりコンテナ化するときに使うDocker系のコマンドで「docker compose」があり、これを使うときのファイルです。ここに記述した内容を読み込んでコンテナが作られるため、色んなオプションをコマンド上で指定しなくてもよくなります。
version: '3' # バージョンは好きに選べる
services:
python3:
restart: always
build: .
container_name: 'python3ym' # コンテナ名(任意)
working_dir: '/root/' # 作った仮想環境のフォルダ名(仮想環境に入った時に一番最初に表示される場所)
tty: true
volumes: # 自分のコンピューター上のフォルダと仮想環境のフォルダを同期するための設定(自分の環境で作ったファイルを仮想環境上で使えるようにするために)
- ./opt:/root/opt # 「:」で区切った左側が自分のフォルダ、右側が仮想環境上のフォルダ
ここではvolumesの設定が最も重要です。自分のコンピューターと仮想環境をあるフォルダを介して同期する設定をしています。上記のコードだと、自分の環境にあるoptフォルダが仮想環境上のrootの下のoptフォルダと同期される(=シンクする)形です。
こうすることで、自分の環境と仮想環境が通信可能になり、自分の環境のoptフォルダ内にあるファイルが仮想環境にも表れる(=マウントされる)ことになります。
なぜわざわざこういう設定をするかというと、仮想環境内だけでファイルを作ってしまうと自分の環境からアクセスできなくなってしまうためです。あくまで作るファイル自体は自分の環境に置いておいて、実行環境だけコンテナに任せる、ということがこの設定で可能になります。
イメージをビルドしてコンテナを作成する
上記の3ファイルが作成出来たら以下のコードを実行します。このコードはdocker-compose.ymlに記載されたテキスト情報と、Dockerfileに書かれたイメージデータを元に、イメージを作る→自分のPCにインストールされる→そのイメージをテンプレートとしてインスタンス(コンテナ)を作る、という一連の流れを実行してくれます。
docker compose up -d --build
各コマンドの意味は以下です。
docker compose:「docker-compose.yml」を使うためのコマンド
up:コンテナを立ち上げるという意味
-d:バックグラウンドでコンテナを走らせるというオプション
--build:コンテナを立ち上げる時にイメージをビルドするオプション
web通信を必要とするため、コマンドの実行から完了まで時間がかかる場合があります。また、イメージを再利用する際(ビルドする必要がない時)は--buildコマンドは省略して大丈夫です。
最後に以下のメッセージがでたら完了です。
Container python3ym Started
似たコマンドに以下があります。
docker compose build
これはコンテナを作らずにイメージだけ作るもので、例えばコードを書いていて新たに別のモジュールをイメージに追加したくなった際など、元のDockerfileを編集して上記コマンドを実行すれば、イメージをアップデートすることができます。
コンテナ上でモジュールをインポートして使ってみる→イメージに入れた方が良さそうなら追加しておく(コンテナ上でインストールしておくとそのコンテナ以外で使えないため)、という形です。
少し逸れましたが、無事にイメージが作成できているか以下のコマンドで確認します。
docker image ls
↓こんな感じで作成したフォルダが表示されればOKです。
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-python_python3 latest f2dbe601393c 9 minutes ago 1.21GB
また、コンテナをバックグラウンドで走らせるコマンドをしたので、ちゃんと走っているかどうか確認します。
docker container ls
以下のように表示されればOKです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
baf2ed8e3499 docker-python_python3 "python3" 10 minutes ago Up 10 minutes python3ym
Dockerの仮想環境に入ってみる
以下のコマンドを実行します。
docker compose exec python3 bash
ここでのpython3というのはコンテナの名前のことらしいです。ただ、自分の場合は「python3ym」をコンテナ名にしていたのですが、そう記載しても「service "python3ym" is not running container #1」と表示され仮想環境に入ることができませんでした。
色々試して、上記コードだと上手くいったのですが、この「python3」というのはCOMMANDとして表示されていた文字列でした。文字数制限か何かなのか、COMMANDに表示されている文字列とコンテナ名が異なっており、COMMANDの方で上手く入れました。
COMMANDは実行中コンテナを確認した時に出てきたものです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
baf2ed8e3499 docker-python_python3 "python3" 10 minutes ago Up 10 minutes python3ym
Dockerの仮想環境から出てPCに戻る
これは単純にexitと入力するだけです。
exit
これで仮想環境から出て自分のPCに戻ってきます。また、出ただけなのでコンテナはまだ走った状態です。
コンテナをストップしたい場合は以下のコマンドを実行します。
docker stop コンテナID
Dockerコンテナを削除してみる
upコマンドで立ち上げたコンテナはdownコマンドで削除することができます。
docker compose down
かなり簡単に削除されてしまうので、注意が必要です。
これで一通りの操作はできた形になります。
チュートリアル自体はもう少し残っているので、新たな学びがあればまたまとめたいと思います。
ここまでお読みいただきありがとうございました!!