運用プログラムの修正などで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作っておく