Dockerとは
以下Qiitaの記事がメリットがしっくりきて図も豊富でとてもわかりやすかったです。
WindowsにDocker環境を用意する
以下サイトを参考にDocker環境を準備します。特に迷うことはありませんでした。
Ubuntu 22.04 コンテナを作成する
次にUbuntu22.04のコンテナを作成していきます。
スタートメニューからDocker Desktopを起動します。
イメージをダウンロードします。
docker pull ubuntu:22.04
docker images
ダウンロードしたイメージからコンテナを作成します。
docker run --name ubuntu2204 -it ubuntu:22.04 /bin/bash
上記のrunコマンドでは以下の処理を一気に行ってくれています。
- Docker Hubから、ubuntu:22.04のイメージを取得(pull)する。
- ubuntu:22.04のイメージから、ubuntu2204という名前でコンテナを作成(create)する。
- コンテナubuntu2204を起動(start)する。
- コンテナubuntu2204にログイン(-it)する。
通常はrunコマンド一発での運用が主になるそうですが、以下サイトを参考にして一度pull, create, startを個別に実施したほうが全体の理解は進みました。
runコマンドではpullから行われてしまうため作成したコンテナに再度ログインする際はexecコマンドを利用します。
docker exec -it ubuntu2204 /bin/bash
Ubuntuの構築は以下サイトを参考にしました。
DockerのUbuntuにPython環境を構築する
次にDocker Ubuntuにログインした状態でPython環境を構築していきます。
apt update
apt install -y python3 python3-pip
apt install build-essential libbz2-dev libdb-dev \
libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
libncursesw5-dev libsqlite3-dev libssl-dev \
zlib1g-dev uuid-dev
以下コマンドがエラーなく実行できたら成功です。
Python3 -version
これでDocker環境にUbuntuを構築することができ、UbuntuにPythonをセットアップすることができました。
ただこれだと毎回UbuntuにログインしてPythonを入れないといけないので面倒です。
ということで次はDockerfileというものを使って細かなセットアップも楽に行おうと思います。
Dockerfileを使って細かいセットアップを一気に行う
最初にDockerfileの存在を知ったときは、「Docker Hubのイメージを利用したのを覚えるだけでも頭が混乱しているのに、さらに追加の概念が入るのか…」と絶望しました。
ただDockerfileはセットアップで楽するためには避けて通れない道のようです。楽するためなら仕方ありません。
まずは以下のようなディレクトリ構成でファイルを作成します。
それぞれのファイルの中身を記載します。
まずはDockerfileです。DockerfileはDockerコンテナの作成と、その後の必要なセットアップ情報をまとめたものだと理解しました。
FROM ubuntu:22.04
USER root
RUN apt update
RUN apt install -y python3 python3-pip vim
RUN pip install --upgrade pip
COPY requirements.txt /root/
RUN pip install -r /root/requirements.txt
- FROM ubuntu:22.04
PullしたいDockerイメージを指定します。 - apt, pip
python, pip, vimをインストールします。 - COPY requirements.txt /root/
ローカル環境のrequirements.txtをDocker環境のrootディレクトリ直下にコピーします。 - pip install -r /root/requirements.txt
requirements.txtに記載されているパッケージをインストールします。
次にdocker-compose.ymlです。こちらもセットアップ情報が記載されています。
version: "3"
services:
python3:
restart: always
build: .
container_name: "ubuntu2204"
working_dir: "/root/"
tty: true
volumes:
- ./src:/root/src
- container_name
コンテナ名です。以降でも利用します。 - volumes
ローカル環境の./srcをコンテナ環境の/root/srcにマウントします。
これにより指定したローカル環境とコンテナ環境が同期され、ローカル環境内の./srcを編集するとコンテナ環境の/root/srcにも変更が反映されます。
次はmain.pyとrequirements.txtです。今回はテスト用になります。
import numpy as np
def main():
print("hello world!!")
if __name__ == "__main__":
main()
numpy
これで準備は完了です。
カレントディレクトリを作業中のフォルダにした状態でローカル環境からコマンドを実行します。
docker compose up -d --build
作成したコンテナubuntu2204にログインします。
docker exec -it ubuntu2204 /bin/bash
main.pyの確認を実施します。
# ls
requirements.txt src
# cd src
# ls
main.py
# python3 main.py
hello world!!
無事main.pyのhello world!!が実行されています!
以降は後片付けになるため、必要に応じて実施します。
上から順にUbuntuからのログアウト、dockerコンテナの停止、dockerコンテナの削除になります。
# exit
exit
> docker stop ubuntu2204
ubuntu2204
> docker rm ubuntu2204
ubuntu2204
ローカルからDocker環境にファイルをコピーする
以下コマンドを実行することで、ローカルPCにあるファイル・フォルダをDocker環境にコピーできます。
docker cp [オプション] ローカル・パス|- コンテナ:パス
docker cp /tmp/local_folder ubuntu2204:/root/local_folder
補足:よく使うDockerコマンドリスト
補足です。
「あのコマンド何だったっけ…」となるたびにネット検索するのがもったいないのでチートシートを作りました。
########イメージの操作########
#イメージ一覧を表示
docker images
#Docker Hubからイメージを取得
docker pull {イメージ名}
#Dockerfileからイメージを作成
docker build {Dockerfileのパス}
#イメージを削除
docker rmi {イメージID}
########コンテナの操作########
#コンテナ一覧を表示
docker ps -a
#コンテナを作成
docker create {イメージ名}
#コンテナを起動
docker start {コンテナ名}
#コンテナを停止
docker stop {コンテナ名}
#コンテナを削除
docker rm {コンテナ名}
#イメージを取得、コンテナを作成、コンテナを起動
docker run {イメージ名}
########その他の操作########
#コンテナにログイン
docker exec -it {コンテナ名} bash
作成は以下の記事を参考にしています。
# コンテナ作成
docker compose up -d --build
# コンテナログイン
docker exec -it {コンテナ名} /bin/bash