■目次
Docker概要Docker for Windows(Windows10 Home では使用不可)Docker Toolboxイメージの利用(Apache + PHP 環境の構築)イメージを作成イメージをファイルとして保存イメージの連携(Apache + PHP + MySQL 環境の構築)Docker Composeデータベースの永続化読み書きの制限フォルダ共有で一部を除外古い通信方法Docker Compose と Dockerfile の併用同一ネットワークの他端末からのブラウザアクセス現状のまとめコマンドまとめその他の環境メモ
■Docker概要
コンテナ型のアプリケーション実行環境 当初は開発環境やテスト環境における利用が多かったが、 現在ではパブリッククラウドからオンプレミスシステムまで、さまざまなシーンで急速に普及しつつある DockerはLinuxの1プロセスとして動作するが、名前空間やリソースは他のプロセスやコンテナから隔離して扱われる そのため、コンテナ内のアプリケーションから見ると独立したコンピュータ上で実行されているかのようになる 「namespace」「cgroups」「仮想NIC」といった、既存のLinuxの技術を組み合わせて実現している Vagrantでは「Linux環境自体を一から構築して使う。扱いは通常のLinuxサーバに近い」という方針になるが、 Dockerでは「必要なイメージを組み合わせて環境を構築する。使い捨ての環境を手軽に導入できる」という方針になる Dockerは軽量なテキストで環境を管理できるので、gitなどでの配布が容易 また一般的なApache+PHP以外、例えばnginx環境を各々が作成する場合も同様に管理できる (Windowsにnginxをインストールする方法を調べて…とする必要がない) ただし最初にcomposeを作成する必要はある Dockerについて基本から最近追加された機能までまとめ - Qiita https://qiita.com/yuki_ycino/items/b94ae2bf7d78685cd6f5 超入門Docker:第1回 Dockerとは - @IT http://www.atmarkit.co.jp/ait/articles/1701/30/news037.html 知らぬはエンジニアの恥。今さら聞けない【コンテナ/仮想化技術】11選 - paiza開発日誌 http://paiza.hatenablog.com/entry/2014/10/21/%E7%9F%A5%E3%82%89%E3%81%AC%E3%81%AF%E3%82%A8%E3%83%B3%... 原理原則で理解するDocker - Qiita https://qiita.com/tajima_taso/items/28938415846dcc2e83ff
■Docker for Windows(Windows10 Home では使用不可)
Windows管理者のためのDocker入門:無償の「Docker for Windows」で手軽にLinuxコンテナを利用する (1/2) - @IT http://www.atmarkit.co.jp/ait/articles/1609/01/news053.html https://docs.docker.com/docker-for-windows/install/ の「Get Docker for Windows (Stable)」からDockerをダウンロード&実行 …と思ったが、いきなりエラーになってインストールできない 俺のDocker - Windows10にインストール - Qiita https://qiita.com/Ogaaaan/items/99fe54f052ca450889f7 Windows10 Home では使えない。Professional にする必要がある Homeの環境は多そうなので、Docker for Windows は使いづらいかも
■Docker Toolbox
Windows10にDockerでLAMP環境を構築する - Qiita https://qiita.com/kamonamban/items/e0150a2a7a4d28db10c4 Windows10マシンにDocker Toolbox を入れて個人用の開発環境を作る - Qiita https://qiita.com/osuo/items/99a2b7413ce75f8217be Docker Toolboxのインストール:Windows編 - Qiita https://qiita.com/maemori/items/52b1639fba4b1e68fccd Docker Toolbox だと、Windows10 Home でも使える Docker Toolbox は Docker 環境を簡単に構築するためのインストーラらしい ■インストール Install Docker Toolbox on Windows | Docker Documentation https://docs.docker.com/toolbox/toolbox_install_windows/ 「Get Docker Toolbox for Windows」からDockerをダウンロード&実行 Next Next Next 「Install VirtualBox with NDIS5 driver[default NDIS6]」にチェックを入れてNext Install Finish Docker Toolboxのインストール:Windows編 - Qiita https://qiita.com/maemori/items/52b1639fba4b1e68fccd インストールは主にこのページを参考にした インストールが完了するとVirtualBoxが5.2になっていた バージョン問題でVagrantが起動しなくなった Dockerも起動途中でエラーになる VirtualBoxを5.1に戻すと、VagrantもDockerも起動するようになった (ただしその後のWindowsアップデートの影響で、5.1では動かなくなったので5.2に上げた が、環境によっては 5.1.30 でないと動かない。などがあり謎) Kitematic (Alpha) はエラーになって起動しなかった(DockerのGUI) 起動後、もともとインストールしていた Oracle VM VirtualBox が起動しなくなった …が、Windowsを再起動すると、再度起動するようになった いったん放置 ■起動 Docker Quickstart Terminal を起動 コンソールが開いて処理が始まった 数分で完了し、コンソールが入力待ち状態になった この時点で、再度「Oracle VM VirtualBox」を起動させると、 新たに「default」サーバが追加されて起動中になっていた 「Dockerを起動=VirtualBoxでDocker用の仮想マシンを起動」となっているみたい $ docker run hello-world Unable to find image 'hello-world:latest' locally … 初回実行時はイメージがダウンロードされる latest: Pulling from library/hello-world b04784fba78d: Pull complete Digest: sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f Status: Downloaded newer image for hello-world:latest Hello from Docker! … 2回目からはここからの表示となる This message shows that your installation appears to be working correctly. 〜略〜 動作確認コマンドを試すと、正常に動いているみたい $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 725dcfab7d63 2 weeks ago 1.84kB $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS default * virtualbox Running tcp://192.168.99.100:2376 v17.06.0-ce イメージとマシンが追加されている
■イメージの利用(Apache + PHP 環境の構築)
ベースとなるイメージが、Docker公式イメージとして利用できる Apacheやnginxなど、よく使われるものはたいてい揃っている(公式以外のイメージもある) Docker Hubのオフィシャルイメージを使ったLAMP環境(Apache+PHP+MySQL)構築 - Qiita https://qiita.com/naga3/items/be1a062075db9339762d ■Apache+PHPのイメージを取得 $ docker run -d php:5.6-apache … PHP+ApacheのイメージをDocker Hubから取得し、バックグラウンド(-d)でコンテナを起動 $ docker images … 取得したイメージ一覧を表示 $ docker ps … 起動しているコンテナ一覧を表示 「-d」を指定しない場合、フォアグラウンドで起動される この場合、プロセスの標準入出力・標準エラーをコンソールに出力する ■ブラウザで確認 $ docker run -p 80:80 -d php:5.6-apache … ホストの80番ポートとコンテナの80番ポートを結びつけて、コンテナを起動 $ docker ps … 起動しているコンテナ一覧を表示 $ docker-machine ip … dockerのアドレスを確認 192.168.99.100 ブラウザで以下にアクセスし、「403 Forbidden」が表示されれば成功 http://192.168.99.100/ ■コンテナを削除 $ docker ps … コンテナのIDを確認 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 06256413da0f php:5.6-apache "docker-php-entryp..." 14 minutes ago Up 14 minutes 0.0.0.0:80->80/tcp thirsty_bardeen 957ba4371700 hello-world "/hello" 38 minutes ago Exited (0) 38 minutes ago vigorous_colden $ docker rm -f 06256413da0f … ID「06256413da0f」のコンテナを削除する場合 $ docker rm -f $(docker ps -a -q) … すべてのコンテナを削除する場合 ■コンテンツを作成 $ docker run --name php -p 80:80 -d php:5.6-apache … コンテナに「php」という名前を付けて起動 $ docker exec -it php bash … phpコンテナのターミナルに接続 # echo '<?php phpinfo();' > index.php … index.php を作成(初期状態ではviはインストールされていない) ブラウザで以下にアクセスし、phpinfoが表示されれば成功 http://192.168.99.100/ # exit $ docker rm -f $(docker ps -a -q) … 確認できたら削除 ■フォルダ共有(C:\Users 配下を対象にする) ※Windows側とファイルを共有 Vagrantとは違い、コンテナを終了させるとデータも初期化されるため、データ保持のためにも 以下、作業フォルダが C:\Users\refirio であるとする docker\test\code\index.php を作成し、以下の内容を記述
<?php phpinfo() ?>
$ docker run --name php -v $PWD/docker/test/code:/var/www/html -p 80:80 -d php:5.6-apache … docker\test\code と /var/www/html を共有 $ docker exec -it php bash … phpコンテナのターミナルに接続 # ls /var/www/html … 同期されたファイルを確認 # exit ブラウザで以下にアクセスし、phpinfoが表示されれば成功 http://192.168.99.100/ $ docker rm -f $(docker ps -a -q) … 確認できたら削除 「$PWD」は現在のフォルダを表す $PWD/docker/test/code:/var/www/html をフルパスで指定する場合、以下のようにする。相対パスでは指定できないみたい /c/Users/refirio/docker/test/code:/var/www/html ■フォルダ共有(C:\Users 配下以外を対象にする) C:\Users 配下以外をフォルダ共有対象にして起動しようとすると、以下のようなエラーになる ERROR: for php Cannot start service php: oci runtime error: container_linux.go:262: starting container process caused "chdir to cwd (\"/var/www/html\") set in config.json failed: no such file or directory" C:\Users 配下以外を対象にしたい場合、マウントの指定を行う必要がある ここでは ・Docker用のマシン名は「default」である ・C:\localhost\home\test\public_html\docker を作業フォルダにする という場合を想定する Dockerを起動させている場合、「Oracle VM VirtualBox マネージャ」で「default」の電源をオフにしておく VboxManageでVirtualBox共有フォルダを追加する (初回のみ実行する) >cd C:\Program Files\Oracle\VirtualBox >VBoxManage sharedfolder add default --name data --hostpath "C:\localhost\home\test\public_html\docker" 「Docker Quickstart Terminal」を起動し、マウントを行う (Dockerを起動させるたび実行する) docker-machine ssh default 'sudo mkdir -p /c/localhost/home/test/public_html/docker' docker-machine ssh default 'sudo mount -t vboxsf -o uid=0,gid=0 data /c/localhost/home/test/public_html/docker' 以降は通常どおりの手順で起動できる Dockerにホストのフォルダをマウントしたい! - Qiita https://qiita.com/dojineko/items/f623894ef2436bef890e
■イメージを作成
■イメージを作成(commitコマンド) ※実際にコンテナに対して行った操作内容をもとに、イメージを作成する $ docker run --name php -v $PWD/docker/test/code:/var/www/html -p 80:80 -d php:5.6-apache $ docker exec -it php bash … phpコンテナのターミナルに接続 # touch /root/test1.txt … テストファイルを作成しておく # touch /root/test2.txt # exit $ docker diff php … コンテナ「php」内の差分を表示(テストファイルの存在を確認する) $ docker commit php php:create_file … コンテナ「php」のイメージを「php:create_file」という名前で作成 $ docker run --name php -v $PWD/docker/test/code:/var/www/html -p 80:80 -d php:create_file … 作成したイメージから起動 $ docker exec -it php bash … phpコンテナのターミナルに接続 # ls /root … テストファイルを確認する $ docker rm -f $(docker ps -a -q) … 作成済みのコンテナをいったん削除 ■イメージを作成(buildコマンド) ※コンテナへの操作内容をDockerfile(テキストファイル)に記載し、それをもとにイメージを作成する ※Dockerfileさえ渡せば、他の人も同じ環境を再現できる ※操作内容が明確になり、gitで変更履歴を管理することもできるため、原則としてこちらの方法を推奨 $ docker images … 上で作成したイメージのIDを確認 $ docker rmi 9dbd220d50c7 … 削除しておく docker\php_create_file\Dockerfile … Dockerfileを作成
FROM php:5.6-apache RUN touch /root/test1.txt RUN touch /root/test2.txt
$ docker build -t php:create_file docker/php_create_file … Dockerfileをもとに、新しいイメージをビルド $ docker images … 作成されたイメージ(custom)を確認 $ docker run --name php -v $PWD/docker/test/code:/var/www/html -p 80:80 -d php:create_file … 作成したイメージから起動 $ docker exec -it php bash … phpコンテナのターミナルに接続 # ls /root … テストファイルを確認する $ docker rm -f $(docker ps -a -q) … 作成済みのコンテナをいったん削除
■イメージをファイルとして保存
$ docker save php:create_file > docker/images/php_create_file.tar … 「php:create_file」イメージを「php_create_file.tar」として保存 $ docker images … 上で作成したイメージのIDを確認 $ docker rmi 0515d11a2846 … 削除しておく $ docker load < docker/images/php_create_file.tar … 保存したイメージを読み込む $ docker images … 読み込んだイメージを確認
■イメージの連携(Apache + PHP + MySQL 環境の構築)
■MySQLのイメージを取得 ※Apache+PHPのイメージにMySQLをインストール …という方法でも構築できるが、Dockerの場合は一般的に「Apache+PHPのイメージとMySQLのイメージを取得し、連携させる」のようにする $ docker run --name mysql -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.7 … MySQLのパスワードを「pass」にして起動 $ docker exec -it mysql bash … mysqlコンテナのターミナルに接続 # mysql -u root -p … MySQLに接続 $ docker rm -f $(docker ps -a -q) … 確認できたら削除 「MYSQL_ROOT_PASSWORD」は環境変数と呼ばれるもの。これに値をセットすることで、コンテナに設定の指定を行うことができる 環境変数は、コンテナのターミナルに接続して「env」と入力すれば一覧表示できる 起動直後にMySQLにログインしようとすると、以下のエラーになることがある ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 何度か試していると以下のエラーに変わることがある ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) さらに何度か試しているとログインできた。その後は普通にアクセスできる MySQLが完全に起動するまでタイムラグがあるみたい。焦らずに1〜2分程度待つ Dockerの公式MySQLイメージの使い方を徹底的に解説するよ - DQNEO起業日記 http://dqn.sakusakutto.jp/2015/10/docker_mysqld_tutorial.html ■PHPとMySQLの連携(準備) ※Apache+PHPのイメージに、MySQLを扱うためのライブラリを追加する それを新しいイメージとして保存する docker\test\php\Dockerfile … Dockerfileを作成
FROM php:5.6-apache RUN apt-get update && \ docker-php-ext-install pdo_mysql mysqli mbstring
$ docker build -t php:custom docker/test/php … Dockerfileをもとに、新しいイメージをビルド $ docker images … 作成されたイメージ(custom)を確認 docker/test/php をフルパスで指定する場合、以下のようにする。フォルダ共有のときとはルールが違うので注意 C:/Users/refirio/docker/test/php ■PHPとMySQLの連携 ※ネットワークを作成し、そこに参加させることでコンテナを連携させることができる ※PHPコンテナ起動時に「--link mysql:mysql」のように指定することで、コンテナを連携させることもできる。が、それは古い方法で非推奨 $ docker network ls … ネットワークを確認。はじめは3つ NETWORK ID NAME DRIVER SCOPE 620a2ccffb63 bridge bridge local 8b789d2d1514 host host local 16b9ed4aa1c6 none null local $ docker network create my_network … ネットワーク「my_network」を作成 $ docker network ls … ネットワークの追加を確認 NETWORK ID NAME DRIVER SCOPE 620a2ccffb63 bridge bridge local 8b789d2d1514 host host local 2234c63a488d my_network bridge local 16b9ed4aa1c6 none null local $ docker run --net my_network --name mysql -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=test -d mysql:5.7 … ネットワークを指定してMySQLコンテナを起動 MySQLのパスワードは「pass」にして、データベース「test」を作成する $ docker run --net my_network --name php -v $PWD/docker/test/code:/var/www/html -p 80:80 -d php:custom … ネットワークを指定してPHPコンテナを起動 $ docker exec -it php bash … phpコンテナのターミナルに接続 $ exit $ docker exec -it mysql bash … mysqlコンテナのターミナルに接続 $ mysql -u root -p … MySQLに接続 mysql> show databases; … testデータベースを確認(「MYSQL_DATABASE=test」によって自動作成されている) mysql> create database test; … 別途データベースを作成する場合 mysql> exit; /c/Users/refirio/docker/test/code(/var/www/html)内に適当なデータベース管理ツールを設置し、テーブルを作成&データ登録&表示をテスト http://www.php-labo.net/download/new/db_admin/ の場合、以下の接続情報でアクセスできた
define('HTTP_URL', 'http://192.168.99.100/db_admin/'); define('ADMIN_PASSWORD', '1234'); define('DATABASE_TYPE', 'mysql'); define('DATABASE_HOST', 'mysql'); define('DATABASE_PORT', ''); define('DATABASE_USER', 'root'); define('DATABASE_PASSWORD', 'pass'); define('DATABASE_CHARSET', ''); define('DATABASE_NAME', 'test');
以下で登録テスト
CREATE TABLE address( no INT, name VARCHAR(80), tel VARCHAR(80) ); INSERT INTO address(no, name, tel) VALUES(1, '山田太郎', '090-1234-5678'); INSERT INTO address(no, name, tel) VALUES(2, "山田花子", "090-2345-6789"); SELECT * FROM address;
※DATABASE_CHARSETを指定すると、データ登録時に 「Incorrect string value: '\xE5\xB1\xB1\xE7\x94\xB0...' for column 'name' at row 1」 のエラーになった $ docker ps … コンテナを確認する場合 $ docker rm -f $(docker ps -a -q) … コンテナを削除する場合 ■次回起動時 以下で起動する フォルダ共有している以外のデータは削除されているので、テーブルの作成などは都度必要 $ docker run --net my_network --name mysql -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=test -d mysql:5.7 $ docker run --net my_network --name php -v $PWD/docker/test/code:/var/www/html -p 80:80 -d php:custom 以下でアクセスできる http://192.168.99.100/ http://192.168.99.100/db_admin/
■Docker Compose
docker run で起動する場合、一度に起動すべきコンテナの数が多くなると管理しづらくなるので、Docker Compose で管理するといい これなら依存管理の手間が無くなり、さらに起動コードや関連ファイルを丸ごとGitで管理することもできる 当初はシェルスクリプトを作成するなど独自に対応する必要があったが、 公式に手順が用意されたので人によっての方法の差異を防げるようになった docker-compose.yml の現在のバージョンは3なので、「version: '3'」と指定する docker-composeを使うと複数コンテナの管理が便利に - Qiita https://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce ■ファイルの準備 C:\Users\refirio\docker\ 内に以下を作成するとする (PHP+MySQLの環境を作る例) compose_test\html\index.php
<?php phpinfo() ?>
compose_test\docker\mysql\my.cnf
[mysqld] character-set-server=utf8
compose_test\docker\docker-compose.yml
version: '3' networks: my_network: services: mysql: container_name: mysql volumes: - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf environment: MYSQL_ROOT_PASSWORD: pass MYSQL_DATABASE: test networks: - my_network image: mysql:5.7 php: container_name: php volumes: - ..:/var/www ports: - 80:80 networks: - my_network image: php:custom
■起動 各ファイルを用意できたら以下で起動する $ cd /c/Users/refirio/docker/compose_test/docker $ docker-compose up … docker-compose.ymlをもとに起動 ログが以下でストップするが、こういうものみたい [Note] Beginning of list of non-natively partitioned tables [Note] End of list of non-natively partitioned tables ブラウザから http://192.168.99.100/ にアクセスすると、以下のようなアクセスログが表示される php | 192.168.99.1 - - [16/Dec/2017:08:56:09 +0000] "GET / HTTP/1.1" 200 24541 "-" "Mozilla/5.0 以下略 Ctrl+C で終了できるが、コンテナも終了される 「docker exec -it php bash」のように接続したければ、バックグラウンドで起動する必要がある ■起動(バックグラウンド) $ cd /c/Users/refirio/docker/compose_test/docker $ docker-compose up -d … docker-compose.ymlをもとにバックグラウンドで起動 $ docker ps … コンテナを確認 $ docker exec -it php bash … phpコンテナのターミナルに接続 $ exit $ docker exec -it mysql bash … mysqlコンテナのターミナルに接続 $ mysql -u root -p … testデータベースを作成 mysql> create database test; mysql> exit; $ exit /c/Users/refirio/docker/compose_test/code(/var/www/html)内に適当なデータベース管理ツールを設置し、テーブルを作成&データ登録&表示をテスト http://www.php-labo.net/download/new/db_admin/ の場合、以下の接続情報でアクセスできた
define('HTTP_URL', 'http://192.168.99.100/db_admin/'); define('ADMIN_PASSWORD', '1234'); define('DATABASE_TYPE', 'mysql'); define('DATABASE_HOST', 'mysql'); define('DATABASE_PORT', ''); define('DATABASE_USER', 'root'); define('DATABASE_PASSWORD', 'pass'); define('DATABASE_CHARSET', ''); define('DATABASE_NAME', 'test');
$ docker-compose down … コンテナを終了 $ docker rm -f $(docker ps -a -q) … 「docker rm」でも終了できる
■データベースの永続化
マイグレーションやシーダーで管理するとオーバーヘッドが大きくなりすぎる …という場合、データベースもフォルダ共有の対象にすればデータを保持できる ※後述の「トラブル代替案」ように、フォルダ共有ではなくデータボリュームを使う方が良さそう フォルダ共有だと、環境によっては正しく動作しなかった ※docker-compose.ymlでrootパスワードなどを指定している場合、変更しても永続化済みのデータには影響しない つまり「何故かパスワードの変更が反映されない」となるので注意 手動でパスワードなどを変更するか、永続化済みのデータを初期化するなどする ※データベースを永続化していると、MySQLコンテナが完全に起動するまでの時間が短くなっているかも? 諸々のデータ作成が短縮できるから…かもしれない ■docker run の場合 -v $PWD/docker/test/data:/var/lib/mysql を追加して起動する /var/lib/mysql を同期すれば、MySQLのデータを保持できる /docker/test/data フォルダはあらかじめ作成しておく $ docker run --net my_network --name mysql -v $PWD/docker/test/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=test -d mysql:5.7 $ docker run --net my_network --name php -v $PWD/docker/test/code:/var/www/html -p 80:80 -d php:custom ■Docker Compose の場合 - ./database:/var/lib/mysql を追加して起動する。意味は上と同じ compose_test\docker\docker-compose.yml
version: '3' networks: my_network: services: mysql: container_name: mysql volumes: - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf - ./database:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: pass MYSQL_DATABASE: test networks: - my_network image: mysql:5.7 php: container_name: php volumes: - ..:/var/www ports: - 80:80 networks: - my_network image: php:custom
■トラブル 2018/01/06 にWindowsアップデートするとDockerが起動しなくなった 再インストールで起動するようになったが、データベースの永続化ができないようになっていた Composeを使う使わないにかかわらず永続化できず、MariaDBの場合でも同じ 「-d」なしで起動すると以下のようなエラーを確認できるが、原因不明のまま解決せず Windows側で権限管理やファイルシステムの仕様が変更されたとか?
$ docker run --name mysql -v $PWD/docker/test/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=test mysql:5.7 Initializing database 2018-01-06T17:47:41.143661Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2018-01-06T17:47:41.150773Z 0 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive 2018-01-06T17:47:41.627330Z 0 [ERROR] InnoDB: Operating system error number 22 in a file operation. 2018-01-06T17:47:41.627674Z 0 [ERROR] InnoDB: Error number 22 means 'Invalid argument' 2018-01-06T17:47:41.628023Z 0 [ERROR] InnoDB: File ./ib_logfile101: 'aio write' returned OS error 122. Cannot continue operation 2018-01-06T17:47:41.628357Z 0 [ERROR] InnoDB: Cannot continue operation.
次の手段へ データはbusyboxに保存するのが定番らしいので試す $ docker run --net my_network --name storage -v /var/lib/mysql -d busybox $ docker run --net my_network --name mysql --volumes-from storage -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=test -d mysql:5.7 とすればmysqlのデータをbusyboxに保存できる が、mysqlコンテナを再起動してもデータは消えないが、busyboxを再起動するとデータが消える よってbusyboxからエクスポート&インポートする必要があるが、それだとmysqlをデータ同期無しで使っている状態と変わらない 次の手段へ コンテナとローカルでデータ転送ができるらしいので試す 以下のようにすればデータ転送ができる コンテナからローカルへ $ docker cp mysql:/var/lib/mysql /Users/refirio/docker/backup … 絶対パスの場合 $ docker cp mysql:/var/lib/mysql ./docker/backup … 相対パスの場合 ローカルからコンテナへ $ docker cp /Users/refirio/docker/backup mysql:/var/lib/mysql … 絶対パスの場合 $ docker cp ./docker/backup mysql:/var/lib/mysql … 相対パスの場合 が、ローカルからコンテナに転送すると所有者がrootになる。chownで所有者を変更してもmysqlからは読み込めなかった 権限なども調整が必要かも 非常に面倒なので、phpMyAdminのようなツールでエクスポート&インポートする方が現実的 つまりは実質、データベースは永続化せずに作業する状態となり、かなり面倒 ■トラブル代替案 ホストの特定のパスではなく、データボリュームになら保存できた むしろ、ファイルシステムや権限の問題を回避するためにも、データボリュームを使う方がいいみたい データボリュームに保存したデータベースをバックアップしたければ、phpMyAdminなどのツールを使う dockerコマンドから起動する場合(「mysql_data」に保存) $ docker volume ls ... ボリュームを確認 $ docker volume create --name mysql_data ... 明示的に作成できるが省略可 $ docker run --net my_network --name mysql -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=test -d mysql:5.7 $ docker exec -it mysql bash $ mysql -u root -p Docker Compose から起動する場合、以下のように指定する(「compose_mysql_data」に保存する場合)
services: mysql: container_name: mysql volumes: - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf - compose_mysql_data:/var/lib/mysql
Dockerのデータ永続化関連について - Qiita https://qiita.com/onokatio/items/fcc9f8f94f8533bb030a dockerのデータボリュームとそのバックアップ方法 - Qiita https://qiita.com/74th/items/41393f506d223850f2c3 Docker Data Volume を理解する - Carpe Diem http://christina04.hatenablog.com/entry/2016/05/04/134323
■読み書きの制限
以下のように「:ro」を付けてボリュームを指定すると、読み込み専用(Read-Only)になる - ..:/var/www:ro 以下のように「:rw」を付けてボリュームを指定すると、読み書き可能(Read-Write)になる - ./database:/var/lib/mysql:rw
■フォルダ共有で一部を除外
以下のようにすれば、共有の除外になるみたい プログラムはフォルダ共有したいが、PHPのvenderは各々の環境で作らせたい。のような場合に活用できそう
volumes: - ./server:/home/app/nodeapp - /home/app/nodeapp/node_modules - www:/home/app/nodeapp/out
Dockerでnginx+node.jsのSPA構成を試す - Qiita https://qiita.com/KeitaMoromizato/items/bfc3e22dae47211eff4f
■古い通信方法
※PHPコンテナ起動時に「--link mysql:mysql」のようにMySQLコンテナを指定することで、コンテナを連携させることができる が、それは古い方法で今は非推奨 ※これまで紹介したように、ネットワークを作成し、そこに参加させることでコンテナを連携させる方法が推奨されている 通信できない例 $ docker run --name mysql -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=test -d mysql:5.7 $ docker run --name php -v $PWD/docker/test/code:/var/www/html -p 80:80 -d php:custom 「--link」で通信(非推奨の古い方法だが、参考までに) $ docker run --name mysql -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=test -d mysql:5.7 $ docker run --name php -v $PWD/docker/test/code:/var/www/html -p 80:80 --link mysql:mysql -d php:custom Docker Compose での「--link」使用例(非推奨の古い方法だが、参考までに)
mysql: container_name: mysql volumes: - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf environment: MYSQL_ROOT_PASSWORD: pass MYSQL_DATABASE: test image: mysql:5.7 php: container_name: php volumes: - ..:/var/www ports: - 80:80 links: - mysql:mysql image: php:custom
■Docker Compose と Dockerfile の併用
例えば以下のファイルを作成しておく compose_test\php\Dockerfile FROM php:custom RUN touch /root/test1.txt RUN touch /root/test2.txt compose_test\docker\docker-compose.yml の最後を以下のように修正すると、phpフォルダ内のDockerfileから起動されるようになる image: php:custom ↓ build: php
■同一ネットワークの他端末からのブラウザアクセス
※XAMPPやSkypeが80番ポートを使っている場合、あらかじめソフトを終了させておく Docker Quickstart Terminal から以下を実行することにより、 SSHのポートフォワーディングでネットワーク上にポートを公開する (DockerのIPアドレスが 192.168.99.100 であるとする) $ ssh -fNCL 0.0.0.0:80:localhost:80 docker@192.168.99.100 … SSHをバックグラウンドで起動 The authenticity of host '192.168.99.100 (192.168.99.100)' can't be established. ECDSA key fingerprint is SHA256:MU512WSVjrCJ8FHD45UtuOjzAB0UJeaG5zxOMCojEK8. Are you sure you want to continue connecting (yes/no)? … 「yes」を入力(初回のみ) Warning: Permanently added '192.168.99.100' (ECDSA) to the list of known hosts. docker@192.168.99.100's password: … 「tcuser」を入力 これで自身からは http://192.168.99.100/ だけでなく、 http://127.0.0.1/ http://localhost/ でもDockerにアクセスできるようになる コマンドプロンプトから以下を実行 (自身のPCのIPアドレスを調べる) >ipconfig IPv4 アドレス . . . . . . . . . . . .: 192.168.1.6 自身のIPアドレス http://192.168.1.6/ でもDockerにアクセスできることを確認する この状態なら、同一ネットワークの他端末からのブラウザアクセスが可能 バックグラウンドで起動しているSSHを終了させる場合、以下のようにする $ ps … SSHを確認 PID PPID PGID WINPID TTY UID STIME COMMAND 10220 8708 10220 6160 cons0 197609 14:49:45 /usr/bin/ps 8708 1 8708 11020 cons0 197609 14:35:13 /usr/bin/bash 5388 1 5388 5388 ? 197609 14:45:28 /usr/bin/ssh $ kill 5388 … SSHを終了 Windows - WindowsのDockerのコンテナに外部からアクセスしたい。(54259)|teratail https://teratail.com/questions/54259 ここまでできれば、Dockerを開発環境として使えそう
■現状のまとめ
PHP+MySQLの環境を作る例 ■ファイルの作成 C:\Users\refirio\docker\ 内に以下を作成するとする apache_php5_mysql\html\index.php
<?php phpinfo() ?>
apache_php5_mysql\docker\mysql\Dockerfile
FROM mysql:5.7
apache_php5_mysql\docker\mysql\my.cnf
[mysqld] character-set-server=utf8
apache_php5_mysql\docker\php\Dockerfile
FROM php:5.6-apache RUN apt-get update && \ docker-php-ext-install pdo_mysql mysqli mbstring
apache_php5_mysql\docker\php\php.ini
date.timezone = Asia/Tokyo
apache_php5_mysql\docker\docker-compose.yml
version: '3' networks: compose_network: volumes: compose_mysql_data: services: mysql: container_name: mysql volumes: - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro - compose_mysql_data:/var/lib/mysql:rw environment: TZ: Asia/Tokyo MYSQL_ROOT_PASSWORD: rootpass MYSQL_USER: user MYSQL_PASSWORD: userpass MYSQL_DATABASE: test networks: - compose_network build: ./mysql php: container_name: php volumes: - ./php/php.ini:/usr/local/etc/php/conf.d/php.ini:ro - ..:/var/www:rw environment: TZ: Asia/Tokyo ports: - 80:80 networks: - compose_network build: ./php
■よく使用するコマンド $ cd /c/Users/refirio/docker/apache_php5_mysql/docker $ docker-compose build … ビルドする場合(構成を変更した場合など) $ docker-compose up -d … 起動 $ docker-compose down … 終了 $ docker exec -it php bash … phpコンテナのターミナルに接続する場合 $ docker exec -it mysql bash … mysqlコンテナのターミナルに接続する場合 $ mysql -u root -p … MySQLに接続 ■ブラウザからのアクセス http://192.168.99.100/ 以下のようなコードで、PHPからMySQLに接続できる エラーになる場合、mysqlコンテナの起動が完了していない可能性があるので待つ
<?php try { $pdo = new PDO( 'mysql:dbname=test;host=mysql', 'user', 'userpass' ); $stmt = $pdo->query('SELECT NOW() AS now;'); $data = $stmt->fetch(PDO::FETCH_ASSOC); echo "<p>" . $data['now'] . "</p>\n"; } catch (PDOException $e) { exit($e->getMessage()); } $pdo = null;
■コマンドまとめ
# イメージをまとめてビルド。イメージがローカルになければプル docker-compose build # イメージをまとめてプル docker-compose pull # 「docker-compose build」や「docker-compose pull」をした後に実行 docker-compose up -d # 関係するコンテナすべてのログを出力 docker-compose logs # 関係するコンテナをすべて停止 docker-compose stop # 関係するコンテナをすべて削除 docker-compose rm # 関係するコンテナをすべて再起動 docker-compose restart # 関係するコンテナをすべて停止して削除 docker-compose down # 起動しているコンテナを一覧 docker ps # 取得したイメージを一覧 docker images # イメージを一括削除 docker rmi `docker images | sed -ne '2,$p' -e 's/ */ /g' | awk '{print $1":"$2}'` # 作成したボリュームを一覧 docker volume ls # 未使用ボリュームを一括削除 docker volume prune # 作成したネットワークを一覧 docker network ls # 未使用ネットワークを一括削除 docker network prune # llを使用する(コンテナ内でエイリアスを設定する場合の例) alias ll="ls -l" # Vimを使用する(コンテナ内でインストールする場合の例) apt-get update apt-get install vim
■その他の環境
■nginx C:\Users\refirio\docker\ 内に以下を作成するとする ※nginx.conf の「sendfile off;」は、これが無いとHTMLファイルを更新しても反映されない(キャッシュされる) 後から追加した場合、Dockerを起動しなおせばいい(buildまでは不要) ただしHTMLファイルに何らかの変更をするまではキャッシュされ続けるみたい ※「location / { }」のブロックは省略しても大丈夫みたい nginx\html\index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>nginx</title> </head> <body> <h1>nginx</h1> <p>テストページ。</p> </body> </html>
nginx\docker\nginx\Dockerfile
FROM nginx:1.12
nginx\docker\nginx\nginx.conf
server { listen 80 default_server; server_name _; index index.html; root /var/www/html; sendfile off; location / { } }
nginx\docker\docker-compose.yml
version: '3' services: nginx: container_name: nginx volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/nginx.conf:ro - ..:/var/www:rw environment: TZ: Asia/Tokyo ports: - 80:80 build: ./nginx
起動方法 $ cd /c/Users/refirio/docker/nginx/docker $ docker-compose build $ docker-compose up -d http://192.168.99.100/ でアクセスできる 各コンテナに接続する場合 $ docker exec -it nginx bash 終了方法 $ docker-compose down ■nginx(ホスト名でのアクセスについて) nginx.conf の以下の部分を
listen 80 default_server; server_name _;
一例だが以下のように設定すると、
server_name nginx.test;
C:/windows/System32/drivers/etc/hosts で以下の設定をして http://nginx.test/ にアクセスする必要がある
192.168.99.100 nginx.test
バーチャルホストが前提の場合は問題ないが、Dockerなら通常1つの環境で1つのアプリケーションを扱う 開発環境として使うならhostsの設定無しでアクセスできる方が手軽で良さそう ■nginx+PHP7 C:\Users\refirio\docker\ 内に以下を作成するとする nginx_php7\html\index.php
<?php phpinfo() ?>
nginx_php7\docker\mysql\Dockerfile
FROM mysql:5.7
nginx_php7\docker\mysql\my.cnf
[mysqld] character-set-server=utf8
nginx_php7\docker\nginx\Dockerfile
FROM nginx:1.12
nginx_php7\docker\nginx\nginx.conf
server { listen 80 default_server; server_name _; index index.php index.html; root /var/www/html; sendfile off; location / { } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; include fastcgi_params; } }
nginx_php7\docker\php\Dockerfile
FROM php:7.0-fpm RUN apt-get update && \ docker-php-ext-install pdo_mysql mysqli mbstring
nginx_php7\docker\php\php.ini
date.timezone = Asia/Tokyo
nginx_php7\docker\docker-compose.yml
version: '3' networks: compose_network: volumes: compose_mysql_data: services: mysql: container_name: mysql volumes: - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro - compose_mysql_data:/var/lib/mysql:rw environment: TZ: Asia/Tokyo MYSQL_ROOT_PASSWORD: rootpass MYSQL_USER: user MYSQL_PASSWORD: userpass MYSQL_DATABASE: test networks: - compose_network build: ./mysql php: container_name: php volumes: - ./php/php.ini:/usr/local/etc/php/conf.d/php.ini:ro - ..:/var/www:rw environment: TZ: Asia/Tokyo networks: - compose_network build: ./php nginx: container_name: nginx volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/nginx.conf:ro - ..:/var/www:rw environment: TZ: Asia/Tokyo ports: - 80:80 networks: - compose_network build: ./nginx
起動方法 $ cd /c/Users/refirio/docker/nginx_php7/docker $ docker-compose build $ docker-compose up -d http://192.168.99.100/ でアクセスできる 各コンテナに接続する場合 $ docker exec -it nginx bash $ docker exec -it php bash $ docker exec -it mysql bash 終了方法 $ docker-compose down Docker + Nginx + PHP-FPM なら40秒くらいで環境を準備できる docker-compose が楽しくなってきました。 - Qiita https://qiita.com/mochizukikotaro/items/b398076cb57492980447 CentOSにてnginxでPHPを動かす - Qiita https://qiita.com/utano320/items/36b6eac2bbd5bb5657f6 CentOS 6.5でnginxを動かす為の最低限の設定 - Qiita https://qiita.com/ksworks/items/cbc7b73c62c5e115d830 nginxで /welcomeとかを静的ファイルにマッピングする - Qiita https://qiita.com/sarukun99/items/e30cc945ec6243ebac57 【php】nginxとphp-fpmが動く環境を手っ取り早く入れるメモ - tweeeetyのぶろぐ的めも http://tweeeety.hateblo.jp/entry/2015/07/05/224827 nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する - Qiita https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc ■nginx+PHP7(URLルーティングの例) nginx_php7\html\index.php
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>nginx + PHP7</title> </head> <body> <h1>nginx + PHP7</h1> <?php if (!isset($_SERVER['REQUEST_URI'])) { $_SERVER['REQUEST_URI'] = '/'; $_SERVER['SCRIPT_NAME'] = '/index.php'; } $request_uri = explode('/', strtok($_SERVER['REQUEST_URI'], '?')); $script_name = explode('/', $_SERVER['SCRIPT_NAME']); for ($i = 0; $i < sizeof($script_name); $i++) { if ($request_uri[$i] === $script_name[$i]) { unset($request_uri[$i]); } } $_params = array_values(array_map('urldecode', $request_uri)); print('<pre>'); print_r($_params); print('</pre>'); ?> </body> </html>
nginx_php7\docker\nginx\nginx.conf
server { listen 80 default_server; server_name _; index index.php index.html; root /var/www/html; sendfile off; location / { try_files $uri /index.php?$query_string; … URLルーティング用に追加 } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; include fastcgi_params; } }
http://192.168.99.100/ http://192.168.99.100/test1 http://192.168.99.100/test1/test2 などでアクセスし、PHPでパラメータを解釈できていることを確認する ■nginx+PHP7(Laravelの使用例) ※あらかじめ、URLルーティングありで http://192.168.99.100/ にアクセスできるところまで構築しておく phpコンテナで作業(nginxコンテナではPHPを使えない) $ docker exec -it php bash programming.txt の内容をもとに、Composerをインストール&動作確認 # composer さらに関連ツールをインストール # apt-get install git # apt-get install zip unzip 上記作業はDockerを再起動しても保持されていたが、いったん停止してから起動すると消えていた docker/php/Dockerfile に記載しておく方が良さそう(要検証) composerでLaravelをインストール create-projectを実行した際 「Do not run Composer as root/super user! See https://getcomposer.org/root for details」 と表示されるが、開発環境なので気にせず進めた(しばらく放置すると進んだ) # mkdir /var/www/vhosts # cd /var/www/vhosts # composer create-project --prefer-dist laravel/laravel blog インストール完了後、ドキュメントルートをLaravelのものに変更 C:\Users\Yamano\docker\laravel\docker\nginx\nginx.conf
root /var/www/html; ↓ root /var/www/vhosts/blog/public;
Dockerを再起動 # exit $ docker-compose restart 以下にアクセスすると、Laravelの画面が表示される http://192.168.99.100/ 以降は動作確認。要点のみ 日本語化などを試す $ docker exec -it php bash # cd ../blog # composer require laravel-ja/comja5 # vendor/bin/comja5 # vendor/bin/comja5 -c # vendor/bin/comja5 -f データベースへのアクセスを試す。あらかじめ、mysqlコンテナ側でデータベースを作成し、userがアクセスできるようにしておく $ docker exec -it mysql bash > CREATE DATABASE `laravel-blog` CHARACTER SET utf8mb4; > GRANT ALL PRIVILEGES ON `laravel-blog`.* TO user IDENTIFIED BY 'userpass'; phpコンテナからマイグレーションを試す $ docker exec -it php bash # php artisan migrate Laravelの基本機能は使えているみたい はじめてのLaravel5+Docker - Qiita https://qiita.com/kukimo/items/c044ad42fffac062e2f5 ■PHP+PostgreSQL C:\Users\refirio\docker\ 内に以下を作成するとする apache_php5_postgresql\html\index.php
<?php phpinfo() ?>
apache_php5_postgresql\docker\php\Dockerfile
FROM php:5.6-apache RUN apt-get update && apt-get install -y libpq-dev && docker-php-ext-install pdo pdo_pgsql mbstring
apache_php5_postgresql\docker\php\php.ini
date.timezone = Asia/Tokyo
apache_php5_postgresql\docker\postgresql\Dockerfile
FROM postgres:9.2
apache_php5_postgresql\docker\docker-compose.yml
version: '3' networks: compose_network: volumes: compose_postgresql_data: services: postgresql: container_name: postgresql volumes: - compose_postgresql_data:/var/lib/postgresql/data:rw environment: TZ: Asia/Tokyo POSTGRES_USER: user POSTGRES_PASSWORD: userpass POSTGRES_DB: test networks: - compose_network build: ./postgresql php: container_name: php volumes: - ./php/php.ini:/usr/local/etc/php/conf.d/php.ini:ro - ..:/var/www:rw environment: TZ: Asia/Tokyo ports: - 80:80 networks: - compose_network build: ./php
$ cd /c/Users/refirio/docker/apache_php5_postgresql/docker $ docker-compose build … ビルドする場合(構成を変更した場合など) $ docker-compose up -d … 起動 $ docker-compose down … 終了 $ docker exec -it php bash … phpコンテナのターミナルに接続する場合 $ docker exec -it postgresql bash … postgresqlコンテナのターミナルに接続する場合 ※PostgreSQLに直接接続する方法は要検証 http://192.168.99.100/ 以下のようなコードで、PHPからPostgreSQLに接続できる エラーになる場合、postgresqlコンテナの起動が完了していない可能性があるので待つ
<?php try { $pdo = new PDO( 'pgsql:dbname=test;host=postgresql', 'user', 'userpass' ); $stmt = $pdo->query('SELECT NOW() AS now;'); $data = $stmt->fetch(PDO::FETCH_ASSOC); echo "<p>" . $data['now'] . "</p>\n"; } catch (PDOException $e) { exit($e->getMessage()); } $pdo = null;
PHPからPostgreSQLに接続し、以下のコードで動作確認を行う CREATE TABLE test(no INT, name TEXT); INSERT INTO test VALUES(1, '山田タロウ'); INSERT INTO test VALUES(2, '山田ハナコ'); SELECT * FROM test; [備忘録]Dockerでapache+php+postgresql環境 - Qiita https://qiita.com/cyclon2joker/items/39e620d3d16fa1f6edf0 「postgresql-dev libpq-dev」は無くても動いた。付けておくべきかは要検証 portの指定は無くても動いた。付けておくべきかは要検証 ■nginx+Node.js C:\Users\refirio\docker\ 内に以下を作成するとする (common.css はテストで作成しているのみで、他から参照されていない。node.jsからMySQLへの接続は未確認) nginx_node\html\css\common.css
@charset "utf-8"; body { line-height: 1.4; margin: 0 auto; padding: 10px 20px; background-color: #FFFFFF; color: #000000; font-size: 80%; font-family: "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, "MS Pゴシック", sans-serif; }
nginx_node\docker\mysql\Dockerfile
FROM mysql:5.7
nginx_node\docker\mysql\my.cnf
[mysqld] character-set-server=utf8
nginx_node\docker\nginx\Dockerfile
FROM nginx:1.12
nginx_node\docker\nginx\nginx.conf
server { listen 80 default_server; server_name _; index index.php index.html; root /var/www/html; sendfile off; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_pass http://node:3000/; } location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) { } }
nginx_node\docker\node\Dockerfile
FROM node:8.4
nginx_node\docker\node\server.js
const http = require('http'); const port = 3000; http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World!\n'); }).listen(port); console.log('Server running at port ' + port + '.');
nginx_node\docker\docker-compose.yml
version: '3' networks: compose_network: volumes: compose_mysql_data: services: mysql: container_name: mysql volumes: - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro - compose_mysql_data:/var/lib/mysql:rw environment: TZ: Asia/Tokyo MYSQL_ROOT_PASSWORD: rootpass MYSQL_USER: user MYSQL_PASSWORD: userpass MYSQL_DATABASE: test networks: - compose_network build: ./mysql node: container_name: node volumes: - ./node:/var/nodeapp:rw command: node /var/nodeapp/server.js environment: TZ: Asia/Tokyo PORT: 3000 ports: - 3000:3000 networks: - compose_network build: ./node nginx: container_name: nginx volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/nginx.conf:ro - ..:/var/www:rw environment: TZ: Asia/Tokyo ports: - 80:80 networks: - compose_network build: ./nginx
起動方法 $ cd /c/Users/refirio/docker/nginx_node/docker $ docker-compose build $ docker-compose up -d http://192.168.99.100:3000/ ... node.js http://192.168.99.100/ ... nginx経由でnode.js ■Node.js(Docker Compose なしで単体起動する場合) dockerコンテナ上でnode.jsのサーバを起動し、ホスト端末からアクセスする - Qiita https://qiita.com/hotdrop_77/items/a2ca316c97ba4b748d9a C:\Users\refirio\docker\node\server.js
const http = require('http'); const port = 3000; http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World.\n'); }).listen(port); console.log('Server running at port ' + port + '.');
$ docker run -v /c/Users/refirio/docker/node:/var/nodeapp -p 3000:3000 -it node:8.4.0 /bin/bash # node /var/nodeapp/server.js http://192.168.99.100:3000/ でアクセスできる # node /var/nodeapp/server.js の代わりに以下も有効? # cd /var/nodeapp # node server.js & curl localhost:3000 # exit $ docker rm -f $(docker ps -a -q) 上記手順で起動できた 以下は本番環境での稼働手順の参考に AWS EC2でNodeを動作させる - Qiita https://qiita.com/oishihiroaki/items/bc663eb1282d87c46e97
■メモ
以下、引き続き検証メモ ■Node.js(Docker Compose なしで単体起動する場合) Node.js ウェブ・アプリの Docker 化 - Docker-docs-ja 1.11.0 ドキュメント http://docs.docker.jp/engine/examples/nodejs_web_app.html 起動したが、CentOS6のダウンロードからなので時間がかかる? Node.js用のイメージがあれば、その方が良さそう docker build -t refirio/centos-node-hello . docker images docker run -p 49160:8080 -d refirio/centos-node-hello curl -i 192.168.99.100:49160 http://192.168.99.100:49160/ 以下なども参考にして、再度構築を試したい 3000版ポートでnode.jsにアクセスできるようにして、 さらにnginx経由でポート指定無しでアクセスできるようにしてみる nginx無しで80版ポートにアクセスさせられるかも試したい Dockerでnginx+node.jsのSPA構成を試す - Qiita https://qiita.com/KeitaMoromizato/items/bfc3e22dae47211eff4f ■Ruby on Rails Docker + Ruby on Rails 5 のメモ - Qiita https://qiita.com/yuki-maru/items/3ee8e52cebbfc036c023 この手順でRailsを起動できた http://192.168.99.100:3000/ 次回からは以下で起動できる $ cd /c/Users/refirio/docker/compose_ruby $ docker-compose build $ docker-compose up -d $ docker-compose down docker-compose.yml を以下のように編集すると、http://192.168.99.100/ でアクセスできた
web: build: . command: bundle exec rails s -p 80 -b '0.0.0.0' volumes: - .:/myapp ports: - "80:80"
■疑問点とメモ ・dockerのgit管理 汎用的な環境というより、特定の案件の環境を管理するためのもの。だと思う それなら、プログラムと同じリポジドリで管理すれば良さそう ・fake s3 というものがあるらしい。ローカルでs3を試せるらしい LocalStack というのもよく使われるみたい ・上の手順で docker-compose build した場合、REPOSITORYもTAGも「<none>」のイメージが作られる?こういうもの?名前は指定できる? 以下で環境を立ち上げるとどうなるか試す http://koni.hateblo.jp/entry/2017/01/28/150522 ・apache_php5_mysql のファイル構成は以下も参考に再考する http://koni.hateblo.jp/entry/2017/01/28/150522 ・カスタムイメージを作成した場合、それも同梱するか つまりイメージ自体に手を加えたら、各々の環境でイメージをインポートしなおしてもらう Dockerは専用リポジトリで管理すべきか ・custom.cnf はこの名前でいいか と思ったが、公式の推奨手順みたい Dockerの公式MySQLイメージの使い方を徹底的に解説するよ - DQNEO起業日記 http://dqn.sakusakutto.jp/2015/10/docker_mysqld_tutorial.html ・複数人が同じ開発環境を再現する場合、イメージを更新した場合はどうするか 小さな更新なら Docker Compose や Dockerfile の CMD で実行すれば良さそう 大きな修正なら、Docker Hub などで管理しておく必要がある?でも Docker Hub のプライベートリポジトリは有料みたい イメージ自体をリポジトリに入れて、必要なときにインポートしてもらえばいいかも? docker - コマンドはdocker-compose.ymlとDockerfileのどちらで定義するほうがいい? - スタック・オーバーフロー https://ja.stackoverflow.com/questions/30495/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AFdocker-com... ・本番環境に使う場合、Amazon ECS を検証したい ・VagrantにDockerをインストールする方法。本番環境のCentOSなどにも応用できるかも http://tech.respect-pal.jp/docker_tutorial/ ■以下を参考に、上の構成を調整する ファイルの設定内容のを参考に https://qiita.com/osyoyu/items/a039b7e05abc6e97fb25 php.iniの配置方法の参考に https://github.com/koni/docker-php-nginx-mysql-memcached/ 復習に良い https://dev.classmethod.jp/tool/docker/develop-with-docker/ 参考に https://qiita.com/aild_arch_bfmv/items/d47caf37b79e855af95f ■引き続き参考にしたいページ Dockerのイメージ削除時のエラー「Error response from daemon: Conflict, cannot delete image」対策 - tsunokawaのはてなダイアリー http://tsunokawa.hatenablog.com/entry/2016/04/26/000507 そろそろDockerを始めないとやばいと思い始めたあなたへ | 東北ギーク http://tech.respect-pal.jp/docker_tutorial/ docker-composeを使うと複数コンテナの管理が便利に - Qiita https://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce docker-composeのvolumesで指定したホストのディレクトリがマウントされずハマった | Black Everyday Company https://kuroeveryday.blogspot.jp/2016/11/docker-compose-volumes.html Dockerで作る最強のWeb開発環境2017 - Qiita https://qiita.com/osyoyu/items/a039b7e05abc6e97fb25 Dockerで開発環境構築を10倍楽にしたはなし - KAYAC engineers' blog http://techblog.kayac.com/developing-with-docker-compose 社内用Docker環境をつくる〜Docker Registry on EC2とDocker for AWSについて〜 | Recruit Jobs TECHBLOG https://techblog.recruitjobs.net/development/docker-registry-on-ec2_and_docker-for-aws AWS ECSでDockerコンテナ管理入門(基本的な使い方、Blue/Green Deployment、AutoScalingなどいろいろ試してみた) - Qiita https://qiita.com/uzresk/items/6acc90e80b0a79b961ce Amazon EC2 Container Serviceで構築されたシステムでDockerコンテナを入れ替える | Developers.IO https://dev.classmethod.jp/cloud/aws/switch-docker-container-using-ecs/ Amazon EC2 Container Service コンソールチュートリアルをやってみた | Developers.IO https://dev.classmethod.jp/tool/docker/try-the-amazon-ecs-console-tutorial/