個人開発なら使わなくてもいいけれど、
チーム開発ならぜひ使いたい便利ツールといえばやっぱり『Docker(ドッカー)』。
某開発コミュニティでも当然のように、
的な流れがあり、たくさんのプロジェクトで実際に『Docker』が使われています。
今回、とある新プロジェクト立ち上げで、
『某開発室』メンバーの方に作成いただいた『Docker開発環境』の立ち上げが
なぜかうまくいかず、ググりにググりまくって得た知見を忘れないように残しておこうと思います。
先に結論を書くと、
docker-compose up コマンドだと起動画面で止まってしまう(ように見える)ので、
docker-compose up -d と -d コマンドをつけて、バックグラウンドで動かせばOKだった、
という結果でした。
そもそもDockerってなんなのさ
2013年3月にリリースされた『Docker』。
ざっくりいうと、パソコンの中にパソコン(サーバー)環境を持てる技術(仮想化技術)で、
ドラえもんの四次元ポケット的なイメージなんですが、
昔からあった『VirtualBox(バーチャルボックス)』や『VMWare(ブイエムウェア)』
それらの技術を活用した『Vagrant(ベイグラント)』と比べて、
- ハードディスクの使用量が少ない
- 仮想環境の起動が早い
- 性能劣化がほとんどない
- 使い捨ても簡単
といったメリットがあると言われています。
デメリットとして先に書いておくと、
OSがwindowsの場合、windows10pro以外は動作が怪しい事があり(うまく動かないとかなんとか)、
『Docker』使いの方はMacやLinuxが多いようです。
Dockerのメリット
『Docker』の何がいいかというと、
例えばプロジェクトを2つ担当していたりすると、
それぞれデータベースの設定が違ったりするので毎回変更する手間をはぶけたり、
サーバーやデータベースの初期設定って面倒だし時間もかかるので、
『docker-compose.yml』という、
一発で環境構築できるファイルをつくっておけばあっさり構築できるというのがとっても便利なんですよね。
Dockerのイメージと環境構築方法
一口に『Docker』といってもいくつか役割があって、だいぶこんがらがったので図を書いてみました。
公式サイトなどで『Docker』をインストールして立ち上げると、
青い枠の『Dockerホスト』が立ち上がります。
『Dockerホスト』の中で、
- webサーバならnginx(エンジンエックス)かApache(アパッチ)
- データベースならmysql(マイエスキューエル)など
- プログラミング環境(PHPとかRubyとか)
などなどを動かすことができます。
クラウド上の『Dockerレジストリ』の中に、
nginxやapache, mysql, php などのイメージが保管されているので、
それらをダウンロードするとパソコン上に『Dockerイメージ』として保存されます。
実際に使う時には『Dockerイメージ』を『Dockerコンテナ』として実体化すれば使えるようになります。
チャーハンで例えると、
- 『DockerHub』・・業者用の倉庫
- 『Dockerイメージ』・・冷凍チャーハン
- 『Dokcerコンテナ』・・解凍して食べれる状態のチャーハン
という感じだそうです。
Dockerの環境構築方法
開発環境の構築方法は大きく分けると2通りあるのかなと思います。
- Dockerレジストリ(DockerHub)から1つずつダウンロードする
- docker-compose.ymlファイルに記載してまるっとインストールする
1番は文字通り、
- webサーバーならnginxかapache
- データベースならmysqlなど
- プログラミング言語(laravelならPHPなど)
を一つずつダウンロードして、コンテナとして立ち上げて、という手順になるのですが、
Docker初心者ならなかなか苦戦すると思われるのと(僕はそうでした)、
実際の現場ではコンテナ1つということはなく、
3つも4つも組み合わせて使うので(例えばwebサーバーとmysqlとphpなど)、
最初から2番の 『docker-compose.yml』 ファイルでインストールしつつ覚えていった方がいいんじゃないかなと思います。
『docker-compose』はとにかく便利で、
- DockerHubからいくつでも必要なイメージをダウンロード
- DockerイメージをDockerコンテナとして実行
をまるっと実施してくれます。
docker-composeファイルサンプル
『docker-compose』をざっくり言うと、
複数のコンテナを同時にインストールしたり起動させたりするツールです。
イメージはなぜかタコ。
『docker-compose.yml』ファイルをつくって、その中に起動させたいツールの情報を書いていきます。
今回の内容はこちら。
version: "2" services: nginx: image: nginx:alpine volumes: - ./docker/nginx/conf.d/:/etc/nginx/conf.d/ - ./public:/var/www/public ports: - 80:80 links: - phpfpm depends_on: - phpfpm phpfpm: build: context: . dockerfile: ./docker/nginx/Dockerfile volumes: - ./:/var/www/ links: - mysql depends_on: - mysql environment: - DB_HOST=mysql mysql: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=database - MYSQL_USER=user - MYSQL_PASSWORD=password ports: - 3306:3306
yml(ヤメル)という書き方で書かれていて、コロン(:)の後に改行し、段落をつけて書かれています。
よくよく見ると、
- サービスとして、nginxと、phpfpmと、mysqlという3つがある
- nginxとmysqlの中にはimage という記載がある。(『DockerHub』からダウンロードする)
- nginxとmysqlはポート番号を指定している。
- linkの後に各サービスを書いている(繋げている)
- depends_on で依存関係
- phpfpmは「dockerfile」を読み込む
という内容が読み取れます。
続いて、nginxの設定ファイル。 docker/nginx/conf.d/default.conf という箇所に保存されていました。
server { listen 0.0.0.0:80; server_name localhost; charset utf-8; root /var/www/public; index index.php; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ .php$ { fastcgi_pass phpfpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
続いて『Dockerfile』。
『Dockerfile』はさながらチャーハンのレシピ。
FROM php:7.2-fpm-alpine RUN docker-php-ext-install pdo_mysql
この2行。
FROM php:7.2-fpm-alpine は『DockerHub』からダウンロードで、
RUN docker-php-ext-install pdo_mysql で phpとmysqlの実行と思われます。
これらを準備して、『docker-compose up -d』というコマンドを打つことで、
「複数段あって温め順等を設定できる高機能な電子レンジ」がガリガリ勝手に動いて、
10分もしないうちに、仮想環境内に、
- webサーバー(nginx)
- データベース(mysql)
- プログラミング環境(PHP)
がインストールされると。
他のプロジェクトでは追加で、
- PHPのライブラリどっさりインストール
- メールサーバーインストール
- 自動マイグレート(データベース内のテーブル作成)
- 自動シーダー投入(ダミーデータをデータベースに保存)
なんかもやっちゃったりしてます。
これらを一つずつ考えながらつくっていくと結構な時間がかかるし途中でやめちゃう可能性大なので、
最初は『docker-compose サンプル』などでググってできあがった状態をダウンロードした方がいいんじゃないかなと思います。
Docker環境構築でつまずいた件 portがかぶってる
すんなり動けばいいんですが、
すんなり動かないこともままあるのが『Docker』。
一つ目はこんなエラーメッセージでした。
ERROR for cannot start service mysql: b’driver failed programming external connectivity on endpoint
Bind for 0.0.0.0:3306 failed: port is already allocated
ポート3306がすでに使われていると。
ポート番号被っていると起動できないので、
docker-compose down でコンテナ停止して
docker-compose ps でコンテナ状態確認して(ステータスがExit 0 なら停止中)
そこから再度 docker-compose up -d
それでもだめならゾンビプロセスが残ってる可能性があるので、
sudo lsof -i:3306
などで動いているプロセスを確認して
sudo kill 3306
などで強制終了かけた後に
docker-compose up -d で高機能電子レンジを動かすといいかも、です。
docker-compose up で止まっちゃってみえる
こちらはだいぶ時間がかかりました。
docker-dompose up とうって、順調に起動が進んでいって、
mysqld: ready for connections.
socket: ‘/var/run/mysqld/mysqld.sock’ port:3306 MySQL Community Server (GPL)
という表示のあとに止まってしまうという。
冒頭にも書きましたが、
-d オプションをつけないと、表画面で起動されるのでコマンド受け付けなくなっちゃうんですよね・・
(この場合はCtrl+Cで止めるしかなくなる)
別ターミナルだせば動かせるようなのですが、素直に -d オプションつけた方がいいかなと思ってます。
おまけ dockerよく使うコマンド
docker-compose up -d ・・docker-compose.ymlの内容を実行
docker-compose ps ・・プロセス状況確認
docker-compose down ・・コンテナ停止
docker exec -it mysql bash ・・コンテナに入る (mysqlに入るなど)
mysql -h 127.0.0.1 -u xxx -p yyy ・・mysqlコンテナに入った後にmysqlにログイン
docker container ls 実行中コンテナ表示
docker container ls -a 実行停止問わず全てのコンテナ表示
docker image -a ダウンロード済みイメージ一覧
『docker-compose.yml』が作られていれば、upとpsとdownのコマンドが増えると思います。
docker まとめ
『docker』はとても便利な反面、高機能な分わかりづらい箇所もいくつかあり、
とくにDockerイメージからDockerコンテナをつくって、それを連携させる、というのは
最初から取り組むとなかなかハードル高い感じがするので、
先人の知恵を盛大にお借りして、『docker-compose.yml』ファイルのサンプルをいくつかみて、
実際に試してみて、ちょっとずつ覚えていくのがいいんじゃないかなと思ってます。
『Docker』を組み合わせた『Kubenetes(クーベネティス』というツールもあり、
新しいツールがどんどん出てきてますが、ちょっとずつでも覚えていきたいもんですな。
参考サイト
dockerが起動できない (port is already allocated)
Dockerについてなるべくわかりやすく説明する←チャーハンネタ
Dockerで開発環境構築を10倍楽にしたはなし←カヤックさん
コンテナ未経験新人が学ぶコンテナ技術入門←NTT新人さん、さすがのクオリティ
アオキのツイッターアカウント。
この記事へのコメントはありません。