---
title: MLやってる人向けに最低限理解してほしいDocker勉強会
tags: 
author: [tf63](https://www.docswell.com/user/8590143908)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/PEXDR3P57X.jpg?width=480
description: MLやってる人向けに最低限理解してほしいDocker勉強会 by tf63
published: October 25, 23
canonical: https://www.docswell.com/s/8590143908/KNRQVD-2023-10-25-145217
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/PEXDR3P57X.jpg)

MLやってる人向けに
最低限理解してほしいDocker勉強会


# Page. 2

![Page Image](https://bcdn.docswell.com/page/3EKXRYDR7D.jpg)

目次
01
環境構築に意識を向けよう
02
Dockerの概要
03
Dockerの使い方
04
Dockerのデモ
05
備考


# Page. 3

![Page Image](https://bcdn.docswell.com/page/L73589RGE5.jpg)

① 環境構築に
意識を向けよう


# Page. 4

![Page Image](https://bcdn.docswell.com/page/87DDMGYN7G.jpg)

意識してほしいポイント
開発者がプロジェクトの環境を100%理解していないと
利用者は環境を再現できない


# Page. 5

![Page Image](https://bcdn.docswell.com/page/VJPXR36N78.jpg)

例えば， python で opencv を使いたい場合
Ubuntu20.04だと，ligGL.so が無いとエラーを吐く
libgl1-mesa-dev を入れれば動いてくれる
じゃあ README に libgl1-mesa-dev が必要だとメモしておこう


# Page. 6

![Page Image](https://bcdn.docswell.com/page/2EVLR43YJQ.jpg)

半年後．．． 同じPC内の別プロジェクトでopencvを使いたい
すでに libgl1-mesa-dev が入っているのでエラーが起こらない
libgl1-mesa-dev が必要であることに気づかない (忘れてしまっている)
README にメモし忘れる
利用者が開発環境を再現出来ない


# Page. 7

![Page Image](https://bcdn.docswell.com/page/57GXM13WEL.jpg)

じゃあどうすれば良い？
python 環境の再現であれば venv で 仮想化 し
パッケージのインストールをrequirements.txt にまとめておけば良い
それ以外の環境の場合は？
環境を仮想化し (Docker Engine )
パッケージのインストールをどっかに書いてまとめよう ( Dockerfile )


# Page. 8

![Page Image](https://bcdn.docswell.com/page/4EQ8RD5QJP.jpg)

全然分かんないけど，パッケージのインストールを
------Debian
こんな感じに書けたら良いな．．．と普通思うはず


# Page. 9

![Page Image](https://bcdn.docswell.com/page/KJ428Z9YE1.jpg)

全然分かんないけど，パッケージのインストールを
こんな感じに書けたら良いな．．．と普通思うはず
偶然にも， Docker はこういう感じに書く！


# Page. 10

![Page Image](https://bcdn.docswell.com/page/LE1M2RKN7G.jpg)

② Dockerの概要
ちょっと①と内容が被る


# Page. 11

![Page Image](https://bcdn.docswell.com/page/GEW3R1PME2.jpg)

面白そうなプロジェクトがあるので試してみたい．．．


# Page. 12

![Page Image](https://bcdn.docswell.com/page/47ZVRPKME3.jpg)

まず環境を用意してみよう → ？？？
+ ceres-solver
(クラッシュする)
+ COLMAP
(バージョンいくつやねん)


# Page. 13

![Page Image](https://bcdn.docswell.com/page/YJ65RMQ57V.jpg)

まず環境を用意してみよう → ？？？
+ ceres-solver
いや，知らんわ
+ COLMAP
(バージョンいくつやねん)
(クラッシュする)


# Page. 14

![Page Image](https://bcdn.docswell.com/page/GJ5Y8ZRGJ4.jpg)

リポジトリをよく見てみると．．．
Dockerfile を発見！ とってもうれしい


# Page. 15

![Page Image](https://bcdn.docswell.com/page/LE3589PPJ5.jpg)

Docker 環境が用意されていると．．．
面倒な環境設定を
① ビルド
② 起動
の2ステップで済ませられる


# Page. 16

![Page Image](https://bcdn.docswell.com/page/8EDDMGL3EG.jpg)

③ Dockerの使い方


# Page. 17

![Page Image](https://bcdn.docswell.com/page/V7PXR32PE8.jpg)

Dockerの仕組みは？
コンテナの中に環境を作る
コンテナは小さいOSみたいなもの
Docker Engine上にコンテナを作る
開発者


# Page. 18

![Page Image](https://bcdn.docswell.com/page/2JVLR4DV7Q.jpg)

Dockerを使うと，プロジェクト利用者がいる場合に．．．
開発者
利用者


# Page. 19

![Page Image](https://bcdn.docswell.com/page/5EGXM1Y1JL.jpg)

利用者のOSに環境をそのまま移動できる
開発者
利用者


# Page. 20

![Page Image](https://bcdn.docswell.com/page/4JQ8RDMN7P.jpg)

コンテナが立ち上がるまで
① Dockerfileを書く
------Debian
書き方はなんとなく察するはず


# Page. 21

![Page Image](https://bcdn.docswell.com/page/K7428ZV3J1.jpg)

Dockerfileからコンテナを起動？
これではコンテナを起動するたびにインストールが実行されてしまう！


# Page. 22

![Page Image](https://bcdn.docswell.com/page/LJ1M2R3ZEG.jpg)

Dockerイメージからコンテナを起動！
② Dockerfile から Docker イメージをビルドする
③ Docker イメージからコンテナを起動する
① Dockerfile
②ビルド
Docker
イメージ
③起動
実際にコマンドが走るので遅い
イメージからコンテナを起動するのは速い


# Page. 23

![Page Image](https://bcdn.docswell.com/page/GJW3R1P6J2.jpg)

環境は出来た．しかし，ホストOSのファイルを参照するには？
仮想化によってホストのファイルが見えない
これでは，ホストにあるコードを
コンテナ内で動かせない
3つのアプローチがあるが
(ホストOS)
今回は bindマウント のみ紹介する


# Page. 24

![Page Image](https://bcdn.docswell.com/page/4EZVRPKRJ3.jpg)

bindマウント
ホストのディレクトリ ( pwd ) を
コンテナ内のディレクトリ ( /app ) に
マウントする
bind
(ホストOS)
つまり，変更が双方向に即座に反映される
仮想化を気にせずファイルを変更できる


# Page. 25

![Page Image](https://bcdn.docswell.com/page/Y765RMQ1EV.jpg)

④ Dockerのデモ


# Page. 26

![Page Image](https://bcdn.docswell.com/page/G75Y8ZRL74.jpg)

内容
Dockerfileの書き方
(キャッシュが作られることを確認)
コンテナのビルド･起動
VSCodeにアタッチ
パッケージのインストール確認
bindマウントの確認


# Page. 27

![Page Image](https://bcdn.docswell.com/page/9J2GKRD3JR.jpg)

⑤ 備考


# Page. 28

![Page Image](https://bcdn.docswell.com/page/DEYVND28EM.jpg)

Dockerイメージのキャッシュ
一部のコマンド (RUN, COPY, ADD句など)はイメージのキャッシュが作られる
キャッシュが作られるので
変更が少ないコマンドは上のほうに書く
諸説あるが，RUN句は1コマンドでまとめる


# Page. 29

![Page Image](https://bcdn.docswell.com/page/VJNMX68978.jpg)

build context
Dockerイメージのビルドにはcontextが必要 (ここでは ”.”)
contextはビルド時のルートディレクトリとなる
ホストの ./requirements.txt を
コンテナ内の /app にコピーする


# Page. 30

![Page Image](https://bcdn.docswell.com/page/YE9N8LK3E3.jpg)

build contextと.dockerignore
Docker Engine はビルド開始時にcontext配下のファイルを収集する
コンテキスト配下に data/ のような大きいディレクトリがあるとビルド出来ない
(確か) コンテキスト配下に
.dockerignore を作成し data/ をエスケープする
( .gitignore と同じ書き方)


# Page. 31

![Page Image](https://bcdn.docswell.com/page/GE8K8XRL7D.jpg)

ファイルのパーミッション
配布されているイメージの多くはコンテナ内で root ユーザーになっている
コンテナ内で作成したファイルはホスト側でも root でしか開けない
対処
① コンテナ内でホスト側のユーザーと同じUID, GIDを持つユーザーを作成する
② chmodコマンド (基本は①で良い)


# Page. 32

![Page Image](https://bcdn.docswell.com/page/LELZR8KQJR.jpg)

Docker Compose
docker build, docker runは結構長いコマンドになる
Docker Compose は docker-compose.yml にコンテナの構成を記述し，
docker compose upするだけでコンテナのビルド･起動ができる
複数コンテナを一度に立ち上げられたりとか色々できるので便利
(コンテナを1つしか立ち上げない場合は使わなくて良いと思う)


