DockerコマンドやDockerfileの書き方など、自分用の覚書です。
ドキュメント
Dockerコマンド
ビルド(build)
Dockerfileを指定する
docker build -f <ファイルパス> .
タグを付ける
docker build -t <タグ名> .
起動(run)
名前を指定する
docker run --name <コンテナ名> <イメージ名>
コンソールを表示する
docker run -t -i <イメージ名>
終了したときにコンテナを残さない
docker run --rm <イメージ名>
VOLUMEを指定する(マウントする)
VOLUMEを利用することで、コンテナ外の定義ファイルを読み込んだり、コンテナ内で出力されるファイルを保存したり、といったことが可能になり、本番環境での運用などでは重要な内容になる。
docker run -v <ホストのパス>:<コンテナのパス> <イメージ名>
-
ホストのパス/コンテナのパスは、絶対パスで指定する。そうしないと、名前として認識されてしまい、異なる意味の指定になる。
-
例えば、シェルであれば、以下のように記述することで、絶対パスを指定できる。
CURRENT_PATH=$(cd $(dirname $0) && pwd) HOST_PATH=${CURRENT_PATH}/config docker run -v ${HOST_PATH}:/opt/config docker/example
総合
docker run --rm --name <コンテナ名> -t -i \
-v <ホストのパス>:<コンテナのパス> \
-p <ホストのポート番号>:<コンテナのポート番号> \
<イメージ名>
-
-v
や-p
などは、複数指定することが可能。
イメージに対する操作
一覧を表示する
docker images
イメージを指定して削除する
docker rmi <イメージID>
利用されていないイメージを削除する
docker rmi $(docker images | awk '/^<none>/ { print $3 }')
- Windowsの場合
for /f "usebackq tokens=1-5" %I IN (`docker images ^| findstr "^<none>"`) do docker rmi %K
イメージの一括削除(要注意)
docker rmi `docker images -aq`
コンテナに対する操作
停止中のコンテナも含めて、一覧を表示する
docker ps -a
停止中のコンテナを削除する
docker rm `docker ps -a -q`
古いコンテナを削除する
docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm
- Windowsの場合
for /f "usebackq" %I IN (`docker ps -a -q`) do docker rm %I
Dockerfile
ひな形
自分の場合は、おおよそ、以下のような流れで記述する。
- ホストのcontainer-filesディレクリに、Dockerイメージに含めたいファイルを準備しておき、COPYでコンテナ内に配置する。
- 永続化する必要のあるファイルは、VOLUMEでマウントしておく(ホスト側のパスは、runを実行時に指定)。
- プロセス実行ユーザは、個別に設ける。rootで実行しない。
-
entrypoint.sh
という、対象となるプロセスを実行するシェルを外部に用意する。そこで環境変数や定義ファイルを参照できるようにし、コンテナ起動時に、環境変数や定義ファイルを指定できるようにしておく。
FROM centos:7
ENV JAVA_HOME=/usr/lib/jvm/jre-1.8.0
RUN yum -y install java-1.8.0-openjdk
# 必要なミドルウェアやソフトウェアをインストール
RUN yum -y clean all
# Config mount
VOLUME ["/opt/app/config"]
COPY container-files/entrypoint.sh /opt/
RUN chmod +x /opt/entrypoint.sh
# Output mount
RUN mkdir -p /opt/app/data; chown -R appuser:appgroup /opt/app/data
RUN mkdir -p /opt/app/logs; chown -R appuser:appgroup /opt/app/logs
VOLUME ["/opt/app/data", "/opt/app/logs"]
USER appuser
ENV PATH=${PATH}:${JAVA_HOME}/bin
# Expose ports.
# - 8081: HTTP
EXPOSE 8081
# Exec
ENTRYPOINT ["/opt/entrypoint.sh"]
docker-compose
ひな形
app1:
build: ./app1
volumes:
- ./app1/config:/opt/app1/config
- ./app1/log:/opt/app1/log
ports:
- "<ホストのポート番号>:<コンテナのポート番号>"
app2:
build: ./app2
volumes:
- ./app2/config:/opt/app2/config
ports:
- "<ホストのポート番号>:<コンテナのポート番号>"
links:
- app1
-
volumes
では、相対パスが利用できる。./
を指定すること。