運用プログラムの修正などでdockerで開発環境を作るときに便利なように、開発部分だけを一個のディレクトリに突っ込めば動くDockerの準備のための備忘録

↓この状態を目指す

├── _docker (Docker関連はここにまとめる)
│   ├── apache-php(Apacheサーバー用ディレクトリ)
│   │   ├── Dockerfile (webサーバビルド用Dockerfile)
│   │   └── httpd.conf (Apache設定ファイル)
│   └─ mysql-db (mysqlファイル保存)
├── deploy (この中にソースファイル入れてコンテナと共有)
│    └─ public (ドキュメントルート)
│       └ index.php
├── docker-compose.yml (docker-compose の設定ファイル)
├── docker-compose-dev.yml (docker-compose の設定ファイル)
└── docker-sync.yml (docker-sync の設定ファイル)

開発環境がmacなのでdocker-syncも導入する。(これがないと30倍くらい描画時間掛かる)

Docker Compose 概要

Docker composeは複数のコンテナから成るサービスを構築・実行する手順を自動的にし、管理を容易にする機能。

compose ファイルを用意してコマンドを1 回実行することで、設定を読み込んですべてのコンテナサービスを起動することができる。

大体web+DBプラスアルファで構築するんじゃないかな

Docker Compose を使うまでの主なステップ

  • それぞれのコンテナのDockerfile を作成(今回はウェブサーバーのみ)
  • docker-compose.yml を作成し、それぞれ独立したコンテナの起動定義
  • “docker-compose up” コマンドを実行してdocker-compose.yml で定義したコンテナを起動

docker-syncの導入

$ gem install docker-sync

brew 自体のアップデートしておくその他、必要に応じて以下など

$ brew upgrade
$ brew upgrade fswatch

各ファイルの補足説明

docker-compose.yml

複数のコンテナそれぞれがどんな役割か定義するファイル

docker-compose-dev.yml

docker-compose-dev.yml は、ボリュームとマウントのオーバーライドを定義します。

docker-sync.yml

docker-sync.yml は、同期に関する設定を定義します。

docker-compose.yml

version: "3"

services:
  web:
    build:
      context: ./apache-php
    ports:
      - 80:80
    privileged: true
    links:
      - db
      - memcached
    volumes:
      - "../deploy:/var/www/html"
    container_name: "kirin"
    command: /sbin/init
    stdin_open: true
  db:
    image: mysql:5.7
    volumes:
    - "./mysql-db/:/var/lib/mysql/"
    environment:
      MYSQL_DATABASE: db_development
      MYSQL_USER: root
      MYSQL_PASSWORD: root
      MYSQL_ROOT_PASSWORD: root
    container_name: "mysql_kirin"
  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    links:
      - db
    ports:
      - 8080:80
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=db
      - PMA_USER=root
      - PMA_PASSWORD=root
    container_name: "phpmyamin_kirin"

  memcached:
    image: memcached:1.4
    container_name: "memcached_kirin"
    ports:
      - "11211:11211"

container_nameは自由につけよう僕の場合は大体アプリケーション名を使っています

docker-compose-dev.yml

version: '3'

services:
  web:
    volumes:
      - kirin_syncs:/var/www/html

volumes:
  kirin_syncs:
    external: true

docker-sync.yml

version: '2'

syncs:
  kirin_syncs:
    src: './deploy'

docker-compose.ymlで各コンテナの設定、docker-compose-dev.ymlでどのボリュームをsync対象にするか設定、docker-sync.ymlでどのローカルボリュームとsyncさせるか設定って感じ?

本番環境はdockerで構築してないので別にファイル分けない定義方法があるかもしれないけど、よくある設定にならって記述。

Dockerfile

Dockerfileの記述方法は人それぞれ僕の場合はyumで必要なパッケージを導入、その他必要に応じてライブラリなど入れてる
httpd.confは毎回同じ箇所を編集しているので、設定済みのconfファイルを用意しておいてそれをコピペして使う所まではビルド時に行うようにしている

FROM centos:7.4.1708

RUN yum -y update

RUN yum -y install less

# 外部リポジトリ(EPEL, Remi)を追加
RUN yum -y install epel-release
RUN yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

# apache その他 phpパッケージを導入
RUN yum -y install httpd
RUN yum -y install --enablerepo=remi,remi-php73 -y php php-cli php-common php-devel php-fpm php-gd php-mbstring php-mysqlnd php-pdo php-pear php-pecl-apcu php-soap php-xml php-xmlrpc php-pecl-memcache libmcrypt php-mcrypt
RUN yum install -y ImageMagick ImageMagick-devel
RUN yum -y install zip unzip

RUN yum -y install make
RUN yum -y install php73-php-pecl-zip.x86_64


RUN pecl install imagick

# composerのインストール
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer


ENV    APACHE_LOG_DIR=/var/log/apache2 \
        APACHE_LOCK_DIR=/var/lock/apache2 \
        APACHE_RUN_DIR=/var/run/apache2 \
        APACHE_PID_FILE=/var/run/apache2.pid

# httpd.conf上書き
COPY ./httpd.conf /etc/httpd/conf/httpd.conf


# Apacheの自動起動設定
RUN systemctl enable httpd
CMD ["/sbin/init"]

WORKDIR /var/www/html

httpd.confのデータはググるか以下からもダウンロードできますhttps://kirinblog.net/wp-content/uploads/2021/12/httpd.conf_.txt

docker-syncを実行

docker-sync は docker-sync-stack start で実行


docker-sync.yml を変更した場合は、必ず docker-sync clean を実行してから、 docker-sync-stack start を実行

便利なdockerコマンド

コンテナに入る

docker container exec -it コンテナ名 bash

今回の場合は

docker container exec -it kirin bash

コンテナ名は

docker-compose ps

で見ることができます。docker container psより得られるコンテナIDでもOK


ビルド後、失敗していたら削除して再ビルドする時のコマンド

docker-compose up -d --no-deps --build <service_name>


だいたい1つ2つ間違えるので、最初環境整えるときよく使うコマンド
–no-deps – 紐づいている他のサービスを起動しない
–build – コンテナを起動する前にビルドをする<service_name>にはコンテナ名ではなく、docker-compose.ymlのサービス名を入れるのに注意。
上記の例だと、kiringではなく、webになります。docker-compose up -d –no-deps –build web

間違えて最初から全部やり直したい場合のコマンド


docker-compose down --rmi all --volumes

これでコンテナを止めてネットワーク削除してボリューム削除からのイメージ削除が一括で終わる

なんどもミスった点

webコンテナが動いてるのにApacheが動いていない
-> サーバー内にドキュメントルートがないとApache起動時にエラーが出るのでコンテナ立ち上げる前にpublic/index.php作っておく