未来は僕以外の手の中

SI屋がIT技術やビジネスのことなどを気ままに書き綴ってみるなど

M1 Macで始めるDocker公式チュートリアル

コンテナ技術活用は当たり前となっており、現場でもAWS ECS/Fargateを商用稼働させ日々運用している。チームとしてはコンテナは使えていると言っていい。

一方で自分自身は上流工程やチームビルディング等をメインとして行なっており、がっつり手を動かしてこなかったためにコンテナの理解が不十分だという焦りがある。
「ぜんぜんわからない。俺だけ雰囲気でコンテナをやっている」状態から脱却するために、基礎から学んでいきたいと思う。

学習方針

書籍でがっつりインプットするより、まずは実際に手を動かしてみて分からない所は調べまくる。
そうしているうちに徐々に体系立てて理解が深まってくるというのが今までの経験則。

コンテナ学習記事を調べる中でちょうど「初めての技術要素を学ぶ流れ」を言語化してくれている記事もあったので引用。

ステップ1:実際に技術に触れる
● とりくみやすそうな目標を決め、それに適したgithub上のサンプルや公式のチュートリアルを行う
● 「理解は後からついてくる」という心構えで、深い理解をしていなくてもあまり気にしない。意外と作業しているうちに理解してくることもある
ステップ2:資料で頭を整理する
● ステップ1の中で不明な点は、Qiitaの記事等で調べる
● より深い理解をするために書籍やSlideShareの資料を読む
ステップ3:自分でイチからつくる
● ステップ1、2の知識を使って自分で設計する
● 自分の理解度を測ることができ、復習にもなる

新人がコンテナを理解した学習方法 - Qiita

Docker公式チュートリアルのススメ

まずはDockerをきちんと理解しておかねばならない。コンテナオーケストレーションはその後で。
巷にはコンテナ学習向けの記事が色々溢れてはいたが、Dockerの公式チュートリアルが体系的に学べそうであったので利用することにした。

Docker公式チュートリアル(英語)
Orientation and setup | Docker Documentation

公式チュートリアルは英語だが、日本語翻訳プロジェクトがいくつか動いている模様。
その中でも公式と同じUIのまま翻訳されており見やすかった下記を利用することにした(一部未翻訳もあり)

matsuand.github.io

学べること

10部構成になっており、サンプルアプリを用いながら

  • Docker Desktop
  • 各種Docker基本コマンド
  • データ保存方法(名前付きボリューム、バインドマウント)
  • Docker Compose利用

などを網羅的に学べるので、とっかかりとしてわかりやすい。さすが公式。

チュートリアルでの詰まりポイントメモ

実行環境などの影響で一部チュートリアルの記述通りにやるとエラーになる箇所があったので、解決方法をメモしておく。

実行環境

MacBook Air (M1, 2020)
Docker Desktop for Mac (Version 3.5.1.7)

「第6部: バインドマウントの利用」でのdocker run時find Pythonエラー

バインドマウントしてコンテナ起動するために下記を実行すると、、、

docker run -dp 3000:3000 \
    -w /app -v "$(pwd):/app" \
    node:12-alpine \
    sh -c "yarn install && yarn run dev"

下記のような「pythonが見つからない」エラー(一部抜粋)が発生する。

gyp ERR! find Python **********************************************************
gyp ERR! find Python You need to install the latest version of Python.
gyp ERR! find Python Node-gyp should be able to find and use Python. If not,
gyp ERR! find Python you can try one of the following options:
gyp ERR! find Python - Use the switch --python="/path/to/pythonexecutable"
gyp ERR! find Python   (accepted by both node-gyp and npm)
gyp ERR! find Python - Set the environment variable PYTHON
gyp ERR! find Python - Set the npm configuration variable python:
gyp ERR! find Python   npm config set python "/path/to/pythonexecutable"
gyp ERR! find Python For more information consult the documentation at:
gyp ERR! find Python https://github.com/nodejs/node-gyp#installation
gyp ERR! find Python **********************************************************

これについてはすでに先人が同じ問題にあたり、解決方法も記録してくれている。
Dockerのtutorialが動かなかった話 - Qiita

yarn前に「apk add --no-cache python make g++」を実行しておくことで解消する。

docker run -dp 3000:3000 \
    -w /app -v "$(pwd):/app" \
    node:12-alpine \
    sh -c "apk add --no-cache python make g++ && yarn install && yarn run dev"

なお、上記の記事の方は第2章でも同様のエラーが発生したとのこと。しかし2021年7月現在、公式チュートリアル側を見ると第2章のDockerfileは正しいものになっている。
どうせなら6章のコマンドもセットで修正しておいて欲しかった。。

f:id:billest:20210704213022p:plain

「第7部: マルチコンテナアプリケーション」M1 MacでのDocker MySQL起動エラー

チュートリアルに従いMySQLコンテナを起動しようとすると、、、

docker run -d \
      --network todo-app --network-alias mysql \
      -v todo-mysql-data:/var/lib/mysql \
      -e MYSQL_ROOT_PASSWORD=secret \
      -e MYSQL_DATABASE=todos \
      mysql:5.7

下記のようなエラーに遭遇する。

Unable to find image 'mysql:5.7' locally
5.7: Pulling from library/mysql
docker: no matching manifest for linux/arm64/v8 in the manifest list entries.
See 'docker run --help'.

これもすでに先人の記事に解決策の情報あり。
M1Mac環境でDockerのMySQLを動かす - Qiita
M1 MacでDockerのMySQLコンテナが立ち上がらない問題の解消法 | 鉄駆ブログ

M1 Macのプラットフォームはarm64。一方でMySQLイメージのサポートプラットフォームがamd64なことに起因。
ということで、以下のように明示的にplatformをlinux/x86_64と指定することで無事にMySQLコンテナ起動。

docker run -d \
      --platform linux/x86_64 \
      --network todo-app --network-alias mysql \
      -v todo-mysql-data:/var/lib/mysql \
      -e MYSQL_ROOT_PASSWORD=secret \
      -e MYSQL_DATABASE=todos \
      mysql:5.7

ちなみにDocker Desktopのコンテナ一覧では警告アイコンが出る。
「Image may have poor performance, or fail, if run via emulation」
f:id:billest:20210704214840p:plain

最後に

公式チュートリアルということで初歩中の初歩だが、やはり実際に手を動かしたほうが頭に入りやすい。
チュートリアルでさえも上述のようにエラーが出るケースもあり、その際はトラブルシュートで色々調べたりもするので。

今後はkubernetes理解やクラウド(AWS/GCP)へのデプロイ、CICDパイプラインまわりをやっていく予定。まだまだコンテナの旅は始まったばかりだ〜