🍣

一撃でわかる❗️開発エンジニアには必須❗️Dockerとは何ぞや?(かなり詳しく解説)

2023/12/04に公開

概要

会社でDockerの勉強会があり、その時の資料を自分専用にまとめてみました。

コンテナ、仮想化って聞くけど何?

仮想マシンみたいなもので、PC上に仮想環境を作って、それぞれPC環境が違っても
他のメンバーと同じ環境でアプリケーション開発ができます。

アプリケーションを「ひとつの箱(=コンテナ)」に詰め込んで、どこでも同じように動かせるようにする技術ですね。

Dockerとは何?

チームで開発をする上でプログラムの実行環境を共有しないとプログラムがメンバーがバラバラで違う動作になってしまい、開発どころではないです。
これを1つの環境でPCの中にみんなで共有できるPCを作れるツールができました。
アプリケーションをどこでも同じように動かせるようにしてくれる便利なツール」がDockerです。

image.png

  • コンテナ仮想化のイメージです。

image.png

上2つ引用 https://qiita.com/etaroid/items/b1024c7d200a75b992fc

未経験の開発エンジニアの採用でもDocker使ったかどうかは当たり前に聞かれる

前の採用はDockerを使っていない未経験の方でも採用されるケースはあったみたいですが、
最近だとDockerを学習で使ったことあるのかは必須みたいです。
「当然使ったことあるよね?」くらいのイメージです。

Dockerを教えていないプログラミングスクールはこれから正直ヤバいです。

開発エンジニアは知っておいて欲しい

特に駆け出しエンジニアこの記事を全部知る必要はないです。

ただここは読んでおいて欲しいとこだけお伝えします。

Docker Compose関連だけは知っておいてください❗️
Docker構築動画も興味ある人だけでいいです。

Docker構築動画

2021年版ですが、興味があれば見てみてください。

https://www.youtube.com/watch?v=lZD1MIHwMBY

Dockerもメリット他には?

以下の3点です。

  1. 環境構築が簡単
    PC(windowsやmac)上に、対象のアプリケーションを直接インストール。
    PC上にDockerをインストールして、対象のアプリケーションをインストール。
    VirtualBoxなどのVMにゲストOSを立てて、対象のアプリケーションをインストール。
    といった方法があります。

  2. 誰でも、何回実行した場合でも、同じ環境を作ることができる
    Dockerfileを共有すれば、誰でも同じ環境をすぐ作れてしまいます
    コピーして、dockerコマンドでDockerfileを読み込ませるだけでできてしまいます。

3.後片付けも簡単
いらなくなったコンテナ環境も、コマンド一つで削除できます。
自宅PC上に不要なファイルが残らないです。

コンテナ上で環境設定を間違えた場合でも、
イメージファイルだけを切り戻すだけで、ゴミを残さず簡単にロールバックが可能です。

Dockerの全体像

image.png

引用 https://qiita.com/etaroid/items/b1024c7d200a75b992fc

Docker Engine

dockerコンテナの実行環境です。
アプリケーションやその依存関係を 「ひとつの箱=コンテナ」に詰め込む作業 を担当します。
コンピュータ上でコンテナを作って、どんな環境でも同じように動かせるようにしてくれるお手伝いさんのイメージです。

イメージ(Image)

コンテナ(=アプリケーションの実行環境)を起動するためのテンプレートみたいなもので、
コンテナを起動において、必要な設定ファイルをまとめたものです。

Dockerfileと呼ばれる特別なテキストファイルによって定義され、
一度作成されると、その状態は変わりません。

Imageはコンテナの元であり、Imageからコンテナを起動するみたいに思うといいみたいです。
DockerではこのImageを共有することで、
様々なPC環境でも同じコンテナ(実行環境)を動作できます。

Dockerfile

イメージの設計書で、Dockerコンテナを作成するための指示書みたいなものです。
環境構築の手順を記載してあったりします。

Tag

イメージを識別するためのラベルやバージョン情報のようなものです。
通常、Dockerイメージの名前は「リポジトリ名:タグ名」という形式を取ります。

例えば latestみたいなイメージ名があったとします。

nginx:latest
nginx:1.18
nginx:1.19
nginx:latest

みたいに表示されます。

Docker Registry

イメージの共有保管庫(GitHubのようなリポジトリ) です。

Dockerのワークフロー

Dockerでは、アプリケーションをリリースするまでのワークフロー
BuildShipRun3つのプロセスに分けています。

image.png

引用  https://www.undercoverlog.com/entry/2018/09/23/Dockerの基本機能(Build/Ship/Run)

  • Build
    Dockerfileをもとに、コンテナのイメージを作成します。

  • Ship
    ビルドしたコンテナのイメージを、Docker Hubなどのリポジトリに登録して共有します。

  • Run
    リポジトリからコンテナのイメージを取得して、コンテナを起動します。

