Docker-Logo

Dockerを使ってみよう!

はじめまして!エンジニアリングソリューション事業部のSです!
今回は「Docker」について基礎的なところを紹介をしたいと思います!
(本記事はDockerを利用したことがない方向けの初級編です)

目次

1.Dockerとは


Docker Inc.(旧DotCloud社)によって開発された
コンテナ技術を使ったアプリケーションの実行環境を構築/運用するためのプラットフォームです

そもそもコンテナて何だ。。。。

Dockerでのコンテナとは「ホストOS上に理論的な区画を作りアプリケーションを動作させるために必要なアプリケーションやライブラリなどを1つにまとめた箱」のようなものです
docker container image
あたかも1つのサーバが立ち上がってるかのように利用することができる

従来の構成と何が違うの?

Docker以外でも従来からホストOS上に複数のアプリケーションを動作させる仕組みはありましたね
それらはどのような構成でどういった問題があったでしょうか?
conventional host on app 1
ホストOS上に複数のアプリケーションを同時に立ち上げる仕組み
これをすると別々のアプリケーションが「同じリソース」「同じIPアドレス」を利用するため制御が難しく、またミドルウェアやライブラリのバージョンを変更する際に互いに影響を受けないように注意する必要がありました
conventional host on app 2
ホストOS上の仮想化ソフトに複数ゲストOSを入れアプリケーションを立ち上げる仕組み
これをするとゲストOSがアプリケーションごとに必要になるためオーバーヘッドが大きく、「遅い」「重い」といった問題が発生していました

Dockerでは上記のような問題が解消され、コンテナ毎にリソースを占有しているようにみせ、かつ、軽量で動作させることが可能になりました

Dockerでコンテナを作るには?

コンテナを作るには「Dockerイメージ」を利用します
Dockerイメージは簡単に言うとコンテナのベースのようなものです
(作ったコンテナのスナップショットから新たにイメージを自作することもできます)

Docker Hub

Dockerイメージは公式サイトDocker Hubにて多数公開されています
これらを利用すれば「nginx」「MySQL」などのコンテナを簡単に構築することが可能です

Dockerイメージってどんなメリットがあるの?

開発者がDockerイメージを生成するためのDockerfileを作成しそれを共有することでDockerがインストールされたサーバ(PC)ならイメージから同じ環境(コンテナ)を再現することができます
docker images
GitでDockerfileを共有した際のイメージ
皆さんはこんな経験をしたことはないでしょうか?
  • 開発環境構築のために複数のアプリケーションをインストールして設定する必要があり時間がかかる
  • 設定の仕方にバラつきがあり人によって正常に動作する人と動作しない人が出てくる
  • 開発環境/テスト環境/本番環境でインフラ手動設定に差分があり開発環境では動作したがそれ以外の環境では動作しなかった
develop env problem
環境あるある問題
Dockerイメージを利用すれば上記のような問題も解決!
(プロジェクトに新規参画した新人の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 download
Dockerが無事インストールできているか確認
% 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
上記のようにバージョンが表示されればOK! 試しにMySQLのコンテナをDockerに構築してみましょう

% 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で接続できるかを確認
mysql workbench
無事MySQLコンテナが起動して接続できることも確認しました!

起動したコンテナを停止したい場合


% 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に興味を持ち、仕事やプライベートでの技術&生産性向上に繋がったら嬉しく思います

投稿者: エムシバ君