Dockerノウハウ

ビルド時に特定のRUN以降のキャッシュを無効にする。

  • ARGを適当な場所に入れる。

ARG CACHEBUST=1
  • build時に引数を設定する。

$ docker build -t tagname --build-arg CACHEBUST=$(date +%s) .
  • 参考

    • https://www.chazine.com/archives/4038

コンテナを起動したままにする方法。

  • 以下で起動状態を維持できる。

$ docker run -itd {イメージ名}:{タグ} /bin/sh
$ docker exec -it {イメージ名}:{タグ} /bin/sh # その後、これでログイン
  • docker-composeで、tty:trueとしてもできる。

version: '2'
services:
  sample:
    image: {イメージ名}:{タグ名}
    container_name: sample_container
    tty: true
  • 参考

    • Dockerのコンテナを起動したままにする

      • https://qiita.com/reflet/items/dd65f9ffef2a2fcfcf30

コンテナの自動起動設定

  • docker-composeの場合、restart: alwaysを指定する。

services:
  ubuntu:
    image: ubuntu:latest
    restart: always
  • docker runコマンド実行時に以下の引数を与えることで、自動起動にできる。

$ docker run --restart=always ...
  • 既に起動済みのコンテナにリスタートする用に設定を変更する。

$ docker update --restart=always <CONTAINER NAME>
  • container一覧の自動起動設定を取得する。

$ docker inspect -f "{{.Name}} {{.HostConfig.RestartPolicy.Name}}" $(docker ps -aq)
  • 参考

    • https://www.pressmantech.com/tech/6522

composeでビルドする際に、image名を指定する

  • imageというパラメータを使えばよい。階層は、buildと同じ。

version: '2.3'
services:
  sample_service:
    build:
      context: .
      dockerfile: Dockerfile
      image: sample:latest
  • 参考

    • https://amaya382.hatenablog.jp/entry/2017/04/03/034002

composeでnvidia-dockerを使う

  • composeのversionが2の場合

version: '2.4'
services:
  sample:
    image: nvidia/cuda:11.2.1-base
    command: nvidia-smi
    runtime: nvidia
    environment:
      NVIDIA_VISIBLE_DEVICES: all
      NVIDIA_DRIVER_CAPABILITIES: utility,compute,video
  • composeのversionが3の場合

    • deploy配下が必要な部分

version: '3.8'
services:
  sample:
    image: nvidia/cuda:11.2.1-base
    command: nvidia-smi
    deploy:
      resources:
        reservations:
          devices:
           - driver: nvidia
             capabilities: [utility, compute, video]
  • 以下を参考

    • https://qiita.com/routerman/items/c5f9d7b6d03e44de6be2

WSL2がdocker prune済みの領域を返してくれない

// WSLを止める
> wsl --shutdown

// diskpartを起動する(diskpartのウィンドウが開きます)
> diskpart

// 対象のvhdxファイルを指定(PATHは各自確認して下さい)
DISKPART> select vdisk file="C:\Users\[ユーザ名]\AppData\Local\Docker\wsl\data\ext4.vhdx"
DISKPART> attach vdisk readonly

// 最適化する
DISKPART> compact vdisk

// 終了
DISKPART> detach vdisk
DISKPART> exit
  • 参考

    • https://7me.nobiki.com/2020/10/12/wsl2-docker-re-use-disk-space/

GPGエラー

  • apt updateでGPG エラーが出たら

    • https://qiita.com/HS310164/items/15ebb375726ff4db4eb2

ML向けdockerの工夫点

  • 機械学習なdockerfileを書くときに気をつけとくと良いこと

    • https://nykergoto.hatenablog.jp/entry/2020/07/25/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AAdockerfile%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%A8%E3%81%8D%E3%81%AB%E6%B0%97%E3%82%92%E3%81%A4%E3%81%91%E3%81%A8%E3%81%8F%E3%81%A8%E8%89%AF%E3%81%84%E3%81%93

複数サービスの実行

  • 一つのスクリプトにまとめてそれを実行するのが推奨の方法。

      • https://docs.docker.jp/v19.03/config/container/multi-service_container.html

  • daemonで動かすために、通常のsystemctlコマンドはコンテナ内で普通使えない。

    • 一応使う方法はあるが、今度は通常通りには使えない。

      • https://qiita.com/flour/items/977abe462955e4285d0b

一般ユーザーをコンテナ内に作成する

RUN apt-get install -y sudo
RUN useradd -m ubuntu
RUN echo 'ubuntu:ubuntu' | chpasswd
RUN usermod -aG sudo ubuntu
  • 参考

    • https://qiita.com/nishina555/items/52aef60cfb82fb794b18

SSH接続できるコンテナ環境の作成

  • https://qiita.com/takat0-h0rikosh1/items/ae6d951a4b25d260894c

コンテナ内から別コンテナに通信する

  • 公式

    • https://docs.docker.jp/compose/networking.html#compose-links

  • コンテナサービス名:コンテナ側のポートでアクセスできる。

  • ホスト側のポートだと思ってたので要注意。

shared memory領域の拡張

  • Dockerのshared memoryはデフォルト64MBとなっている。

  • composeファイルに以下のように記載する。

version: "3.3"

services:
  service1:
    build:
      - context: .
      - shm_size: '2gb' # ビルド時のshmサイズ
    shm_size: '2gb' # 稼働時のshmサイズ
  • 現在の割り当て確認には、コンテナ内でdfコマンドを使えばよい。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
shm             2.0G     0  2.0G   0% /dev/shm

デザインパターン

歴史

Last updated