- Dockerが必要な理由
- これまでの仮想環境とDocker
- コンテナとは
- 仮想マシンとDockerの違い
- Dockerの最大のメリット
- DockerfileとDockerイメージとDockerコンテナの関係性
- Dockerイメージの構造
- Dockerイメージのタグについて
- Dockerでアプリケーション環境を作る方法
- Dockerをインストールする
- Docker hubに登録
- Docker hubログイン
- コンテナを1つ起動するコマンド
- 起動中のコンテナ一覧表示
- 停止中のコンテナ一覧表示
- コンテナを起動・停止・再起動
- コンテナの中に入って操作する
- 停止中のコンテナを削除するコマンド
- Dockerにあるimageを全て表示
- Dockerfileからイメージを生成
Dockerが必要な理由
- 環境構築の時間削減
- アプリ実行環境の品質UP
- 自動化ソフトとの相性
環境構築の時間削減
Dockerでは設計図を作っておいてdocker compose upコマンドを実行するだけで、少し待っていれば環境ができてしまいます。
これまでは、WEBサーバーをインストールして、プログラミング言語をインストールして、データベースをインストールして、初期設定を行って、それ用のユーザーを作ってみたいな作業が必要でした。
アプリ実行環境の品質UP
開発している言語やWEBサーバーのバージョンと本番環境のバージョンは微妙に違ってきます。Dockerはその差異を吸収してくれますので、実行環境依存のエラーがなくなります。
自動化ソフトとの相性
本番環境に自動でdeployする仕組みなど、手動でやると面倒な作業を簡単に行えます。
これまでの仮想環境とDocker
これまでの仮想環境構築では、一つ一つの構築作業が人の手が介在するので所々でミスが生じやすかったのですが、Dockerの場合は最初の設計図さえ間違えなければ、あとは自動で組み立つのでミスが少ないです。
またミスの発見も設計図を見にいけば済むので、どこが間違っているか分かり易いです。
コンテナとは
隔離され、パッケージ化された箱のことを言います。
サーバー上に隔離されたアプリ空間を作れる技術のことです。
Dockerはコンテナを構築したり、壊したり、動かしたりする管理ツールを指します。
コンテナのイメージは以下になります。

仮想マシンとDockerの違い

上のような違いがありますが、注目する項目としてDockerではインフラの設定がDockerfileで管理できる点です。従来はシステムがどのような状態になっているか一覧で見ることができませんでしたが、Dockerfileで見える化ができます。そしてDockerはメモリ上で動くので軽いです。
Dockerの最大のメリット
Dockerの最大のメリットは、インフラのコード化です。
ファイルの記述を読むと構成がわかります。
誰でも同じコンテナを作ることができます。
他の人に環境を受け渡すのが便利になります。
上記の点がDockerの最大のメリットになります。
手動で作っていたサーバーを全部定義化、コード化することができます。
上記が設計図となり、この設計図からは必ず同じコンテナができます。
なので、みんなで同じ設計図を使えば誰の環境でも同じサーバーを作ることができ環境依存のエラーなどがなくなります。
しかもこの設計図はテキストファイルなのでめちゃくちゃ軽量で受け渡しも簡単です。
これが最大のメリットです。これを英語で表現すると「infrastructure As a Code」(インフラストラクチャーアズアコード)と言います。
エンジニアとインフラエンジニアの境目がなくなってきているのもこうしたインフラのコード化が貢献しているといえます。
DockerfileとDockerイメージとDockerコンテナの関係性
Dockerコンテナというものは、プログラム言語、WEBサーバー、データベースのように、一つのプロセスを入れる箱のようなものでした。
その設計図がDockerイメージで、
さらにその設計図を言語化(ファイル化)したものがDockerfileとなります。
図に示すと以下のようになります。

DockerfileからDockerイメージに行く時を「build」と言います。
この「build」を行うことによって、サーバーのインストールコマンドや設定ファイルの変更などの命令が実行されます。
実行されると、Dockerイメージとしてイメージレイヤーが一層一層作られます。
そして、docker runコマンドを叩くとDockerコンテナができます。
Dockerイメージの構造

