Dockerをイチから勉強し直してみたよ(その1)

Dockerとは〜DockerでLAMP環境を作ってみる編

プロジェクトに参加することで否が応でも使用することになるDockerですが、とりまこれをインストールして「docker-compose up -d」したら動くからよろしくね〜ってな感じで誰かが作ってくれた環境をなんとなーく使ってる感が否めなかったDockerをイチから勉強し直してみました。

今回は「その1」として、DockerならびにDocker composeとはそもそも何なのかという内容からWEB環境としては基礎の基礎、LAMP環境をDockerで構築してみるところまでやってみようと思います。

Dockerとは

Dockerを使うことで、例えばMac上でWindsows OSだったりLinux OSだったりの仮想環境を構築することができます。Dockerにはコンテナ技術が使われており、ホストOSのカーネルを使用するため、仮想マシンと比べ非常に軽量で高速です。(厳密にいうと語弊がありますが。。)

また、インフラをコードで簡単に管理することができ誰のパソコンでも平等な環境が構築できることからチーム開発等で重宝されるためシステムエンジニアとしては必須のスキルとなります。

Dcokerの準備

macOS、WindowsともにDocker Desktopをインストールします。

次にDockerhub等からDockerイメージをダウンロードしてきます。
料理に例えて話をするとDockerがキッチンだとしたらDockerイメージは鍋だったり包丁のような感じです。
Docker自体とDockerで動かしたい「もの」=「イメージ」を手に入れます。

Rocky Linux、MySQL、phpMyAdminでやっていこうと思います。
今回はPHPのイメージではなく、Rocky Linuxの挙動も知りたかったのでRocky Linuxのイメージを取得しました。

Dockerhubの検索窓からそれぞれRocky Linux、MySQL、phpMyAdminを検索してそれぞれの詳細画面に記載の

$ docker pull rockylinux
$ docker pull mysql
$ docker pull phpmyadmin

をコピーしてホストOS上のターミナルで実行します。
実行することで上記3つのイメージが手に入ります。

ほしいDockerが手に入ったかを確認する場合は、

$ docker images

を叩いてみると現在持っているDockerイメージの一覧が表示されます。

次にDockerイメージを使用してコンテナを立ち上げます。
先程の料理の話ではキッチンで鍋や包丁を使って実際に料理を作ってみる感じでしょうか。
この調理道具を使用して実際に料理する(コンテナを立ち上げる)状態がビルドとなります。

$ docker run

を実行することによりコンテナの作成と実行が行なえます。
runはビルドするbuildとコンテナを開始するstartを保持しているコマンドです。

$ docker ps -a

を実行することで現在のコンテナの状態一覧が取得できます。

Docker-composeの準備

今回(というか実務でも)コンテナを複数立ち上げるため一つ一つコンテナを立ち上げていたらなかなか面倒です。ということでDocker-composeの出番となります。

Docker-composeは必要なコンテナをまとめて管理してくれます。
またまた先程の料理の話を例に例えると、包丁を使う、鍋を沸かすと一つ一つ指示を出すのではなく、まな板と包丁を使って野菜を切り茹でる、とまとめて指示を出す感じです。

Docker-composeのインストールについてですが、Docker Desktopに含まれているので別途インストールする必要はありません。

docker-compose.ymlというファイルにてDockerを一元管理します。公式サイトではComposeFileと呼ばれているものです。

今回試しに作成してみたdocker-compose.ymlがこちら

version: '3.7'

services:
  web:
    build: "./web"
    container_name: "test-rockylinux"
    ports:
      - 48080:80
      - 40443:443
    volumes:
      - "../test.src/public:/var/www/html"
      - "../test.src/dat:/var/www/dat"
      - "../test.src/etc:/var/www/etc"
      - "../test.src/mod:/var/www/mod"
      - "./web/php.ini:/etc/php.ini"
      - "./web/ssl/localhost.pem:/etc/pki/tls/certs/localhost.crt"
      - "./web/ssl/localhost-key.pem:/etc/pki/tls/private/localhost.key"
      - "./web/host.htaccess:/var/www/.htaccess"
      - "./web/config.php:/var/www/etc/config.php"
    privileged: true
  # MySQL
  db:
    image: mysql:8.0.28
    restart: always
    container_name: test-mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_USER: mysql
      MYSQL_PASSWORD: mysql
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./db/data:/var/lib/mysql
    - ./db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./db/sql:/docker-entrypoint-initdb.d
    ports:
    - 43306:3306

  # phpMyAdmin
  phpmyadmin:
    container_name: test_phpmyadmin
    image: phpmyadmin/phpmyadmin:latest
    restart: always
    depends_on:
      - db
    environment:
    - PMA_ARBITRARY=1
    - PMA_HOSTS=mysql_host
    # - PMA_USER=mysql
    # - PMA_PASSWORD=mysql
    ports:
    - 43307:80

ファイルは拡張子の通りYML(ヤムル)形式となります。

初期状態ではファイルは用意されてませんのでdocker-compose.ymlファイルを起動したいディレクトリに作成後記述していく形になります。
基本的な記述方法については、公式サイトのドキュメントに記載があります。

今回作成したComposeFileを見ていきますと、
servicesというセクションの中にweb、db、phpmyadminがあります。これはweb、db、phpmyadminのコンテナをそれぞれ立ち上げるという内容になります。
dbに関してはmysql:8.0.28の、phpMyAdminに関しては最新のバージョンのdockerイメージを使用するという記述になります。
webに関してはbuildの項目に./webと記述がありますが、こちらはwebディレクトリとにあるDockerFileを使ってbuildしますという内容になります。

