5.2K Views
October 25, 23
スライド概要
MLやってる人向けに 最低限理解してほしいDocker勉強会
目次 01 環境構築に意識を向けよう 02 Dockerの概要 03 Dockerの使い方 04 Dockerのデモ 05 備考
① 環境構築に 意識を向けよう
意識してほしいポイント 開発者がプロジェクトの環境を100%理解していないと 利用者は環境を再現できない
例えば, python で opencv を使いたい場合 Ubuntu20.04だと,ligGL.so が無いとエラーを吐く libgl1-mesa-dev を入れれば動いてくれる じゃあ README に libgl1-mesa-dev が必要だとメモしておこう
半年後... 同じPC内の別プロジェクトでopencvを使いたい すでに libgl1-mesa-dev が入っているのでエラーが起こらない libgl1-mesa-dev が必要であることに気づかない (忘れてしまっている) README にメモし忘れる 利用者が開発環境を再現出来ない
じゃあどうすれば良い? python 環境の再現であれば venv で 仮想化 し パッケージのインストールをrequirements.txt にまとめておけば良い それ以外の環境の場合は? 環境を仮想化し (Docker Engine ) パッケージのインストールをどっかに書いてまとめよう ( Dockerfile )
全然分かんないけど,パッケージのインストールを ------Debian こんな感じに書けたら良いな...と普通思うはず
全然分かんないけど,パッケージのインストールを こんな感じに書けたら良いな...と普通思うはず 偶然にも, Docker はこういう感じに書く!
② Dockerの概要 ちょっと①と内容が被る
面白そうなプロジェクトがあるので試してみたい...
まず環境を用意してみよう → ??? + ceres-solver (クラッシュする) + COLMAP (バージョンいくつやねん)
まず環境を用意してみよう → ??? + ceres-solver いや,知らんわ + COLMAP (バージョンいくつやねん) (クラッシュする)
リポジトリをよく見てみると... Dockerfile を発見! とってもうれしい
Docker 環境が用意されていると... 面倒な環境設定を ① ビルド ② 起動 の2ステップで済ませられる
③ Dockerの使い方
Dockerの仕組みは? コンテナの中に環境を作る コンテナは小さいOSみたいなもの Docker Engine上にコンテナを作る 開発者
Dockerを使うと,プロジェクト利用者がいる場合に... 開発者 利用者
利用者のOSに環境をそのまま移動できる 開発者 利用者
コンテナが立ち上がるまで ① Dockerfileを書く ------Debian 書き方はなんとなく察するはず
Dockerfileからコンテナを起動? これではコンテナを起動するたびにインストールが実行されてしまう!
Dockerイメージからコンテナを起動! ② Dockerfile から Docker イメージをビルドする ③ Docker イメージからコンテナを起動する ① Dockerfile ②ビルド Docker イメージ ③起動 実際にコマンドが走るので遅い イメージからコンテナを起動するのは速い
環境は出来た.しかし,ホストOSのファイルを参照するには? 仮想化によってホストのファイルが見えない これでは,ホストにあるコードを コンテナ内で動かせない 3つのアプローチがあるが (ホストOS) 今回は bindマウント のみ紹介する
bindマウント ホストのディレクトリ ( pwd ) を コンテナ内のディレクトリ ( /app ) に マウントする bind (ホストOS) つまり,変更が双方向に即座に反映される 仮想化を気にせずファイルを変更できる
④ Dockerのデモ
内容 Dockerfileの書き方 (キャッシュが作られることを確認) コンテナのビルド・起動 VSCodeにアタッチ パッケージのインストール確認 bindマウントの確認
⑤ 備考
Dockerイメージのキャッシュ 一部のコマンド (RUN, COPY, ADD句など)はイメージのキャッシュが作られる キャッシュが作られるので 変更が少ないコマンドは上のほうに書く 諸説あるが,RUN句は1コマンドでまとめる
build context Dockerイメージのビルドにはcontextが必要 (ここでは ”.”) contextはビルド時のルートディレクトリとなる ホストの ./requirements.txt を コンテナ内の /app にコピーする
build contextと.dockerignore Docker Engine はビルド開始時にcontext配下のファイルを収集する コンテキスト配下に data/ のような大きいディレクトリがあるとビルド出来ない (確か) コンテキスト配下に .dockerignore を作成し data/ をエスケープする ( .gitignore と同じ書き方)
ファイルのパーミッション 配布されているイメージの多くはコンテナ内で root ユーザーになっている コンテナ内で作成したファイルはホスト側でも root でしか開けない 対処 ① コンテナ内でホスト側のユーザーと同じUID, GIDを持つユーザーを作成する ② chmodコマンド (基本は①で良い)
Docker Compose docker build, docker runは結構長いコマンドになる Docker Compose は docker-compose.yml にコンテナの構成を記述し, docker compose upするだけでコンテナのビルド・起動ができる 複数コンテナを一度に立ち上げられたりとか色々できるので便利 (コンテナを1つしか立ち上げない場合は使わなくて良いと思う)