Contents
dockerでコンテナを起動するまでの流れ
dockerでコンテナを起動するまでの流れはこのようになっています。
- Dockerfileにイメージの定義を記述する
- Dockerfileをビルドして、イメージを作成する
- イメージをrunして、コンテナを起動する。
ビルドではdockerデーモンがDockerfileを一行ずつ実行して、最終イメージに仕上げます。
イメージとコンテナ
イメージとコンテナをJava風に言うと、クラスとインスタンスです。
イメージというクラスを元に作成されたインスタンスがコンテナです。
イメージ
イメージの作成・入手方法は2つある。
・docker hubから既製品を手に入れる方法
・Dockerfileで定義する方法
である。
イメージをdocker hubから入手する docker pull
イメージをdocker hubから入手するには、docker pullコマンドを使用します。
構文
docker pull イメージ名
例
$ docker pull amazoncorretto
Using default tag: latest
latest: Pulling from library/amazoncorretto
591d91c97b5d: Pull complete
1f7db63499db: Pull complete
Digest: sha256:11fafa4a4148a23a0497ef61baed59a91f5dce812719af3903e55f4e09bad72a
Status: Downloaded newer image for amazoncorretto:latest
docker.io/library/amazoncorretto:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
amazoncorretto latest 8738f4ccea9e 9 days ago 364MB
M1 Macでエラーが発生する場合
M1 Macだと「no matching manifest for linux/arm64/v8 in the manifest list entries」というエラーになります。
noricgeographic@MacBook-Air ~ % docker pull mysql:8.0.28
8.0.28: Pulling from library/mysql
no matching manifest for linux/arm64/v8 in the manifest list entries
次のように、-platformを付与してください。
noricgeographic@MacBook-Air ~ % docker pull --platform linux/amd64 mysql:8.0.28
イメージをDockefileから作成する docker build
記述したDockerfileからイメージを作成するには、docker buildコマンドを使用します。
構文
docker build [Dockerfileのパス]
--build-arg | Dockerfileへ渡すパラメータを指定する |
-t | イメージ名を指定する |
例
$ docker build --build-arg JAR_FILE=build/libs/*.jar -t sample-system .
イメージを操作するDockerコマンド
docker images (docker image ls)
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sample-system latest 54365396c9d5 11 seconds ago 675MB
bulletinboard 1.0 85ca31600dbe 7 months ago 188MB
コンテナ
コンテナを一覧表示する docker container ls
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6007178f5137 sample-system "java -jar /app.jar" About an hour ago Up About an hour 0.0.0.0:8082->8080/tcp, :::8082->8080/tcp adoring_merkle
7f292e626c8a mysql:5.7 "docker-entrypoint.s…" 7 months ago Up 38 hours 3306/tcp, 33060/tcp mysite2_mysql2_1
イメージからコンテナを作成し、起動する docker run
イメージを元にコンテナを作成し、起動するにはdocker runコマンド
を使用します。
構文
$ docker run --name コンテナ名 イメージ名
--name でコンテナ名を指定しない場合、適当なコンテナ名が割り当てられます。
例
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jdk11 latest 5ee1566af013 2 days ago 675MB
// コンテナ起動
$ docker run --name my-container-name jdk11
// コンテナが起動されたことを確認
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
062d1d4b3f54 jdk11 "java -jar /app.jar" 45 seconds ago Up 45 seconds 8080/tcp my-container-name
コンテナを停止する docker stop
// 起動中であることを確認
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
062d1d4b3f54 jdk11 "java -jar /app.jar" 45 seconds ago Up 45 seconds 8080/tcp my-container-name
// コンテナを停止する
$ docker stop my-container-name
my-container-name
// コンテナが停止したことを確認
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
存在するコンテナを起動する docker start
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
062d1d4b3f54 jdk11 "java -jar /app.jar" 10 minutes ago Exited (143) 7 minutes ago my-container-name
$ docker start my-container-name
my-container-name
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
062d1d4b3f54 jdk11 "java -jar /app.jar" 10 minutes ago Up 3 seconds 8080/tcp my-container-name
停止中のコンテナは docker container ls
では表示されませんので、-aオプション
を付与して表示します。
コンテナを削除する docker rm
// 起動中のコンテナは削除できない
$ docker rm my-container-name
Error response from daemon: You cannot remove a running container 062d1d4b3f54d528fa3daef3f5f19797f5844dc93f8084e0360361f5c8a6ddb4. Stop the container before attempting removal or force remove
// コンテナを停止する
$ docker stop my-container-name
my-container-name
// コンテナを削除する
$ docker rm my-container-name
my-container-name
// コンテナが削除されたことを確認する
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ネットワーク
dockerのネットワークとは?
dockerで用意されているネットワーク
初期状態で docker network ls
を実行すると、次の結果になります。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
7611ca490fb1 bridge bridge local
90613ad17e31 host host local
c8d9c64ed60a none null local
このことからわかるように、dockerには初期状態で3つのネットワークがあります。
bridgeネットワーク | このネットワークをアタッチすると、コンテナはdocker0というネットワークに属する。docker0を経由して、ホストマシンと同じネットワークに属する。 |
hostネットワーク | このネットワークをアタッチすると、コンテナは直接ホストマシンと同じネットワークに属する。 |
noneネットワーク | このネットワークをアタッチすると、コンテナはネットワークを持たなくなる。外部からアクセスできない、閉じたコンテナとなる。 |
ネットワークを一覧表示する docker network ls
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
7611ca490fb1 bridge bridge local
90613ad17e31 host host local
c8d9c64ed60a none null local
ネットワークを作成する docker network create
$ docker network create spring-network
45b099f9835df9e1c03bc0e58f21b1614a406ebf0d4ce7e64b2760e7319f5533
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
45b099f9835d spring-network bridge local
ボリューム(コンテナで作成されたデータの永続化)
dockerのボリュームとは?
コンテナで作成されたデータ(MySQLコンテナのレコード情報など)を永続化する方法は2つあります。
- 名前付きボリューム
- ディスクマウント
です。
名前付きボリュームは、ホストにあるdockerが管理する領域に、任意の名前をつけたボリューム(領域)を作成する方法です。
ディスクマウントは、ホストの任意のディレクトリを、コンテナの任意のディレクトリで使えるようにする方法です。
ボリュームに関するコマンドを表示する docker volume help
ボリューム操作はdocker volume
です。
但し、docker volumeにより操作するのは名前付きボリュームのみです。
helpを付けることで、操作一覧を表示します。
$ docker volume help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
ボリュームを一覧表示する docker volume ls
docker volume ls
は現在定義されているボリュームを表示します。
$ docker volume ls
DRIVER VOLUME NAME
local mysite2_wordpress2vol
local okozukai-docker_mysql_db
local springboot-mysql_mysql_db