Docker

Docker 環境構築

Docker

Dockerが必要な理由

  • 環境構築の時間削減
  • アプリ実行環境の品質UP
  • 自動化ソフトとの相性

環境構築の時間削減

Dockerでは設計図を作っておいてdocker compose upコマンドを実行するだけで、少し待っていれば環境ができてしまいます。

これまでは、WEBサーバーをインストールして、プログラミング言語をインストールして、データベースをインストールして、初期設定を行って、それ用のユーザーを作ってみたいな作業が必要でした。

アプリ実行環境の品質UP

開発している言語やWEBサーバーのバージョンと本番環境のバージョンは微妙に違ってきます。Dockerはその差異を吸収してくれますので、実行環境依存のエラーがなくなります。

自動化ソフトとの相性

本番環境に自動でdeployする仕組みなど、手動でやると面倒な作業を簡単に行えます。

これまでの仮想環境とDocker

これまでの仮想環境構築では、一つ一つの構築作業が人の手が介在するので所々でミスが生じやすかったのですが、Dockerの場合は最初の設計図さえ間違えなければ、あとは自動で組み立つのでミスが少ないです。

またミスの発見も設計図を見にいけば済むので、どこが間違っているか分かり易いです。

コンテナとは

隔離され、パッケージ化された箱のことを言います。

サーバー上に隔離されたアプリ空間を作れる技術のことです。

Dockerはコンテナを構築したり、壊したり、動かしたりする管理ツールを指します。

コンテナのイメージは以下になります。

コンテナイメージ

仮想マシンとDockerの違い

Dockerと仮想環境の違い

上のような違いがありますが、注目する項目としてDockerではインフラの設定がDockerfileで管理できる点です。従来はシステムがどのような状態になっているか一覧で見ることができませんでしたが、Dockerfileで見える化ができます。そしてDockerはメモリ上で動くので軽いです。

Dockerの最大のメリット

Dockerの最大のメリットは、インフラのコード化です。

ファイルの記述を読むと構成がわかります。

誰でも同じコンテナを作ることができます。

他の人に環境を受け渡すのが便利になります。

上記の点がDockerの最大のメリットになります。

手動で作っていたサーバーを全部定義化、コード化することができます。

上記が設計図となり、この設計図からは必ず同じコンテナができます。

なので、みんなで同じ設計図を使えば誰の環境でも同じサーバーを作ることができ環境依存のエラーなどがなくなります。

しかもこの設計図はテキストファイルなのでめちゃくちゃ軽量で受け渡しも簡単です。

これが最大のメリットです。これを英語で表現すると「infrastructure As a Code」(インフラストラクチャーアズアコード)と言います。

エンジニアとインフラエンジニアの境目がなくなってきているのもこうしたインフラのコード化が貢献しているといえます。

DockerfileとDockerイメージとDockerコンテナの関係性

Dockerコンテナというものは、プログラム言語、WEBサーバー、データベースのように、一つのプロセスを入れる箱のようなものでした。

その設計図がDockerイメージで、

さらにその設計図を言語化(ファイル化)したものがDockerfileとなります。

図に示すと以下のようになります。

Dockerfile・Dockerイメージ・Dockerコンテナの関係性

DockerfileからDockerイメージに行く時を「build」と言います。

この「build」を行うことによって、サーバーのインストールコマンドや設定ファイルの変更などの命令が実行されます。

実行されると、Dockerイメージとしてイメージレイヤーが一層一層作られます。

そして、docker runコマンドを叩くとDockerコンテナができます。

Dockerイメージの構造

Dockerイメージの構造と仕組み

ドッカーイメージの一番下のレイヤーには、まっさらなLinuxOS(CentOSやUbuntu)のイメージが入っています。

その上に、インストールコマンドなどを乗せいていくイメージレイヤーがあり、それらがまとまってDockerイメージということになります。

Dockerイメージのタグについて

Dockerイメージのタグについて

Dockerイメージを作る時はタグを必ず指定しなければいけません。

なぜかというと、未指定だと最新バージョンがインストールされてしまうからです。

最新だからいいじゃないかと思うかもしれませんが、環境構築を例えば2022年にした人の最新バージョンと、2023年にした人の最新バージョンとでは必ず差異が出ます。

この差異が出ると、みんなが全く同じ環境を構築できなくなってしまいます。

なので、バージョンを指定するためにタグを指定しないといけません。

Dockerでアプリケーション環境を作る方法

複数コンテナ管理と連携

DockerComposeを使うことによって、複数のコンテナを同時に管理連携できるようになります。

コンテナは隔離されたアプリケーション空間なので本来お互いに通信することはできないのですがLinkオプションを使用することによって互いに通信することができるようになります。

Dockerを用いて開発環境を構築するにはDockerComposeがなければ成り立たないということになりますのでひきつづきの解説の中で説明します。

Dockerをインストールする

以下のページを参考にDockerをMacにインストールしてください。

インストール方法

Docker hubに登録

以下のページを参考に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パス]