はじめに
docker周りの説明はぐちゃぐちゃしていて分かりにくいので、最低限の概念とインストール、動作確認だけまとめました。
用語解説
用語が色々多いので先にまとめておきます。
Docker Engine
Dockerを利用するための常駐プログラム。
Image
コンテナの設計図のようなもの。imageからコンテナが作成される
Tag
imageのバージョン
コンテナ
アプリケーションの実行環境
Docker Hub
docker版のgithub
Dockerネットワーク
コンテナ間での通信手法
Nginx(エンジンエックス)
ウェブサーバー用ソフトウェア
daemon(デーモン)
バックグラウンドで動作するプロセス
Docker Machine
仮想マシンのをコマンドで操作するためのツール
docker-ce
コミュニティエディション。無償版のdocker。
Dockerの概念
具体的なコマンドやコードの前にひとまずDockerの概念をまとめます。
dockerとは
従来の仮想化ではハイパーバイザ(仮想化ソフト)を使用してゲストOS(仮想マシン)を立ち上げ、その中でミドルウェアの構築とプログラムの実行を行っていました。
dockerはコンテナ型仮想化を行い、docker engineからコンテナと呼ばれるミドルウェアを含む実行環境を作成します。そしてコンテナ内でアプリケーションを動作することが出来るわけです。
コンテナ型仮想化ではコンテナを他人と共有することで簡単に実行環境も同様のものが準備できるわけです。要するに従来方法と違って、簡単に同じ環境を再現出来て便利だよねってことです。
Dockerでのデータ管理
コンテナ内で動的なデータを扱う場合、そのままではコンテナを落としたらデータが消えてしまいます。解決策としてホストマシンでデータを管理し、コンテナにマウントします。
Docker network
ウェブアプリケーションを作成する場合、ウェブサーバーとAPIサーバーとDBサーバーを立てるような例も少なくないと思います。当然これらのサーバーは通信しなければならないので、コンテナでこれらのサーバーを立てている場合はコンテナ間で通信する必要があります。その仕組みがDockerネットワークです。Docker networkではデフォルトで存在する3つのネットワークと独自ネットワークが存在します。
Bridge network
同じネットワーク内に存在するコンテナとIPアドレス指定で通信できるネットワークです。DNSは定義されていないので、コンテナ名での通信は出来ません。コンテナ作成時にデフォルトで接続されるネットワークです。
Host network
説明が難しいのですが、、Host networkに接続したコンテナでnginxを実行した場合、ホストマシンのIP80番ポートに接続すれば良いことになります。これに関しては手で動かして覚えた方が早いと思います
None network
ネットワークインターフェースがないことを意味します
Docker Compose
複数コンテナのDockerアプリケーションを事前定義して実行するためのツール
独自ネットワーク
独自のネットワークを作成し、コンテナ名で通信が可能になります。Docker Daemonの組み込みDNSのおかげで名前解決してくれているようです。
Docker Compose
これまで見てきたように、コンテナの起動は多くの設定が必要であり、1つ1つ実行していたら冗長です。それらを自動化するのがDocker Composeです。
ウェブアプリケーションの実行環境をDockerで構築する場合、複数のサーバーの定義をdocker-compose.yml
に記述しておくことで、複数コンテナをまとめて起動できます。
Docker Machine
Docker Engineを搭載した仮想マシンの管理をコマンドで実行できるツール。
インストール
dockerとdocker-composeのインストールを行っていきます。環境はUbuntu20.04LTSで行うので、macユーザーの方は適宜読み替えてください。また、GUIではなくCUIのインストールです。既にインストール済みの方は次の章まで飛ばしてください。
まずはdockerのインストールから行っていきます。単純にパッケージマネージャでインストールすることも可能ですが、最新版ではないのでこちらのサイト[4]を参考にやっていきたいと思います。
パッケージリストの更新
sudo apt update
sudo apt upgrade
HTTPS経由でパッケージを使用するためのパッケージをインストール
sudo apt install apt-transport-https ca-certificates curl software-properties-common
公式DockerリポジトリのGPGキーをシステムに追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
DockerリポジトリをAPTソースに追加します。
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
パッケージデータの更新
sudo apt update
dockerリポジトリからインストールしようとしていることを確認。
apt-cache policy docker-ce
インストール。
sudo apt install docker-ce
デーモンが起動し、プロセスがブート時に起動出来るようになっていることを確認。
sudo systemctl status docker
sudoなしでdockerコマンドを実行するための設定(いらない場合もある)。パスワードの入力が求められるので入力。
sudo usermod -aG docker ${USER}
su - ${USER}
id -nG
dockerのバージョンを確認。2021年11月15日現在の最新バージョンは20.20.10であり[5]、最新バージョンがインストールされていることを確認できた。
docker -v
次にdocker-composeのインストール。このサイト[7]を参考に進めていく。まずはこちらのサイト[8]で最新バージョンを確認する。そのバージョンを指定してcurlコマンドでインストール。ローカルにインストールして実行権限の付与。MACの人とかはインストールするものが違うので公式ページで適切なものをインストールしてください。
mkdir -p ~/.docker/cli-plugins/
curl -SL https://github.com/docker/compose/releases/download/v2.1.1/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
バージョンを確認して最新バージョンの確認ができればOK。2021年11月15日現在の最新バージョンは2.1.1が最新です。docker-composeの機能がdockerのCLIプラグインとしてに統合されるようで、2.0以降ははそちらを指しています。コマンド上はdocker composeに変更されているようです。おそらくM1MACへの対応も含まれているのではないでしょうか。
docker compose -v
これでdockerとdocker composeのインストールが終わりました。
動作確認
まずはdocker単体でHello,worldを行います。こちらのサイト[9]を参考にしています。hello-worldコンテナを実行してみましょう。
docker run hello-world
runコマンドはイメージを用いてコンテナを実行するコマンドです。イメージがローカルに存在しないため、自動的にDocker Hubよりイメージを取得しています。コマンドをタグ指定なしで実行した場合、タグは自動的にlatestが選択されます。
次にイメージの確認をします。
docker images
hello worldイメージが確認できるはずです。
起動中のコンテナがあるかを確認します。
docker ps -a
-aは停止中のコンテナも含めて表示します。hello-worldコンテナはメッセージ出力が終わるとコンテナを停止してしまうため、もう起動していません。
以上でdockerのhello,worldは終了です。次にdocker-composeの起動確認をやっていきます。こちらのサイト[10]を参考にしてやっていきます。
作業ディレクトリの作成と移動
mkdir hello-world && cd $_
[10]の記事執筆者KENIOSさんが作成されたdocker-compose.yml をインストールして実行。
curl -O https://keinos.github.io/hello-docker-compose/docker-compose.yml
docker compose up
特にエラーが出ずに終了すればおkです。中身はさっきのhello-worldイメージ使っているだけなのですが、起動確認が目的なのでこれで十分です。
以上でdockerとdocker composeの動作確認は終了です。
おわりに
超大雑把なdockerの概念の理解とdocker、docker-composeのインストール、動作確認は出来たはずです。あとは作りたい環境を検索して、コマンドを調べながらやれば構築出来ると思うので頑張ってください。次はlaravelのdocker環境構築をやろうと思います。
参考文献
[1]:【図解】Dockerの全体像を理解する -前編-
[2]:【図解】Dockerの全体像を理解する -中編-
[3]:【図解】Dockerの全体像を理解する -後編-
[4]:Ubuntu 20.04へのDockerのインストールおよび使用方法
[5]:Docker バージョン情報
[6]:Docker Compose release notes
[7]:Compose V2
[8]:docker-compose github releases
[9]:Docker入門 ~Hello World~
[10]:最もシンプルな docker-compose.yml の hello-world