ダウンロード
動作確認
docker container run hello-world
-> 実行できたらDocker daemon
が動いている
イメージ
コンテナを作る元になる土台のこと
イメージ図解
ローカルにイメージをダウンロードする
docker image pull {イメージ名:タグ名}
- タグ名を省略した場合
イメージ名:latest
を指定する - 落としたいイメージは
Docker Hub
から探す
ローカルに存在するイメージ一覧を表示
docker image ls
ローカルのイメージを削除
docker image rm {イメージ名:タグ名}
Dockerfileからイメージを作成する
# 基本的には以下の感覚で良い
docker image build {Dockerfileの存在するディレクトリ}
# 厳密には以下の感覚でいる必要がある
docker image build -f {Dockerfileのパス} {ビルドコンテキストのパス}
-
-t {イメージ名:タグ}
をimage build
のオプションに渡すとイメージに命名が出来る -
-f {Dockerfileのパス}
をimage build
のオプションに渡すと明示的にDockerfileを指定する -
--target {ビルド対象のステージ}
をimage build
のオプションに渡すと明示的に
イメージ化するステージを指定出来る -
ビルドコンテキストについては以下の記事を参照する
- マルチステージビルドについては以下の記事を参照する
イメージレイヤーを可視化する
docker image history {イメージ名:タグ名}
- イメージレイヤーについては以下の記事を参照する
Dockerfileの書き方
-
FROM {イメージ名:タグ名}
でベースイメージを決める -
RUN {コマンド}
はイメージビルド時にコマンドを実行する -
COPY {コピー元ローカル内のファイル コピー先イメージ内のファイル}
は
イメージビルド時にローカルからイメージに任意のファイルをコピーする -
CMD ["コマンド", "オプション1"...]
はデフォルトコマンドを上書きする -
ENV key="value"
はコンテナで使える環境変数を与える -
ARG 変数名="デフォルト値"
でイメージビルド時にDockerfile内でのみ使う変数を宣言する-
docker image build
に対して--build-arg {変数名="代入値"}
の
オプションを与えて代入する
-
-
WORKDIR {ディレクトリパス}
で- イメージビルド時に命令が実行されるディレクトリを変更する
- コンテナに入った瞬間のディレクトリを変更する
コンテナ
ホストOSとは隔離された実行環境のこと
コンテナ図解
イメージからコンテナを起動して実行する
docker container run {イメージ名:タグ名}
- タグ名を省略した場合
イメージ名:latest
を指定する -
image
がローカルに存在しない場合image pull
からcontainer run
を直列に行う -
-it
をcontainer run
のオプションに渡すと対話モードになる -
--name
をcontainer run
のオプションに渡すとコンテナ名を明示的に決定 -
--rm
をcontainer run
のオプションに渡すとExit
状態 -> 破棄 を自動で行う -
-d
をcontainer run
のオプションに渡すとコンテナをバックグラウンドで実行する
バッグラウンド起動してるコンテナに接続する
docker container attach {コンテナ名 | コンテナID}
イメージから任意のコマンドでコンテナを起動する
docker container run {イメージ名:タグ名} {任意のコマンド}
-
イメージ名
の後にコマンドを入力するとデフォルトコマンドを乗っ取って任意のコマンドを実行出来る
起動しているコンテナに任意のコマンドを実行する
docker container exec {コンテナ名 | コンテナID} {任意のコマンド}
実行されているコンテナを表示する
docker container ls
-
-a
をオプションに付けるとexit
したコンテナも表示される
Up状態のコンテナをExit状態にする
docker container stop {コンテナ名 | コンテナID}
Exit状態のコンテナをUp状態にする
docker container restart {コンテナ名 | コンテナID}
バックグラウンドで動いてるコンテナのログを見る
docker container logs {コンテナ名 | コンテナID}
Exit状態のコンテナを破棄する
docker container rm {コンテナ名 | コンテナID}
- Up状態のコンテナは破棄出来ないので、
container stop
からcontainer rm
を直列に行う -
-f
をcontainer rm
のオプションに渡すと状態問わず破棄する
Up状態以外のコンテナを全て破棄する
docker container prune
-
Created
・Exit
状態のコンテナを全て破棄する
ボリューム
Docker daemon
の管理下で、コンテナから独立したデータ保存領域
-
ボリュームの実体はディレクトリ
windows
なら\\wsl.localhost\docker-desktop-data\data\docker\volumes
に存在する
ボリューム図解
ボリュームを作成する
docker volume create {ボリューム名}
ボリューム一覧を表示する
docker volume ls
ボリュームの詳細を表示する
docker volume inspect {ボリューム名}
ボリュームを削除する
docker volume rm {ボリューム名}
ボリュームに接続してコンテナを起動する
# 以下二つは同じ挙動を取る
docker container run -v {ボリューム名}:{コンテナ内絶対パス} {イメージ名}
docker conitaner run --mount type=volume,src={ボリューム名},dst={コンテナ絶対パス} {イメージ}
- コンテナ内ディレクトリをボリュームに同期させて起動する
バインドマウント
ホストOS内ディレクトリとコンテナ内ディレクトリを同期させて起動させる機能
バインドマウント図解
ホスト側のファイル・ディレクトリをコンテナと同期させてコンテナ起動
# 以下二つは同じ挙動を取る
docker contianer run -v {ホスト側パス}:{コンテナ内絶対パス} {イメージ名}
docker conrainer run --mount type=bind,src={ホスト側パス},dist={コンテナ内絶対パス} {イメージ名}
ネットワーク
コンテナ群を論理的に分割しグルーピングしたもの
- 同ネットワーク内のコンテナはコンテナ間通信が可能
- 異ネットワーク内のコンテナはコンテナ間通信が出来ない
ネットワーク図解
ホストOSのポートとコンテナのポートを紐づけて外部からの通信をコンテナへ伝達する
docker container run -p {ホスト側ポート}:{コンテナ側ポート} {イメージ名}
ネットワーク一覧を表示する
docker network ls
ネットワークの詳細情報を表示する
docker network inspect {ネットワーク名}
-
Containers
を見るとネットワーク配下のコンテナが分かる
ネットワークを作成する
docker network create {ネットワーク名}
コンテナを任意のネットワークに接続して起動する
docker container run --network {ネットワーク名} {イメージ名}
-
--network
を指定しなかった時、コンテナはデフォルトのbridge
ネットワーク配下に
配置される - ユーザ定義ネットワークではコンテナ名からIPアドレスを自動で名前解決出来る
指定したネットワークを削除する
docker network rm {ネットワーク名}
Docker Compose
コンテナ群の起動を1コマンドで行えるモノ
-
docker-compose.yml
はdocker compose up
で起動するコンテナ群のcontainer run
に
渡すオプションを予め記載しておくファイル
コンテナを起動する
# docker-compose.ymlに定義された全コンテナを起動する
docker compose up
# docker-compose.ymlに定義された内指定したコンテナを起動する
docker compose up {サービス名}
-
--build
をcompose up
のオプションに渡すとイメージが存在してもimage build
を行う
docker compose up
で起動した全コンテナを破棄する
docker compose down
特定のコンテナで任意のコマンドを実行する
docker compose exec {サービス名} {コマンド}
ディレクトリ内のcompose up
で起動しているコンテナ一覧を表示する
docker compose ps
docker-compose.ymlの書き方
-
version: {バージョン}
でDocker Composeの解釈されるバージョンを指定する -
services
配下に入れ子でサービス名を記載し、各サービスを定義する
各サービスはdockerリソースのコンテナと同等
-
各サービスに対して入れ子で以下のように起動時のオプションを記載出来る
-
build: {ビルドコンテキストパス}
はimage build
時のビルドコンテキストを指定する-
context
とtarget
を入れ子にするとimage build
の--target
オプションを使える
-
-
image: {イメージ名:タグ名}
はimage build
時のDocker Hubのイメージを指定する-
各サービス
にはbuild
かimage
のどちらかが必須
-
-
ports
はcontainer run
の-p
オプション -
environment
はcontainer run
の-e
オプション -
volumes
はcontainer run
の-v
オプション -
container_name
はcontainer run
の--name
オプション -
tty: true
はcontainer run
の-t
オプション -
depends_on
は指定したサービス群
が起動するまで自サービスの起動を待つオプション
-
-
volumes
配下に入れ子でボリューム名を記載し、ボリュームの新規作成を定義する
以下がdocker-compose.yml
の例
volumesの例
version: "3.9"
services:
api:
build: ./api
ports:
- 8080:8080
depends_on:
- db
db:
image: postgres:15
ports:
- 5432:5432
environment:
- POSTGRES_PASSWORD=mypassword
- POSTGRES_USER=postgres
- POSTGRES_DB=appdb
volumes:
- db-storage:/var/lib/postgresql/data
- ./db/initdb:/docker-entrypoint-initdb.d
volumes:
db-storage:
ステージ指定でのimage build例
version: "3.9"
services:
api:
container_name: api
build: ./api
ports:
- 8080:8080
tty: true
volumes:
- ./api:/workspace:cached
web:
container_name: web
build:
context: ./web
target: base
ports:
- 3000:3000
environment:
- REACT_APP_API_SERVER=http://localhost:8080/api
tty: true
# :cached ホスト側での変更を瞬時に同期させないがパフォーマンスを向上させる
volumes:
- ./web:/workspace:cached
depends_on:
- api