Docker-composeで開発環境を作るのが良いことに今頃気がついたあるエンジニアの気付き

2020年1月29日

テクノロジー

VM系からVirtual系に来て、Dockerの軽快さを理解して、便利に開発環境の構築をしてここ数年きていたんですが、docker-composeを使うともう少し効率の良い開発環境が構築出来るということに、今更気がついた、ユゲタです。 Dockerを知らない人の為に簡単に説明すると、VMwareやVirtulBoxは、単純にOS上に別のOSを起動するところ、Dockerはコンテナ技術を使い、別のOSを最小限の構成で起動する事ができるため、これまでの仮想OSよりも遥かに高速に環境設定が出来るという点が魅力でした。 しかし、Docker単体でrunして使っていたOSで、何かそのコンテナOSに設定変更を行った場合には、commitしてOS自体を保存していたのですが、イメージ容量が6GBを超えてしまい、別のPCで開発をする際にコピーして使うには非常に困難な状況になっていました。 サーバー管理でansibleを使って、自動設定をする方法を、以前いた企業でちょっとだけ使っていたんですが、AWSも似たような感じで自動設定などができるという事を聞いたことがあったので、dockerでもそうして便利に使える機能があるんだろうな・・・と思っていたら、「docker-compose」を使うと良いというのを、どなたかのブログで見かけました。 そういや、PHPもcomposerを使って便利に環境構築する時代なので、ローカル開発環境などはこの方式にすることで便利になるという認識も持てました。

Docker-composeの便利点

docker-composeを利用すると、コンテナをダウンする時に毎回コンテナをrmしてくれるため、os内に無駄なログが貯まる事が無く、これによる容量肥大化を防ぐことができます。 また、composerは基本OSをbuildすることで、リポジトリからOSの初期構造をダウンロードして、それをbashやOS内のコマンドを実行して、毎回構成構築をする仕組みなので、構成後の状態を保持しておく必要がありません。 都度ネットワークからダウンロードする仕組みにしておいてもいいし、ダウンロードはbuildにまかせて、confファイルなどの設定を都度送り込む設定にして、インターネットに接続していない環境でも便利に使うことも可能になります。 またこうした、サーバーモジュールのconf設定を変更する度にcommitする手間も、手元のOSでテキストファイルとして編集し、変更後の状態で起動できるため、効率アップも図れます。 一番便利だと感じたポイントは、nginx + phpという風に、モジュールを別OSに入れてそれぞれ立ち上げて、アクセスを1つに構成することで、phpのバージョン違いをポート番号で振り分けたり、複数のnginxバージョンを持たたりすることができ、バージョン互換性管理などが、非常に簡単に管理することができるようになります。 いっそのこと、そのコンテナ(yml設定ファイル等)を本番にコピーするだけで簡単にデプロイすることも可能になります。 何故今までこの機能を使ってこなかったのか非常に勉強不足がもったいないと感じた今日このごろでした・・・

簡単にNginx+PHP7.4を設定する方法

とりあえず、WEB開発環境の基本構成が簡単に設定出来ることがわかったので、備忘録としてその環境をブログにのせておきます。 docker-composeのインストールは下記URLを参照ください。 http://docs.docker.jp/compose/install.html / ├ web └ Dockerfile ├ php74 ├ default.comf ├ nginx.conf └ Dockerfile └ docker-compose.yml version: '3' services: web: build: context: ./web/. ports: - "80:80" - "443:443" - "8080:8080" depends_on: - php74 volumes: - ~/web:/var/www/html - ~/web/_log/nginx:/var/log/nginx php74: build: context: ./php74/. volumes: - ~/web:/var/www/html FROM php:7-fpm FROM nginx:latest COPY nginx.conf /etc/nginx/nginx.conf COPY default.conf /etc/nginx/conf.d/default.conf server { index index.php index.html; server_name localhost; root /var/www/html; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php74:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } } user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$uri - $is_args - args :::' '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; } このファイルを構築できたら以下の操作方法で運用することができます。 # 起動 $ docker-compose up -d # 停止 $ docker-compose down # 設定変更時などのコンテナビルド(構築) $ docker-compose build # コンテナターミナルにアクセス $ docker exec -it <<コンテナ名>> bash # 起動しているコンテナ一覧を確認 $ docker ps -a # 起動中のcomposeのログ $ docker-compose logs さて、これからmail設定やらsql設定やら、node設定などを構築していきましょうか。