目次
概要
よく使うDockerのコマンドのメモ。
Docker
Lifecycle
Docker全体のライフサイクル
DockerのLifecycleの全体像は次のような形になる。
Conatinerのライフサイクル
Conatinerに関しては次のライフサイクルを持つ。
Dockerの基本コマンド
|
|
Image
Dockerfile -> Image
buildコマンドはDockerfileをビルドしてcontainer imageを作る。
|
|
Image <-> Registry
|
|
Image操作
|
|
Images -> Containers
runコマンドは、作ったcontainer imageをcontainer processにする。
|
|
Containers
Container操作
以下はコンテナ関連のコマンド。
|
|
Host -> Containers
既に起動しているContainer processにアタッチする。
|
|
Backup
Backup Image
Docker Imageのバックアップ。
|
|
Backup Container
Docker Containerのバックアップ。
|
|
Backup Container File
Docker Container内のファイルのバックアップ。
|
|
docker-machine
今はないdocker-machineコマンド。
|
|
Volume
Data Volume
|
|
Network
None
ネットワーク接続を必要としないコンテナを作成する場合に使用される。
Bridge
dockerのデフォルトの挙動。
Host
Docker ホストマシンと同じネットワークインタフェース、IP アドレスを持つようになる。
違い系
ホストとコンテナの違い
- ホストはDockerを実行する環境
- コンテナはContainer processの内部環境
ArgsとEnvの違い
- ARG
- build時に使われる
- ビルド後のImage内では値は残らない
- そのため、次のようにセットすることも一般的
1 2
ARG VERSION=latest ENV MY_APP_VERSION=$VERSION
docker build --build-arg VERSION=1.2.3 .
みたいな形でsetする
- ENV
- ENVは実行時に使われる環境変数
- ENVはImageそのものに記憶される
.env
を読み込む事も可能
CMDとRUNの違い
- RUN
- ビルド時に実行され、イメージに変更を加えるためのコマンド
- CMD
- Dockerコンテナが起動された際に実行されるデフォルトのコマンド
RUNとENTRYPOINTの違い
- CMD
- コンテナが起動する際に実行されるデフォルトのコマンド
- ただし、
ENTRYPOINT
と組み合わせた場合はENTRYPOINT
のデフォルトの引数として機能する1 2
ENTRYPOINT ["curl"] CMD ["http://example.com"]
- ENTRYPOINT
- ENTRYPOINTはコンテナのメインの実行コマンドを固定する
- ENTRYPOINTで指定されたコマンドは、コンテナが実行される際にいつも呼び出される
- スタートアップスクリプト(例えば
entrypoint.sh
)を通じて、複数のコマンドを実行することが目的
Tips
Dockerfileの分割の定番
Dev, Stg, ProdなどでDockerfileを分けたいときは、おおむね次の三つの方法を使う。
- docker-composeのoverwrideを使う
- multi stageを使う
- Dockerfile.xxxとファイルを分割する
ログが分かりにくい時
ログが分かりにくい時は、はファイルに出力する。
|
|
docker-composeのbuildの際に注意すること
docker-compose up
する前にdocker-compose down
する。docker-compose ps
でpsの確認する。- 開発するときはタブラローサから
docker exec
してインタラクティブに開発する - ビルドする場合は、
docker-compose up --build
する - キャッシュを飛ばしてビルドする場合は、
docker-compose up --build --no-cached
する COPY
とADD
はファイルに変更があった場合は、cacheがhitしないので注意- 時間のかかる
requirements.txt
などは先にADD requirements.txt .
してRUN pip install -r requirements.txt
する - 消すときは
docker-compose down --remove-orphans
を使う。 - すると、定義していないコンテナも消せる。
Docker Buildがうまく動かない時
Dockerが動かないときは、とりあえずエラー前でSleepコマンドを入れて動くDockerfileにする。
|
|
次のコマンドを実行して起動する。
|
|
その後、次のように実行して、実際のRUNのコマンドを確認する。
|
|
Dockerのお掃除
以下は肥大化したDockerfile関連のファイルを消す。
|
|
最近は次のコマンドでも実行が可能。
|
|
Docker Imageの大きさ
- ECRなどのリポジトリにPushしたDocker ImageとローカルのDocker Imageのサイズには差があるので注意
--no-trunc
をつけて、フルメッセージを確認して、どこのレイヤーが重いのかを確認するのが大切
|
|
Dockerの使い方の例
シンプルにRUNする
一番シンプルな使い方。
|
|
停止は次のコマンド
|
|
VSCodeのDocker Extension
VSCodeのDocker Extensionが簡単なので、おすすめ。
ボリュームにファイルを置く
カスタムHTMLを追加する使い方。
|
|
コマンドは次となる。
|
|
継承したDockerfileを用意する
|
|
重要なのは、ENTRYPOINT
やCMD
などは不要ということ。それらはベースのNGINXのイメージのを使えるから。
ビルドする。
|
|
実行する。
|
|
マルチステージでビルドして渡す
シンプルに次のようなフロントのファイル構成で、
|
|
次のようにマルチステージでビルドする。そして、そのビルド後のファイルを持ってくる。
|
|
設定ファイルは次のようになる。
|
|
ビルド時の不要なファイルは省かれるのでスリムになる。
References
- Dockerコマンドメモ #Docker - Qiita
- GitHub - tcnksm/docker-alias: My Docker alias and functions
- Install Docker Engine on Ubuntu | Docker Docs
- docker | Docker Docs
- Volumes | Docker Docs
- Data Volume と Data Volume Container #Docker - Qiita
- コンテナでデータを管理する — Docker-docs-ja 1.9.0b ドキュメント
- 使用していない Docker オブジェクトの削除(prune) — Docker-docs-ja 24.0 ドキュメント
- Docker ARG, ENV and .env - a Complete Guide · vsupalov.com
- Docker network 概論 #Docker - Qiita
- Docker Container Lifecycle Management | Docker create run stop remove