AMBLの日々

Dockerを使ってみよう!


この記事は、Dockerに触れたことがないが興味がある、仕組みについてざっくり知りたいと方向けの記事です。



はじめまして。エンジニアリングソリューション事業部の「せきしん」です。
今回は「Docker」について基礎的なところを紹介をしたいと思います!

目次

  1. Dockerとは
  2. Dockerインストール for macOS
  3. Docker Composeとは
  4. 最後に

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

お問い合わせはこちら!

COLORS by m/f は、AIを武器に企業のDX推進をサポートする
株式会社エム・フィールドとグループ会社の情報満載のオウンドメディアです。

挑戦者求む!
エム・フィールドグループでは、新卒・中途採用を積極的に行なっています。
Webアプリケーションエンジニア、Python開発プロジェクトリーダー、
クラウドエンジニア、セールスエンジニア、営業ルートセールス、
ネットワークエンジニア、PM/PL候補システムエンジニアを募集しております。
https://www.ambl.co.jp/recruit/

新卒採用情報はこちら!
https://job.mynavi.jp/22/pc/search/corp200590/outline.html

D X、A I、クラウドに関する企業研修、新卒研修を提供しています。
未経験からIT業界へ。働きながらキャリアチェンジができる。
次世代I T人材を未経験から育てるトレーニングセンターを開講しています。
ただいま「5日間お試し授業」実施中。
https://www.ambl.co.jp/recruit/trainingcenter/trial/