見出し画像

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のコマンド。日本語やpipjupyterlabの設定をしている
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

かなり簡単に削除されてしまうので、注意が必要です。


これで一通りの操作はできた形になります。
チュートリアル自体はもう少し残っているので、新たな学びがあればまたまとめたいと思います。

ここまでお読みいただきありがとうございました!!


参考


この記事が気に入ったらサポートをしてみませんか?