LoginSignup
5
7

More than 5 years have passed since last update.

My Docker チートシート

Last updated at Posted at 2016-09-12

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では、相対パスが利用できる。./ を指定すること。

参考

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7