konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

【おてがる開発環境をつくろう】Docker であそぶ Python 入りのコンテナつくる

f:id:konchangakita:20210517222702p:plain:w200   f:id:konchangakita:20210517222849p:plain:w180


【おてがる開発環境をつくろう】
1.まずは Docker Desktop インストール
2.Docker であそぶ Python 入りのコンテナつくる ←今ココ
3.コンテナで Jupyter Lab 環境
4.さいきょうのえでぃた VS Code


あくまで今回の目的は、マイクロサービスを作るとかではなく
「開発環境をつくる!」です
Dockerコンテナがなんなのか、とか、アーキテクチャみたいなことは
他のサイトにおまかせして、あくまで使い方に終始していきます

コンテナをダウンロード

まずは、Dockerhub のアカウントを用意しておいて
https://hub.docker.com/

Docker ログインする

$ docker login


Dockerhub上のコンテナを、Powershell などで docker pull コマンドでダウンロードする

$ docker pull <container名>:<tag>

最近はだいたいアプリは公式が Dockerhub上にコンテナを用意していたりするので、Dockerhub をググるクセをつけておくと何かと便利、「dockerhub “ほしいもの”」でググると良いでしょう
例)docker ubuntu, docker splunkなどなど

Python であれば、Python 各バージョンのコンテナが公式で用意されています

自作コンテナを作ろう

dockerfile 作成

用途によってベースのコンテナを決めて、モジュールを加えてカスタマイズしていきます

例えば Python なら Dockerhub に用意されている tag ごとにインストールされているモジュールが違うので、ベースのコンテナを決めて追加の Pythonモジュールやパッケージインストール、設定ファイルなどをコピーしたりしてをコンテナを作っていきます
その設計図が dockerfile です
dockerfile という名前(拡張子なし)のファイルになります

dockerfile のサンプル(Dateコマンドが出力されるだけ)

# From: ベースになるコンテナを指定、tagなしだとlatestが自動的に選択される(ちゃんと指定しよう)
FROM python:3.9.4-slim

# WORKDIR ディレクトリ作って、そこに移動して以降のコマンド実行
WORKDIR /oreore

# RUN:の後にOS上で実行するコマンド
RUN apt update -y

# CMD: コンテナ起動時に実行されるコマンド
CMD ["date"]


コンテナイメージのビルド

dockerfile と同じ場所にて
 docker build . -t <container名>
を実行して dockerfile を元にコンテナイメージを作ります

(例)

$ docker build . –t test_container


コンテナイメージの確認

$ docker images
REPOSITORY                     TAG       IMAGE ID       CREATED          SIZE
test_container                 latest    80afafe350ea   55 seconds ago   132MB



コンテナの起動

コンテナを起動は
docker run
(場所はどこでもよい)

上で作った test_container を実行してみます
date コマンド出力結果だけが表示されます

$ docker run test_container
....
Sat May 22 13:16:33 UTC 2021
よく使うオプション

 --rm:コンテナ終了とともにコンテナを消す
 -it:コンテナの入出力に接続
 -p:外部からアクセスされるポート番号:コンテナ側のポート番号を指定
 -v:ディレクトリのマウント設定、ローカルのディレクトリ:マウントポイント
 -name :コンテナ名を指定

コンテナの状況を確認

docker ps コマンドで

起動中のコンテナ確認

$ docker ps

起動していないコンテナも含めて確認

$ docker ps -a
CONTAINER ID   IMAGE            COMMAND   CREATED             STATUS                         PORTS     NAMES
361bf7a7ffb9   test_container   "date"    About an hour ago   Exited (0) About an hour ago             ecstatic_solomon


検証するときや、開発環境用には、 “--rm” オプションをつけよう
作り始めはバンバン修正しながら作っていくのでコンテナ終了してもゴミが残らないように
コンテナ実行

$ docker run --rm <コンテナイメージ名>

コンテナ実行と同時にコンテナに入る(bashがある場合)
画面表示のオプション-it と、実行シェル /bin/bash を指定

$ docker run --rm –it <コンテナイメージ名> /bin/bash



ローカルの Pythonファイルを編集

おてがる開発環境を作る上での目玉の手法です
Docker のホストマウントを使います

Pythonファイルはローカルのエディタで編集しつつ
実行するのは、コンテナの中で実行
こうすることで、開発環境を作っては、FTPやSCPでファイルを送ったりSSHして vi みたいな手間が全部無くなります

コンテナからローカルフォルダをマウント方法
オプション -v "ローカルフォルダ : コンテナ内のマウントポイント"
(例)

$ docker run --rm -it  -v “C:\work\sample\app\:/home/app" --name python394 test_container /bin/sh

これで準備完了
あとは、
 ・ローカルのエディタで python ファイルを編集
 ・Docker コンテナは好きなバージョンの Python 環境を用意して、実行して確認
開発環境をいつでも潰して、作りなおしたり、持ち運びができます

コンテナイメージの更新

コンテナでは基本的に起動後はコンテナ内のファイルは固定(変更しない)、いつ起動しても同じ環境を再現できるイミュータブル性を確保します
なので、コンテナにパッケージやモジュールを追加したい場合は、dockerfile を修正してコンテナを再作成しよう


おまけ

本番環境でコンテナを作るのときのセキュリティについて

#ベースコンテナのtag(バージョン)はちゃんと指定することFROM python:x.x.x
# 設定ファイルの書き込み権限をなくすRUN chmod a-w /etc
# シェルを実行させないRUN rm –rf /bin/*
# ユーザ指定する(デフォルトは root になる)USER appuser