基本トピックの確認
Dockerの概要
Dockerはコンテナ型の仮想環境の構築にあたって用いられるオープンプラットフォームです。Docker以前の仮想環境の構築にあたってはVirtualBox(ホスト型)などが用いられていましたが、仮想環境毎にOSをインストールする必要があるなど冗長だったのでDockerが用いられることが多くなっています。
Dockerを動かすにあたってはdocker-composeを使う方法が紹介されていることが多いですが、当記事ではDockerfileからdocker buildを用いて環境を構築しdocker runを用いて起動とログインを行う流れをご紹介します。
用いるDockerのコマンド
| コマンド名 | 動作 |
|---|---|
docker run |
ベースに用いるimageの指定 |
docker images |
imageの一覧の確認 |
docker image pull |
ベースに用いるimageの指定 |
docker image rm |
ベースに用いるimageの指定 |
docker build |
ベースに用いるimageの指定 |
Dockerfileに用いられる基本コマンド一覧
| コマンド名 | 動作 |
|---|---|
FROM |
ベースに用いるimageの指定 |
ENV |
Docker内で使用する環境変数の指定 |
WORKDIR |
Dockerfileに書かれたコマンドを実行する作業用ディレクトリの指定 |
COPY |
ホストのファイルをDocker内にコピー |
RUN |
Docker内でのコマンドの実行 |
USER |
Dockerファイルに記載したコマンドを実行するユーザの指定 |
CMD |
デーモンの実行 |
Docker環境の構築とdocker runによる起動の流れ
Dockerfileの作成と環境のビルド
FROM nvidia/cuda:12.4.0-runtime-ubuntu22.04
WORKDIR /app
たとえば上記のようなDockerfileをカレントディレクトリに保存し、下記のようなコマンドを実行することでDocker環境を構築することができます。
$ docker build . -t docker_name:latest
上記のdocker_nameは作成するDocker環境毎に変える必要があります。Docker環境が構築されたかどうかは下記のようにCLIからdocker imagesを実行することで確認できます。
$ docker images
・CLIの出力
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
docker_name:latest xxx...xx xxxGB 0B
docker runによる起動
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
docker_name:latest xxx...xx xxxGB 0B
docker imagesの実行時に上記のような出力が得られる場合、下記のようなシェルスクリプトを実行することでDockerの起動とDocker内へのログインを行うことができます。
・シェルスクリプト
#!/bin/bash
XAUTH=/tmp/.docker.xauth
rm -fR $XAUTH
touch $XAUTH
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
chmod a+r $XAUTH
docker run -it --rm \
--gpus all \
-e NVIDIA_DRIVER_CAPABILITIES=compute,utility \
--shm-size=8gb \
--net=host \
--ipc host \
-h="pc1" \
--name pc1 \
--env="DISPLAY=$DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--env="XAUTHORITY=$XAUTH" \
--volume="$XAUTH:$XAUTH" \
--volume="./file_dir:/work" \
docker_name \
/bin/bash --login
・実行コマンド
$ sh start_docker.sh
ローカル環境のfile_dirディレクトリとDocker内のworkディレクトリが対応する点などに注意しておくと良いと思います。
複数コンテナの起動
同じ名称のコンテナを複数起動しようとするとコンフリクトが起きるので注意が必要です。
$ docker ps
・実行結果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
上記のようにdocker psを実行した際のNAMESの項目(前項のdocker runの-h="pc1"のpc1に対応)が同じものが複数となるとコンフリクトとなります。