🐳

Rancher DesktopでDocker環境を構築する!①

2023/02/13に公開

雰囲気でなんとなく触っていたDockerをいちから勉強してみたい!
というわけで今回は、Dockerの基礎勉強がてら環境を作ったときの作業記録です。

目標

完全に一からDockerを導入してdockerfileのみでPHPを動かす最小構成の環境構築をつくってみる

動作確認済み環境

  • MacBook Air(M1, 2020)
  • メモリ: 16GB
  • macOS: Ventura 13.0.1
  • Rancher Desktop Version 1.7.0 (1.7.0)

本記事の想定読者

  • VirtualBoxやVagrantは使ったことあるけどDockerは触ったことがない方
  • なんとなく誰かが作ってくれたDocker環境で開発してるけどもうちょっとDockerに詳しくなりたい方

本記事執筆の目的

  • なんとなく誰かが作ってくれたDocker環境で開発してるけどもうちょっとDockerに詳しくなりたい方
    → まさに自分がこの状態だったので、改めてDockerの知識を基礎から身につける
  • Docker初心者が最低限の知識を獲得できる内容であること
  • エラーなど失敗ケースも含めて記載し、知見共有ができるような記事であること

本記事では取り扱わないこと

  • docker compose
  • Windowsでの環境構築

事前準備

既存のDocker環境を削除する

私のPCにはDocker limaが入っていたので、まずはこれをアンインストールします(Docker for Desktop等が入っている場合も同様にアンインストールしてください)

お使いのPCにDocker環境がない方はアンインストールの箇所はスキップして読み進めてください。

brewでインストール済みのlimaをアンインストール

brew uninstall lima

💀 Rancher Desktopをbrewでインストール

brewでRancher Desktopをインストール(ちょっと時間かかる)

brew install --cask rancher
Running `brew update --auto-update`...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==> New Formulae
agg                           hermit                        portablegl

(----- 中略 ------)

mighty-mike                                   youtype
mints
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

You have 30 outdated formulae installed.
You can upgrade them with brew upgrade
or list them with brew outdated.

==> Downloading https://github.com/rancher-sandbox/rancher-desktop/releases/download/v1.7.
==> Downloading from https://objects.githubusercontent.com/github-production-release-asset
######################################################################## 100.0%
==> Installing Cask rancher
==> Moving App 'Rancher Desktop.app' to '/Applications/Rancher Desktop.app'
🍺  rancher was successfully installed!

↑このように表示されれば成功です

Rancher Desktop.appを起動します(ちょっと時間かかります)

↑特に何もいじらずAcceptします


↑左下で色々インストールが動いているのでしばらく放置

念の為右上「歯車」アイコン > Application > Administrative Access から、管理者権限をAccept(許可)にします↓

もう一度、右上「歯車」アイコン > Application > Container Engine で、「dockerd (moby)」を選択して右下からApplyします↓

(また読み込みが入るのでちょっと待つ)

なぜこのような設定を行うのかというと、dockerコマンドやdocker-composeコマンドを利用する上で、Container Engineがdockerdである必要があるからです。セットアップ後にcontainerdやdockerdの切り替えをすることもできます。
https://www.orzs.tech/rancher-desktop-of-docker/

もう一度、右上「歯車」アイコン > Application > Vurtial Machine で、
メモリを8GB, CPUを4GBにしてApplyします (公式推奨の設定値)
https://github.com/rancher-sandbox/rancher-desktop#system-requirements

ターミナルで「docker info」を実行します

なんか失敗しました
↑のケースは、ポート番号2375が使えない(塞がってる=既に使われてる?)からダメっぽい?

sudo lsof -P -i:2375 でポートの使用状況を確認します
(→何も出ませんでした)

docker-machine start をすればよさそう?

docker-machine start は既に廃止になってた・・・

原因が気になるところですが、ここはさっさと諦めてRancher Desktopをアンインストールします
(brewでインストールすると何かが足りないらしい)

brew uninstall --cask rancher

brew listしてcaskのところにrancherがなくなっていればアンインストール成功です

😇 インストーラでRancher Desktopを導入

普通にここ↓のインストーラを使います(自分の場合はMacOSかつM1を選択しました)
https://rancherdesktop.io/

改めてRancher Desktop.appを起動します
かつ管理者権限OKに設定します

docker info で状態を確認します

docker info
Client:
 Context:    rancher-desktop
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc., v0.9.1)
  compose: Docker Compose (Docker Inc., v2.14.0)

Server:
 Containers: 22
  Running: 0
  Paused: 0
  Stopped: 22
 Images: 8
 Server Version: 20.10.20
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc io.containerd.runc.v2 io.containerd.runtime.v1.linux
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
 runc version: 5fd4c4d144137e991c4acebb2146ab1483a97925
 init version: 
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.15.78-0-virt
 Operating System: Alpine Linux v3.16
 OSType: linux
 Architecture: aarch64
 CPUs: 4
 Total Memory: 7.752GiB
 Name: lima-rancher-desktop
 ID: ZTKF:IUPS:PXC2:R5DC:3L3W:6WRU:GV2H:IZV7:WNDS:6BCU:I3L6:JM3K
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