dockerのAPI

Dockerのコンテナは、Docker Engineに用意されたAPIを用いてライフサイクル(作成~削除)を操作します。

image.png

引用  https://penpen-dev.com/blog/docker-command/

ローカルマシンに取得しているImage一覧

以下のコマンドで見れます。

% docker images

コンテナを実行するには、そのコンテナの元となるimageが必要見たいです。
1.Docker Hubなどの他の人が作ったイメージ取得
Docker Hubから、「Hello World」のイメージをpull(ダウンロード)します。

 docker pull hello-world

pullしたイメージを確認

% docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    〇〇           ◯ months ago   13.3kB

2.自分で作る

https://qiita.com/etaroid/items/b1024c7d200a75b992fc#2-dockerfileからのイメージ作成

imageからコンテナの起動

$ docker create --name コンテナに付ける名前 イメージ名

でイメージからコンテナを作成します。

$ docker start コンテナ名

でコンテナを起動します。

イメージをDockerHubから取得して、コンテナを作成・起動するコマンドです。

$ docker run イメージ名

docker pull :DockerHubからイメージを取得
docker create :取得したイメージからコンテナを作成
docker start :作成したコンテナを起動

を同時に実行するコマンドがdocker run コマンドです。

引用 https://qiita.com/etaroid/items/b1024c7d200a75b992fc#imageからコンテナの起動

イメージをダウンロードしてコンテナ実行

まだ一度もイメージをpullしていない状態でdocker runを実行すると、イメージをダウンロード(docker pull)してrunがまとめて実行されます。
Dockerを使用してNginxのコンテナを実行する例です。

$ docker run --name web -d -p 8080:80 nginx

⚫︎補足

  • runコマンドでnginxのイメージをダウンロード
  • —nameでコンテナに別名をつける
  • -d(detach)でバックグラウンド起動
  • -pオプションでホストOSのポート8080とコンテナ内のポート80をマッピングしてコンテナを起動

実行後に$ docker psで確認できます。

psを使ったコマンド

稼働中のコンテナの状態を検索する場合は、docker psコマンドを使います。

#現在実行中のコンテナを表示
$ docker ps

#現在存在しているコンテナ一覧を表示
$ docker ps -a

オプション指定で、STATUSやNAMEでフィルタリングもできます。

# 停止中ステータスのコンテナ
$ docker ps -f status=exited

# webという名前を持つコンテナ
$ docker ps -f name=web

⚫︎補足

  • -f status=exited: フィルタリングオプションで、docker psコマンドの結果をフィルタリングするために使使います。この特定の例では、status=exitedと指定され、停止した(exited状態の)コンテナのみを表示するようにフィルタリングされます。
  • 起動中のコンテナを表示するためには、docker psコマンドを使います。

コンテナの一時停止

$ docker pause コンテナ名

コンテナの一時停止を解除して再開

$ docker unpause コンテナ名

コンテナの再起動

$ docker restart コンテナ名

コンテナの停止

$ docker stop コンテナ名

コンテナが終了後、そのままローカルに残っています。
使わないコンテナは削除してないと容量がいっぱいになってしまいます。

起動中のコンテナのシェルへ接続

接続方法は2種類あるみたいです。webは起動中のコンテナ名です。

  • attachを使う
$ docker attach web
  • docker exec で、起動中のコンテナ上のコマンド実行
    CONTAINER ID(またはNAMES)を指定して、docker execコマンドでコンテナ上のコマンドを実行します。
    ex) nginxコンテナ上のbashをインタラクティブモードで起動
$ docker exec -it web bash

コンテナ上のlsコマンドを実行は

$ docker exec web ls -la

docker rm で停止中コンテナ削除

CONTAINER ID(またはNAMES)を指定して、docker rmコマンドで停止中のコンテナを削除します。

$ docker rm 停止中コンテナ名

⚫︎補足

  • docker ps -aコマンドなどで確認しましょう。
  • 起動中のコンテナは、docker rmでは削除できません。

コンテナ削除後も、イメージは残り続けます。

$ docker image ls

docker rmi でイメージを削除

IMAGE IDを指定して、docker rmiコマンドでイメージ(hello-world)を削除します。
docker image lsで確認した後

$ docker rmi イメージID

docker image lsで消えたか確認しましょう。
⚫︎補足
コンテナをrmで削除していないイメージは-fオプションで強制削除しないと削除できません

$ docker ps -a
$ docker image ls
$ docker rmi イメージID

docker build でイメージ作成

MySQLのイメージを作成するDockerfileを用意します。

$ touch Dockerfile

docker buildコマンドでDockerfileをもとにイメージをビルドします。
-tでタグ付けもします。

docker build -t docker-mysql:1.0.0 -f Dockerfile .

