一撃でわかる❗️開発エンジニアには必須❗️Dockerとは何ぞや?(かなり詳しく解説)
概要
会社でDockerの勉強会があり、その時の資料を自分専用にまとめてみました。
コンテナ、仮想化って聞くけど何?
仮想マシンみたいなもので、PC上に仮想環境を作って、それぞれPC環境が違っても
他のメンバーと同じ環境でアプリケーション開発ができます。
アプリケーションを「ひとつの箱(=コンテナ)」に詰め込んで、どこでも同じように動かせるようにする技術ですね。
Dockerとは何?
チームで開発をする上でプログラムの実行環境を共有しないとプログラムがメンバーがバラバラで違う動作になってしまい、開発どころではないです。
これを1つの環境でPCの中にみんなで共有できるPCを作れるツールができました。
アプリケーションをどこでも同じように動かせるようにしてくれる便利なツール」がDockerです。
- コンテナ仮想化のイメージです。
未経験の開発エンジニアの採用でもDocker使ったかどうかは当たり前に聞かれる
前の採用はDockerを使っていない未経験の方でも採用されるケースはあったみたいですが、
最近だとDockerを学習で使ったことあるのかは必須みたいです。
「当然使ったことあるよね?」くらいのイメージです。
Dockerを教えていないプログラミングスクールはこれから正直ヤバい
です。
開発エンジニアは知っておいて欲しい
特に駆け出しエンジニアこの記事を全部知る必要はないです。
ただここは読んでおいて欲しいとこだけお伝えします。
Docker Compose関連だけは知っておいてください❗️
Docker構築動画も興味ある人だけでいいです。
Docker構築動画
2021年版ですが、興味があれば見てみてください。
Dockerもメリット他には?
以下の3点です。
-
環境構築が簡単
PC(windowsやmac)上に、対象のアプリケーションを直接インストール。
PC上にDockerをインストールして、対象のアプリケーションをインストール。
VirtualBoxなどのVMにゲストOSを立てて、対象のアプリケーションをインストール。
といった方法があります。 -
誰でも、何回実行した場合でも、同じ環境を作ることができる
Dockerfileを共有すれば、誰でも同じ環境をすぐ作れてしまいます。
コピーして、dockerコマンドでDockerfileを読み込ませるだけでできてしまいます。
3.後片付けも簡単
いらなくなったコンテナ環境も、コマンド一つで削除できます。
自宅PC上に不要なファイルが残らないです。
コンテナ上で環境設定を間違えた場合でも、
イメージファイルだけを切り戻すだけで、ゴミを残さず簡単にロールバックが可能です。
Dockerの全体像
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では、アプリケーションをリリースするまでのワークフローを
Build
、Ship
、Run
の3つのプロセスに分けています。
引用 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一覧
以下のコマンドで見れます。
% 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.自分で作る
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 でイメージをリポジトリに登録
docker commit でイメージを追加
Dockerのネットワーク
Dockerのネットワークは、
- コンテナとインターネット間
- コンテナとコンテナ間
- 複数ホストのコンテナ間
の通信が行われています。
3つのネットワークモデル
Dockerをインストールすると、デフォルトでbridge
、host
、none
の
3つのネットワークが生成されます。
コンテナを作成する際には、どのネットワークを使うかを --net オプションで指定
します。
オプションを指定しない場合は、デフォルトでbridgeが使われ、
bridge、または、hostを使うことで、
コンテナと外部ネットワークとの通信ができます。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
〇〇 bridge bridge local
〇〇 host host local
〇〇 none null local
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ファイルを他者と共有すれば、誰でも同じコンテナ環境を構築できます。
引用 https://www.kagoya.jp/howto/cloud/container/dockercompose/
Docker Compose を使えば、YAMLファイルに記載するだけで3層アーキテクチャのネットワークを簡単に構築できます。
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
開発エンジニア必須コマンド(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のアカウントがあれば利用できるみたいです。
この記事を参考に作るといいみたいです。
参考資料
参考資料続き
Discussion