🦁

大人の学びなおしDocker(1)

2024/12/07に公開

初めに

最近久しぶりにDockerを触りまして、コマンド含めて忘れかけていたので備忘&学びなおしのために記事を書いていこうと思います。

Dockerとは

Dockerはアプリケーションの開発・デリバリ・リリースをするためのプラットフォームです。コンテナ化というと聞いたことがあると思いますが、コンテナというのはソースコードとパッケージ関連などの諸々を十把一絡げにした箱のようなものです。
これらの技術を使うことで、

  • 開発環境の立ち上げが簡単
  • 開発・テスト・リリース環境にほぼ同じコンテナを使いまわせる
  • ローカル環境の汚染が防げる
  • クラウドサービス間での移行が簡単

などなど沢山のメリットがあります。VMよりも軽量で、ビルド・実行速度が比較的速いのも利点です。

参照:
https://docs.docker.com/get-started/docker-overview/
https://www.docker.com/resources/what-container/
https://jpn.nec.com/cloud/service/container/about.html

Dockerを使うにはまずダウンロード

ダウンロードは以下の公式サイトから行ってください。なお、Docker Desktopは有償化していますが、従業員数や年間収益などによっては無料で利用できます。個人で利用する場合は無料です(2024年12月時点)。

https://www.docker.com/ja-jp/products/docker-desktop/

MySQLのコンテナを立ててみる

コンテナを立てるためにはコンテナイメージが必要です。コンテナイメージとはコンテナを実行するのに必要なバイナリやライブラリが入ったパッケージです。このコンテナイメージをビルドすることで、コンテナが実行可能になります。

Docker Hubからイメージを取得する

Dockerhubからはいろいろなイメージを取得できます。Ubuntuが即実行できるイメージやMySQL・Postgreslなどがすぐ使えるイメージ、Pythonの設定がされていてすぐに利用できるイメージなどなど。。。
Docker Official Imageでフィルターし、信頼できるMySQLのイメージを検索しましょう。なお、ここからプルしなくても問題ありませんが、どんなイメージがあるか探すためも使えるのでブックマーク必須です。

mysqlのページに行くとイメージをプルするコマンドが表示されているので、コピーしておきます。そらで覚えている人はそのままターミナルに打ち込んでOKです。

なお、コンテナイメージのバージョンを指定しない場合は自動で最新のバージョンがプルされます。バージョン情報はTagsのページで確認できます。各バージョンごとに「どれだけ脆弱性が見つかっているか?」などの情報も確認できるので、コンテナイメージを選ぶ際など参考にしてください。

https://hub.docker.com/

プルとは

前述したプルはdocker pullコマンドで実施できます。docker pullコマンドを使うと自分のマシンにコンテナイメージをダウンロードできます。MySQLの場合は以下のようなコマンドです。今回はバージョン9を指定しています。

$docker pull mysql:9

一応latestのタグもありますが、最新のバージョンが出ると環境ごとに使っているMySQLバージョンに差が出てしまう可能性があるのでバージョンを9で指定しておきます。

Docker Composeを使おう

docker composeは複数のコンテナを利用するときに使える便利なツールです。フロントエンド用とバックエンド用、それからDB用と考えると最低でも3つのコンテナが必要になってきます。さらにマイクロサービスとなってくるとバックエンドのコンテナが5つあったり・・・となり、すべてのコンテナに対していちいち起動や停止をかけるのはとても面倒です(私はやりたくない)。

その悩みを解消してくれるのがdocker composeで、コンテナ間の通信に使うネットワークを自動作成してくれたりもします。以下のサイトからダウンロード可能です。

Dockerのことをきちんと理解するのであればまずはdocker composeを使わずにやるのが正攻法だと思いますが、今回は省きます。機会があればDockerのライフサイクルについても書きたいと思います。

https://docs.docker.com/compose/install/

参照:https://spacelift.io/blog/docker-compose

コンテナのビルド

イメージがダウンロードできたら、早速コンテナを立ち上げます。Docker Hubのページ にdocker-compose.ymlのサンプルがあるので、コピペして使います。

# Use root/example as user/password credentials
version: '3.1'

services:
  db:
    image: mysql:9
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    # (this is just an example, not intended to be a production configuration)
 test:
    image: hogehoge

dbと書いてある部分がサービスです。サービスは複数登録することができます。わかりやすさのため、架空のサービスtestを定義しています。
これだけだとDBに接続するのに必要な設定(ポートなど)がされていないので、設定を追加していきます。

version: '3.1'

services:
  db:
    image: mysql:9
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    ports:
      - 3000:3000
    volumes:
      - todo-mysql-data:/var/lib/mysql
volumes:
  todo-mysql-data:

portsは公開用のポート設定で、ホスト側:コンテナ側となっています。今回は同じ設定にしていますが、ホストとコンテナでポート番号を別のものに指定することもできます。
また、一番下に定義されているvolumesはサービスではなくボリューム設定です。詳細は省きますが、このボリューム設定をしておくことでコンテナを停止した後もDBの中身を保存できるようになり、コンテナ起動のたびにデータが消える!という悲しい事件を防げます。
ボリュームについては別途記事を書きたいと思っています。

なお、分かりやすさの為に追加していたtestサービスは消しておかないとエラーになります。実行時には削除してください。

参照:
https://docs.docker.jp/get-started/08_using_compose.html?highlight=mysql

実行

$docker compose up

yamlファイルを置いたディレクトリで上記のコマンドを打つと、イメージのダウンロード→ビルド→実行まで自動でやってくれます。-dオプションを付けるとバックグランドで実行できます。実行時のステップ数やビルドエラーなどを即座に見たいので、私は-d無しで動かしていることが多いです(少数派なんですかね・・・?)。

コンテナが立ち上がった時の様子↓

MySQLに接続できるか試したいので、以下のコマンドでdbコンテナの中に入ってみます。

$docker compose exec db bash

ターミナルの表記がbashに変わればコンテナの内部に入れています。あとはmysqlコマンドをたたいて、mysqlの中を確認してください。

コンテナが動いているかの確認

わざわざ中に入らなくても、docker compose psコマンドでコンテナの稼働状況を確認することができます。DBの中を見に行くわけでなければ、このコマンドで十分です。

コンテナを止める

複数のコンテナをずっと動かしているとPCが重くなるケースもあるので、使わないコンテナは止めましょう。

$docker compose stop

上記コマンドではyamlに定義されたサービスがすべて停止されます。-dでバックグラウンド実行していない場合、Ctrl+CもしくはCommand+Cで停止できます。コンテナが停止されるだけで、削除されることはありません。一度作ったコンテナを削除したい場合は、次のコマンドを使ってください。

$docker compose down

この時、コンテナとネットワークは削除されますがボリュームなどは削除されません。もしボリュームも削除したい場合は、-vオプションを付けてください。ただし、DBの中身も一緒に削除されるので注意してください。

参照:
https://docs.docker.jp/v1.12/compose/reference/down.html

最後に

久しぶりにDockerの基礎を振り返り(ほとんどdocker composeですが)とても良い復習になりました。また別の機会に、Dockerのより深い仕様について調査&まとめたいと思います。

コラボスタイル Developers

Discussion