-tオプションは、新しく作成されるイメージにタグを付けるためのものです。ここではdocker-mysql:1.0.0という名前をつけました。

$ #ビルドしたイメージ確認
$ docker image ls

先ほどビルドしたdocker-mysql:1.0.0という名前のイメージを使用して、MySQLサーバーのコンテナを起動するためのコマンド。

$ docker run --name db -d -p 13306:3306 docker-mysql:1.0.0

docker execでコンテナ内のbashを起動して、mysqlコマンドを実行

$ docker exec -it db bash

docker push でイメージをリポジトリに登録

https://qiita.com/etaroid/items/b1024c7d200a75b992fc#-docker-hub-container-registry

docker commit でイメージを追加

https://qiita.com/etaroid/items/b1024c7d200a75b992fc#コンテナからイメージを作成

Dockerのネットワーク

Dockerのネットワークは、

  • コンテナとインターネット間
  • コンテナとコンテナ間
  • 複数ホストのコンテナ間

の通信が行われています。

https://qiita.com/etaroid/items/88ec3a0e2d80d7cdf87a#-dockerネットワーク

3つのネットワークモデル

Dockerをインストールすると、デフォルトでbridgehostnone
3つのネットワークが生成されます。

コンテナを作成する際には、どのネットワークを使うかを --net オプションで指定します。
オプションを指定しない場合は、デフォルトでbridgeが使われ
bridge、または、hostを使うことで、
コンテナと外部ネットワークとの通信ができます。

$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
〇〇                    bridge    bridge    local
〇〇                    host      host      local
〇〇                    none      null      local

image.png

引用 https://knowledge.sakura.ad.jp/23899/

Bridgeネットワーク

デフォルトで存在するネットワークで、作成されたコンテナがデフォルトで接続されるのが、bridge networkです。

Bridgeネットワークでは、同じネットワーク内に存在するコンテナとIPアドレス指定で通信することができます。
つまり、Network指定をせずに起動したコンテナ同士は、IPアドレス指定で通信することは可能だが、コンテナ名指定で通信することはできないです。

Hostネットワーク

ホストネットワークは、host driver を使用したデフォルトで存在するネットワークです。

接続したコンテナはdocker hostと同じネットワーク設定になります。

Noneネットワーク

noneネットワークはデフォルトで存在するネットワークで、接続されたコンテナはネットワーク・インターフェースが無くなります。
noneネットワークに接続する場合は、他のネットワークから全て切断しなくてはならない点に注意が必要です。

Dockerのネットワーク(デフォルト:bridge)を作成

$ docker network create ネットワーク名

Docker Compose(開発開発エンジニアには必須)

Docker Composeは、複数のコンテナを一元管理するためのツールです。

複数のコンテナの各種設定、コンテナ間の依存関係やネットワークなどを、
docker-compose.ymlというYAMLファイルに定義し、
イメージのビルドやコンテナの起動・停止を簡単にできます
このYAMLファイルを他者と共有すれば、誰でも同じコンテナ環境を構築できます。

image.png

引用 https://www.kagoya.jp/howto/cloud/container/dockercompose/

Docker Compose を使えば、YAMLファイルに記載するだけで3層アーキテクチャのネットワークを簡単に構築できます

image.png

version: "3"
services:
  web:
    image: alpine
    command: ping 127.0.0.1
    networks:
      - frontend
  middle:
    image: alpine
    command: ping 127.0.0.1
    networks:
      - frontend
      - backend
  db:
    image: alpine
    command: ping 127.0.0.1
    networks:
      - backend
networks:
  frontend:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.10.0/24
  backend:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.20.0/24


引用  https://knowledge.sakura.ad.jp/26522/

開発エンジニア必須コマンド(docker compose upコマンド)

docker compose upコマンドで***複数コンテナを同時に起動します。

# Docker Composeプロジェクトで定義されたサービスのイメージをビルド
$ docker compose build

# コンテナを起動
$ docker compose up -d

# 起動確認
$ docker ps

# 指定したサービスコンテナ内でコマンドを実行
$ docker-compose run コンテナ名  コマンド

# 一連のコンテナ起動
$ docker-compose start

# 一連のコンテナ停止
$ docker-compose stop

# 起動中のコンテナが停止
$ docker compose down

⚫︎補足
-dはバックグラウンドで実行するためのオプション

Play with Dockerでdockerを試す

Docker環境を構築していない方向けに、オンライン上で気軽にDockerを試せるみたいです。

Docker Hubのアカウントがあれば利用できるみたいです。

この記事を参考に作るといいみたいです。

https://zenn.dev/kmiura55/articles/docker-play-ground

参考資料

https://qiita.com/etaroid/items/b1024c7d200a75b992fc

参考資料続き

https://qiita.com/etaroid/items/88ec3a0e2d80d7cdf87a

Discussion