Docker備忘録 「Python実行環境の作成」


はじめに

  • 何となくで使っていたDockerについて技術の再現性を高めるためにもまとめておく

Dockerあれこれ

概要

  • コンテナ型仮想環境を作成・実行・管理するためのプラットフォーム
  • Dockerのソフトウェア自体はGo言語で書かれている

メモ「Go言語とは」
Go言語はGoogleが開発しているオープンソースのプログラミング言語
標準パッケージが豊富・省略ができないものがありプログラマーの記述差異を減らせる

コンテナ型仮想環境の構成イメージ

Dockerの実行イメージ

利用するメリット

  • プログラムの実行環境を素早く立ち上げることができる
  • PC環境を汚さない
    • ローカルに直にインストール必要がない
    • インフラ起因で発生するエラーを減らせる(?)
    • 直でインストールした場合にそれぞれのパッケージ管理もしないといけない

メモ「Pythonのpipenvによる"仮想化"とDockerによる"仮想化"の違い」
まず前提として上記で用いられている"仮想化"という言葉は全く関係のないもの

  • DockerではOSレベルで仮想化を実現するもの
    • 一つのPC上で複数のOS環境を同時に稼働させることができる
  • pipenvではアプリケーションレベルの仮想化を実現するもの
    • 異なったライブラリをインストールした複数のPython環境を手軽に作ることができる

今回検証に利用したWindwosの仕様と環境

大項目 小項目 詳細
OS エディション Windows 11 Pro
バージョン 21H2
OSビルド 22000.556
プログラミング言語 Python 3.10.2
Docker Docker Desktop 4.5.1
IDE Microsoft Visual Studio 1.64.2

1.Dockerのインストール

  • すでにインストール済みの場合は、スキップ
  1. 以下のリンクからwindows用のDockerDesktopをインストールする
    https://hub.docker.com/editions/community/docker-ce-desktop-windows

  2. Configurationの画面がでたらそのままOK

  3. 以下の画面がでたら再起動し、インストール完了

  4. 再起動後に立ち上がらなかった場合
    以下のリンクからLinuxカーネルの更新プログラムパッケージをDL/インストールする
    https://docs.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package

メモ「Dockerの有償化について」

Docker Desktop remains free for small businesses (fewer than 250 employees AND less than $10 million in annual revenue), personal use, education, and non-commercial open source projects.

執筆時点では個人で利用する分には無料ですが、企業単位で利用する場合には有料の場合があるので注意が必要
https://twitter.com/Docker/status/1432739340266913797
https://www.docker.com/pricing

2.各ファイル(dockerfile/dockercompose/実行したいpythonファイル)の準備

0.ファイル構成

tcpフォルダ 
L Dockerfile
L docker-compose.yml
L optフォルダ
 L サンプルテスト.py

1.Dockerfile

Dockerfile
FROM python
USER root

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

2.Docker-compose.yml

Docker-compose.yml
version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'test'
    working_dir: '/root/'
    tty: true
    volumes:
      - ./opt:/root/opt

3.サンプルテスト.py

サンプルテスト.py
import sys

def main():
  val1 = float(sys.argv[1])
  val2 = float(sys.argv[2])
  print(val1*val2)

if __name__ == "__main__":
  main()

3.Dockerイメージの作成、コンテナのビルド、コンテナの起動

1.コンテナのビルド実行

ターミナル
$ cd tcp
$ docker compose up -d --build
  • 結果

2.dockerイメージの確認

ターミナル
$ docker images
  • 結果

3.docker コンテナの確認

ターミナル
$ docker container ls
  • 結果

4.コンテナの接続

いずれかのコマンドを実行する

ターミナル
$ docker exec test bash
ターミナル
$ docker-compose exec python3 bash

メモ「コンテナ接続の違い」

  • docker exec コンテナ名 bash
  • docker-compose exec サービス名 bash

どちらともdocker-compose.ymlに定義しているので要確認

5.pythonのファイルをDocker上で実行

$python サンプルテスト.py 1 5
  • コマンドライン引数に好きな数字を2つ入れる
  • 結果

メモ「コンテナ1つならイメージビルドだけでいいのでは?」という疑問

上記の疑問に対して、聞いてみたところ、以下のようなメリットからdocker composeを使う

  1. docker run などに与える引数をyamlファイルに定義できる

    • 引数大量になってしまうところをすっきりさせることができるメモとして残せる。
  2. 起動オプションまで合わせてgit管理できる

    • 変更管理もできます。複数人で共有するならなおさら必要不可欠。
  3. いろいろやってるとコンテナ増える

    • 複数でコンテナを管理することの方が多いので慣れておく意味でも使ってみたほうがいい。

残課題

  • win32comやtkinterといったライブラリのインストールができなかったので解消したい
  • 複数コンテナの管理

参考記事・URL