今回は「Docker」について基礎的なところを紹介をしたいと思います!
(本記事はDockerを利用したことがない方向けの初級編です)
目次
1.Dockerとは
Docker Inc.(旧DotCloud社)によって開発された
コンテナ技術を使ったアプリケーションの実行環境を構築/運用するためのプラットフォームです
そもそもコンテナて何だ。。。。
Dockerでのコンテナとは「ホストOS上に理論的な区画を作りアプリケーションを動作させるために必要なアプリケーションやライブラリなどを1つにまとめた箱」のようなものです
従来の構成と何が違うの?
Docker以外でも従来からホストOS上に複数のアプリケーションを動作させる仕組みはありましたねそれらはどのような構成でどういった問題があったでしょうか?


Dockerでは上記のような問題が解消され、コンテナ毎にリソースを占有しているようにみせ、かつ、軽量で動作させることが可能になりました
Dockerでコンテナを作るには?
コンテナを作るには「Dockerイメージ」を利用しますDockerイメージは簡単に言うとコンテナのベースのようなものです
(作ったコンテナのスナップショットから新たにイメージを自作することもできます)
Docker Hub
Dockerイメージは公式サイトDocker Hubにて多数公開されていますこれらを利用すれば「nginx」「MySQL」などのコンテナを簡単に構築することが可能です
Dockerイメージってどんなメリットがあるの?
開発者がDockerイメージを生成するためのDockerfileを作成しそれを共有することでDockerがインストールされたサーバ(PC)ならイメージから同じ環境(コンテナ)を再現することができます
- 開発環境構築のために複数のアプリケーションをインストールして設定する必要があり時間がかかる
- 設定の仕方にバラつきがあり人によって正常に動作する人と動作しない人が出てくる
- 開発環境/テスト環境/本番環境でインフラ手動設定に差分があり開発環境では動作したがそれ以外の環境では動作しなかった

(プロジェクトに新規参画した新人のPC開発環境構築に1週間かかりました…なんてことからもおさらば!)
2.Dockerインストール for macOS
では実際にDockerをPCにインストールして使ってみましょう!
今回は以下のような環境で実施しました
MacBook Pro 13-inch, 2018(2.7 GHz クアッドコアIntel Core i7) macOS Catalina(10.15.6)手順はとても簡単
Docker Hub公式ページからインストーラ(dmg)をダウンロードしてインストールするだけです
https://hub.docker.com/editions/community/docker-ce-desktop-mac/

% docker version Client: Docker Engine - Community Azure integration 0.1.15 Version: 19.03.12 API version: 1.40 Go version: go1.13.10 Git commit: 48a66213fe Built: Mon Jun 22 15:41:33 2020 OS/Arch: darwin/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.12 API version: 1.40 (minimum version 1.12) Go version: go1.13.10 Git commit: 48a66213fe Built: Mon Jun 22 15:49:27 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: v1.2.13 GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec3683
% docker run --name test-db -e MYSQL_ROOT_PASSWORD=root -d -p 23306:3306 mysql:8
コマンドの説明 MySQL8のイメージをもとにtest-dbというコンテナを起動 DBのrootアカウントのパスワードはrootとし、23306ポートでアクセスされた場合、コンテナ内部の3306に転送 (MySQL8のイメージがローカルに無い場合はDocker Hubから自動ダウンロード)コンテナがうまく起動しているかを確認
% docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dec97162c2a5 mysql:8 "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 33060/tcp, 0.0.0.0:23306->3306/tcp test-db試しにMySQL Workbenchで接続できるかを確認

起動したコンテナを停止したい場合
% docker stop {コンテナID} -- 今回の場合、コンテナIDは「dec97162c2a5」
作ったコンテナを削除したい場合
% docker container rm {コンテナID} -- 今回の場合、コンテナIDは「dec97162c2a5」ね!とっても簡単でしょ!
コマンド一つでMySQLが構築できてしまう
(公式サイトからインストーラーをダウンロードしてきて頑張ってた頃が懐かしい。。。)
以上がDockerのインストール方法&基本的な使い方ですが
今回はもう一つ、Dockerの便利ツール「Docker Compose」を紹介したいと思います
3.Docker Composeとは
Docker Composeとは複数のコンテナで構成されるアプリケーションを定義してDockerイメージのビルドや各コンテナの起動・停止などをより簡単に行えるようにするツールのことです
(Dockerに最初から含まれているため追加のインストールや設定は不要です)
% docker-compose --version docker-compose version 1.27.2, build 18f557f9
どんな時に役に立つの?
例えばDockerで「nginx」と「MySQL」の2つのコンテナで構成されるWebアプリケーションを立ち上げたい時、それぞれコマンドを打ってコンテナを起動させるのはちょっと面倒(2つだけなら良いかもしれませんが、3つ4つコンテナが必要な場合はそれだけ手間になります)Docker Composeを利用すれば1つのコマンドで定義した全てのコンテナの起動・停止を行ってくれます!
具体的にどうやってやるの?
Docker Composeは「docker-compose.yml」という名の定義ファイルを作成し、そこに以下のような情報をyaml形式で記述することで利用することができます- Dockerイメージをビルドするための情報
(使用するDockerfile、イメージ名など) - コンテナ起動するための情報
(ホストとの共有ディレクトリ設定やポートフォワードなどの起動オプションなど) - 使用するDockerネットワーク
では今回は例として「nginx」と「MySQL」を定義してみましょう
version: '3'
services:
# DB(MySQL)
test-db:
image: mysql:8
container_name: test-db-container
restart: always
ports:
- "23306:3306"
volumes:
# データ保持
- ./db/mysql_data:/var/lib/mysql
environment:
# 環境設定
MYSQL_ROOT_PASSWORD: root
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
# nginx
nginx:
image: nginx:1.15.8
container_name: test-nginx-container
restart: always
ports:
- "80:80"
depends_on:
# 依存関係(先にtest-dbのコンテナが起動していること)
- test-db
Docker Compose実行
docker-compose.ymlファイルのあるディレクトリで以下のコマンドを実行% docker-compose up -d「nginx」と「MySQL」のコンテナが起動していることを確認
% docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 211dcae05e83 nginx:1.15.8 "nginx …" 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp test-nginx-container 377456dd7416 mysql:8 "docker…" 6 minutes ago Up 6 minutes 33060/tcp, 0.0.0.0:23306->3306/tcp test-db-container先ほどと同じようにMySQL Workbenchで接続を確認
nginxはブラウザで接続してWelcomeページが表示されればOK
http://localhost/
Docker Composeで起動したコンテナたちを停止したい場合
% docker-compose stop # docker-compose.ymlファイルのあるディレクトリで実行する必要があります
Docker Composeで作成したコンテナたちを削除したい場合
% docker-compose down # docker-compose.ymlファイルのあるディレクトリで実行する必要がありますこのようにDocker Composeを利用すれば複数のコンテナ操作を簡単に行えます
また、docker-compose.ymlを共有することで環境構築もしやすくなりますね
以上がDockerの便利ツール「Docker Compose」の紹介でした
4.最後に
近年ではDocker + Kubernetesを利用したマイクロサービスがトレンドになっていますね
本記事ではそんなマイクロサービスと親和性の高いコンテナ技術のメージャーであるDockerの基礎的な内容紹介でした
これを機にDockerに興味を持ち、仕事やプライベートでの技術&生産性向上に繋がったら嬉しく思います