volumesの項目はストレージのマウント指定となります。
コロンの左側がホストOSで右側がコンテナ側となります。どのホストOSのファイルをどのコンテナにマウントするかというのを指定できます。

portsの項目は使用するポート番号の指定となります。
こちらも同様にコロンの左側がホストOSで右側がコンテナ側となります。例えばlocalhost:48080からアクセスすることで80番ポート(http)にアクセスできるようになります。

同様に443番ポート(https)を構築することもできます。
SSLが当たり前の時代ですのでセキュア通信での検証も必要なことが多いです。

macの場合の実装は至極単純で
認証局を用意してくれるコマンドをインストールし

brew install mkcert
mkcert -install
mkcert local.localhost

これで、「localhost.pem」「localhost-key.pem」というファイルが作成されるのでdocker-compose.ymlに追記しwebコンテナのポート指定としてhttps用のポート(443)を指定すれば完了です。

Windowsに関してはパッケージ管理ツール「Chocolatey」をインストールする必要があります。
Windows PowerShellを立ち上げChocolatery公式サイトからインストールコマンドをコピーし、PowerShellにて実行します。

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

Chocolatery公式サイト:https://chocolatey.org/install

Chocolateyとは?:http://c.itdo.jp/technical-information/system-manage/chocolatey/

Chocolateryをインストールするにあたり躓きポイントがそこそこあるのですが、私の場合は下記のサイトを参考にさせていただきインストールすることができました。ポリシーをAllSingnedに変更する必要があります。

Chocolateyインストールできない奴:https://ameblo.jp/aga-shu/entry-12661975082.html

次にmacと同様認証局を用意してくれるコマンドをインストールします。

choco install mkcert
mkcert --install

PowerShellにて実行します。

Dockerの起動

Docker-composeの準備ができたところでDockerを起動します。

docker-compose up -d --build

-d を指定してデーモン状態で起動することもできますが最初はデーモンではなく、挙動を見てみるのも良いかもしれません。

Dockerfileのセットアップ

次にまっさらなrockylinuxに必要なモジュールをインストールしていきます。

docker-compose exec web bash

を実行することでコンテナ内に入ることができます。コンテナ内に入ったらいつものサーバセットアップと同様にコマンドをどんどん打ち込んでいきます。

私がDockerに初めて出会ったときの話ですが、Dockerfleを見た際に、え?これってひょっとして手書きなの??と思って勘違いして驚いていた経験があります(笑)

実際にはコンテナ内に入って大枠としてインストールを実行し微調整はDockerfileにて手直ししていきます。

動作確認

https://localhost:40443
にアクセスして画面が表示されれば完成です。

またphpMyAdminに関しては、
http://localhost:43307
にアクセスし、

サーバ:db
ユーザ名:mysql
パスワード:mysql

でログインできたら成功です。

Rocky linuxについて

ここは若干余談ですが、Rocky linuxはRHEL 8.4のクローンと言うだけあって、私の使い方程度であれば中身は全く一緒と考えて良さそうでした。

「AlmaLinux」や「MIRACLE LINUX」などと同様Rocky LinuxもCIQによる正式サポートを受けるようで今後どのように収束していくか目が離せませんね。

Dockerfile

コンテナ内に入って必要なものを一通りインストールやると下記のようなDockerfileが完成しました。
PHP8、apahce2.4となります。

FROM rockylinux/rockylinux:8.4

RUN dnf -y update && dnf clean all

# apache2.4のインストール
RUN dnf -y install httpd httpd-tools mod_ssl openssl expect

# php8のインストール
RUN dnf -y install epel-release
RUN dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
RUN dnf -y module install php:remi-8.0
# phpの拡張モジュールインストール
RUN dnf -y install php php-devel php-pdo php-cli php-fpm php-curl php-mysqlnd php-gd php-opcache php-zip php-intl php-common php-bcmath php-imap php-imagick php-xmlrpc php-json php-readline php-memcached php-redis php-mbstring php-apcu php-xml php-pear php-pecl-apcu

# 日本語設定
RUN cd ~/ \
  && dnf -y install langpacks-ja \
  && localectl set-locale LANG=ja_JP.UTF-8; exit 0

# wgetインストール
RUN dnf -y install wget

# gitのインストール
RUN dnf -y install git

# unzipインストール
RUN dnf -y install unzip

RUN mkdir /var/www/bin

# composerインストール
RUN cd /var/www/bin \
  && wget https://getcomposer.org/installer -O composer-installer.php \
  && php composer-installer.php --filename=composer --install-dir=/usr/local/bin \
  && composer self-update

# php-ulidインストール
RUN cd /var/www/bin \
  && composer require robinvdvleuten/ulid

# composerコマンドインストール
RUN cd /var/www/bin \
  && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
  && php composer-setup.php \
  && php -r "unlink('composer-setup.php');" \
  && mv composer.phar /usr/local/bin/composer

RUN pecl install xdebug; exit 0

# enable service.
RUN systemctl enable httpd

CMD ["/sbin/init"]

さいごに

ソリューションウェアでは、さまざまな分野の案件を幅広く持ち合わせておりスキルアップには最適の環境です。自身のスキル向上に悩んでいる方、エンジニアとしてもう一皮むけたいと考えている方、一緒に私達と働きませんか?
お気軽に一度ソリューションウェアにご相談ください。

ソリューションウェアキャリア採用説明&応募フォーム

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

seventeen − 16 =