ドッカーイメージの一番下のレイヤーには、まっさらなLinuxOS(CentOSやUbuntu)のイメージが入っています。
その上に、インストールコマンドなどを乗せいていくイメージレイヤーがあり、それらがまとまってDockerイメージということになります。
Dockerイメージのタグについて

Dockerイメージを作る時はタグを必ず指定しなければいけません。
なぜかというと、未指定だと最新バージョンがインストールされてしまうからです。
最新だからいいじゃないかと思うかもしれませんが、環境構築を例えば2022年にした人の最新バージョンと、2023年にした人の最新バージョンとでは必ず差異が出ます。
この差異が出ると、みんなが全く同じ環境を構築できなくなってしまいます。
なので、バージョンを指定するためにタグを指定しないといけません。
Dockerでアプリケーション環境を作る方法

DockerComposeを使うことによって、複数のコンテナを同時に管理連携できるようになります。
コンテナは隔離されたアプリケーション空間なので本来お互いに通信することはできないのですがLinkオプションを使用することによって互いに通信することができるようになります。
Dockerを用いて開発環境を構築するにはDockerComposeがなければ成り立たないということになりますのでひきつづきの解説の中で説明します。
Dockerをインストールする
以下のページを参考にDockerをMacにインストールしてください。
Docker hubに登録
以下のページを参考にDocker hubに新規登録します。
Docker hubログイン
以下のコマンドでDocker hubにログインします。
docker login
UsernameとPasswordを聞かれますので
先ほどDocker hubに登録したものを使ってログインします。
コンテナを1つ起動するコマンド
以下コマンドで試しにコンテナを1つ起動してみましょう。
Dockerイメージがローカルになくても自動的にDocker hubから取得されます。
まずは最も基本的なコンテナを起動します。
docker run hello-world
上記のコマンドで、hello-wordコンテナが起動します。
起動中のコンテナ一覧表示
docker ps
停止中のコンテナ一覧表示
docker ps -a
コンテナを起動・停止・再起動
起動・停止・再起動の様子がわかりやすいように例として「centos」のコンテナを起動させます。
今回はnameオプションも使ってコンテナに「mycentos」と名前を付けつつ起動させます。
docker run -it --name mycentos centos:8 /bin/bash
bashを使って -itオプション(立ち上げたコンテナの中に入っていくオプション)でcentos:8を操作しますよと言った意味のコマンドです。
上記を実行したら一旦
exit
でコンテナの中から抜けます。
起動コマンド
docker start mycentos
停止コマンド
docker stop mycentos
再起動コマンド
docker restart mycentos
コンテナの中に入って操作する
今回は例としてcentos:8のコンテナを用意しました。このコンテナを起動した状態で以下のコマンドを叩いてコンテナの中に入ります。
docker exec -it mycentos /bin/bash
例えばcentos:8のバージョンを見てみます。
cat /etc/redhat-release
【結果】
CentOS Linux release 8.4.2105
上記のように結果が返ってきます。
コンテナに入らずともコンテナ内を操作できるコマンド
docker exec mycentos cat /etc/redhat-release
【結果】
CentOS Linux release 8.4.2105
停止中のコンテナを削除するコマンド
docker rm fefd2c5d98a6
上記を実行すると、指定したCONTAINER IDのコンテナが削除されます。
起動中のコンテナを削除するコマンドもあります
docker rm -f mycentos
-fオプションをつけることで起動中のコンテナを削除することができます。
しかし、時より削除できないことがあります。理由は様々あるので断定できませんが
できるだけ、コンテナを停止してから削除するようにしましょう。
Dockerにあるimageを全て表示
docker images
Docker imageは容量が大きいです。なので定期的な確認をしておいて、もしいらないimageがあったら削除するなどの対策が必要です。
まずは表示コマンドの紹介でした。
imageを削除するコマンド
docker rmi 5d0da3dc9764
注意なのですが、起動中のコンテナのイメージは削除できません。
また、コンテナを削除してからでないとimageは削除することはできません。
Dockerfileからイメージを生成
docker build [Dockerfileパス]