スポンサーリンク

Docker デプロイ(CD/CI)

dockerの基礎知識

投稿日:2022年2月14日 更新日:

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-argDockerfileへ渡すパラメータを指定する
-tイメージ名を指定する
docker buildの主なオプション

$ 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

Udemyのハンズオン動画講座でSpringBootのスキルを磨く!

スポンサーリンク

-Docker, デプロイ(CD/CI)

Copyright© 【Spring Hack】 , 2022 All Rights Reserved Powered by AFFINGER5.