onemuri.space

Docker を学ぼう

Docker 使っていますか?

みなさんが開発に Docker を導入していますか?

最近の開発環境において、Docker を導入していていないところは時代遅れと言っても過言ではないレベルで浸透してきたツールですね。

というようなことを書くと煽ってるみたいですが、かくゆう私もつい一年前までは Docker 何それ?おいしいの?という状態でした。

ネット上やで Docker の解説をしている記事をよく見かけますが、正直プログラミング始めたばかりの方や Docker 勉強してみるか。という時に Docker 力を身に着けるほどの記事に会えなかったので、今回は Docker を学ぶために、DB を作ったり消したりできる感覚を掴んでみましょう

また、雛形を用意しておくのでよく分からなくてもコマンドを実行するだけで記事の中身を達成できるようにします。

Docker を使う前準備

本記事では mac の場合の方法を取り扱います。(Docker は OS 関係なく挙動するので、mac 以外の方は 「docker 導入」とかで検索してみるといいかなと思います。)

brew install docker

また、公式から Docker のデスクトップツールをダウンロードしてください。

Docker のアカウントを持ってない人はこのタイミングで作成して、上記でダウンロードしたツールにログインしておいてください。

ここまでの手順を踏めば、以下の docker というコマンドにパスが通ってる状態になっていると思います。もし、通ってない場合はターミナルの再起動か、他の方の記事を読んでみるのが良いかもです。

docker

Docker の雛形用意してます

私のリポジトリにサンプルの物を用意しましたので、README に従って Docker を体験してみましょう。

一応簡単に手順を書きますので、読み飛ばしても大丈夫な人は読み飛ばしてください。

まずはどこでも良いのでローカルの PC 上に上記のサンプルを clone してください。(git の説明は省きますね)

git pull https://github.com/mergitto/docker-index-sample
cd docker-index-sample

以下のコマンドで docker を起動できます(初回だけ image を引っ張ってくるので時間が少しかかります)

docker-compose up
  • 起動後以下のコマンドで mysql にアクセスしてみてください
  • password が聞かれると思うので、docker-compose.yamlMYSQL_ROOT_PASSWORDに設定したパスワードを入力してください
mysql -u root -p --host 127.0.0.1 -P 4306 < initial.sql

以上のコマンドで新しいデータベースと users テーブルが作られます

Docker を使ってみるというのはこの時点でもう入門できています!

どんなことが起こっているのかを説明して、さらに理解していきましょう!とその前に今回のサンプルで使った docker-compose.yaml について簡単に理解しておきましょう。

docker-compose.yaml の説明

今回のサンプルでは以下のような yaml ファイルの中身でしたね。

version: '2'
services:
  db:
    image: mysql:5.7
    container_name: db
    volumes:
      - './.data/db:/var/lib/mysql'
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports:
      - '4306:3306'

version は yaml ファイルの記述方法のバージョンを指定しているだけです。今は気にせず大丈夫です。

今回大事な部分は以下のオプションです

image: mysql:5.7
volumes:
  - './.data/db:/var/lib/mysql'
environment:
  - MYSQL_ROOT_PASSWORD: root
ports:
  - '4306:3306'
  • image … Docker で前もってビルドされて用意されている環境です

  • volumes … データの永続化のために、ローカル PC 上のデータと Docker で立ち上げた環境のデータを mount しています

    • ローカル PC 上に.dataというディレクトリができていると思うので確認してみてください
  • environment … 設定した image に合わせて環境変数を設定します

    • 今回の場合は root ユーザのパスワードに root を設定しています
  • ports … Docker 上で起動している DB とつなぐためにポートフォワーディングしています。端的にいうと、Docker 上の玄関とローカル PC の玄関を指定して、その玄関でのみ繋がるようなイメージです

    • 今回の場合はローカル PC 上では 4306, Docker 上では 3306 につながっています
    • ちなみに、mysql では 3306 がデフォルトのポートとして使われています
    • postgres では 5432 がデフォルトのポートとして使われます

これが今回の docker-compose.yaml の最低限の説明という感じです

docker-compose の動作

docker-compose の動作はとてもシンプルです

  1. docker-compose で指定している image をローカル PC 上に pull してくる(無ければ)
  2. docker-compose で設定しているオプションをもとに image を立ち上げる
  3. 立ち上げた image は mac 上のプロセスに起動される

正直、それぐらいしか自分もわかっていないですが、これぐらいの理解で十分だと思います。好きな人が奥深くまで実装を理解すれば良いと思います

pull した image を確認してみましょう

まずは、先述した通りに docker を起動していたら、起動中のプロセスを確認することができます

docker ps

上記のコマンドで起動中のコンテナを確認できます

ONTAINER ID   IMAGE   COMMAND   CREATED   STATUS   PORTS   NAMES
911725f61aa1 mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 2 hours 33060/tcp, 0.0.0.0:4306->3306/tcp   db

docker-compose で指定した port や、使われている image を確認することができます

pull した image も確認してみましょう

docker images

以下のような表示がなされると思います

pull した image の実体は Docker Hub に登録されています

REPOSITORY   TAG   IMAGE ID       CREATED        SIZE
mysql        5.7   383867b75fd2   5 months ago   373MB

image はどの OS で起動しても変わらない環境を提供できるので、Docker が環境構築のデファクトになりつつあるのです

まとめ

Docker いかがだったでしょうか

とりあえず起動してみると、そんなにむずかしくないことが分かったのではないでしょうか。いや、まだよくわからん。という人もいるかもしれません。

Docker はいくら起動しようが停止しようが、image を削除しても環境には全く影響がないので気軽にコマンド打ってなれていってみてください。

自己紹介用画像

Riki Akagi

2019年からDeNAで働いています。GCP(CloudSQL・GAE・Cloud Function etc)とGoでAPI開発に勤んでいます。睡眠やエンジニアリングに関することに興味を持って過ごしているのでその情報を皆さんに共有していけたらなと思っています。

自己紹介の詳細