このようなテキストが表示されればDockerの準備はOKです

PHP環境構築

いわゆるLAMP環境を作っていきます

作業ディレクトリの用意

今回は~/dev/sandbox_php8/に

 → dockerfile
 → index.php

この2つだけ用意します。
今の段階でsandbox_php8ディレクトリだけ作っておきましょう。

Linux環境の用意

今回はDebianの最新版(11.6)を使います。
https://www.debian.org/releases/index.en.html

docker image pull debian:bullseye-slim を実行します

docker image pull dockerio/debian:bullseye-slim でもOKです。

docker image ls を実行して今手元に存在するDockerイメージを一覧で確認します。

先頭に debian があればOKです

Dockerコンテナ(Linux -> debian)を実行してみる

docker container run -it debian:bullseye-slim bash

このようにrootでコンテナに入ることが出来ます。

cat /etc/debian_version でdebianのバージョン確認してみましょう

前述した通り、

まずはLinux。今回はDebianの最新版(11.6)を使う
https://www.debian.org/releases/index.en.html

docker image pull debian:bullseye-slim を実行
このように一致していればOKです。

docker container ls -a で現在Mac上にあるDockerコンテナの一覧が分かります(Macのターミナルで実行)

↑コンテナID/NAMESはランダムに設定されます

ちなみに任意の名前を付けることも可能です。
docker container run --name=名前 イメージ名 コマンド でコンテナを実行(↓例: hogeという名前を指定)

docker container run --name=hoge  -it debian:bullseye-slim  bash

なお、debianコンテナから抜ける時は exit コマンドで元のMacのターミナルに戻れます。

コンテナを名前を指定して実行してみましょう

docker container run --name=debian11.6  -it debian:bullseye-slim  bash
docker container ls -a (Macのターミナルで実行)


付けた名前に変わりました。

使い終わった/使わないコンテナは終了しておきましょう。

docker container stop debian11.6 (←さっきつけた名前を指定)

コンテナのステータスを確認してみます

docker container ls -a (Macのターミナルで実行)


Exited となっており、停止状態になったことがわかります。

コンテナの再起動・削除

  • 再起動
docker container restart debian11.6
  • 削除
docker container debian11.6

→コンテナは簡単に再構築できるので気軽にやり直しができます。
(複数コンテナをまとめて削除することも可能)

dockerイメージを作る

debian11.6の中にPHPの実行環境を用意します。
dockerfile という設定ファイルを作ります。

~/dev/sandbox_php8の中で、テキストエディタを使ってdockerfile, index.phpを作成します。

  • dockerfile の中身
FROM docker.io/php:8.0.16RC1-apache-bullseye
ADD index.php /var/www/html/

EXPOSE 80
  • index.php の中身
<html>
    <body>
        <h1>index</h1>
        <?php
        echo("Hello World!");
        ?>
    </body>
</html>

dockerfileの設定を元にPHPのdockerイメージをビルドする

cd ~/dev/sandbox_php8
docker image build -t sandbox_php8 .

docker image時に sandbox_php8 と指定しましたがここは任意の名前で大丈夫です。
今回はディレクトリ名と揃えて命名しました。


このように表示にされていれば成功です。
イメージの確認もしてみましょう。

docker image ls | grep sandbox_php8

作成したdockerイメージを使ってコンテナを作成する

docker container run --name=sandbox_php8 -d -p 8080:80 -it sandbox_php8

ブラウザで表示確認してみます。
http://localhost:8080

index.phpの内容が表示されていれば成功です。

index.phpの内容を変更してブラウザ上の表示を変えてみる

ホスト側(Mac上のテキストエディタ)で変更したソースコードを、コンテナ側に反映させてブラウザ上の表示を変えてみるという試みです。
※ 実際の開発において今回のような方法は一般的ではありません。普通にdocker composeを使いましょう。

<html>
    <body>
        <h1>index</h1>
        <?php
        echo("こんにちは");
        ?>
    </body>
</html>

docker container ls -a でコンテナのIDを調べます(sandbox_php8のやつ)

今回は 57a7d8dc98c7 と設定されていました(一番左側の項目)

ホストのindex.phpをsandbox_php8コンテナindex.phpにコピーします

cd dev/sandbox_8
docker cp -a index.php 57a7d8dc98c7:var/www/html/index.php

docker cp -a (ホストのファイル名) (コンテナのID):(コンテナのファイル ※絶対パスで書く)

再度ブラウザで表示確認してみます。
http://localhost:8080


反映されていれば成功です。
以降、ホスト側で変更された内容は都度 docker copy でコンテナ側に反映させれば同様にブラウザでの表示確認が可能です。

おわりに

これで最低限PHP8をDocker上で動かすことが出来たわけですが、
前述しましたが、変更をかけてその度にコピーしてブラウザで確認して・・・

非 常 に め ん ど う く さ い

なのでもっといい方法でDocker環境を作りましょう。
次回はdokcer composeを使ってLEMP環境を作ってみます。

続く

Discussion