■その他の環境構築例
■nginx+PHP7(Laravelの使用例)
※Laradockによる開発環境構築は「Laradockによる開発環境構築」を参照
※あらかじめ、nginx+PHP7でURLルーティングありで
http://127.0.0.1/ にアクセスできるところまで構築しておく
phpコンテナで作業(nginxコンテナではPHPを使えない)
$ docker container 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\Refirio\docker\laravel\docker\nginx\nginx.conf
root /var/www/html;
↓
root /var/www/vhosts/blog/public;
Dockerを再起動
# exit
$ docker-compose restart
以下にアクセスすると、Laravelの画面が表示される
http://127.0.0.1/
以降は動作確認。要点のみ
日本語化などを試す
$ docker container 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 container exec -it mysql bash
> CREATE DATABASE `laravel-blog` CHARACTER SET utf8mb4;
> GRANT ALL PRIVILEGES ON `laravel-blog`.* TO user IDENTIFIED BY 'userpass';
phpコンテナからマイグレーションを試す
$ docker container exec -it php bash
# php artisan migrate
Laravelの基本機能は使えているみたい
はじめてのLaravel5+Docker - Qiita
https://qiita.com/kukimo/items/c044ad42fffac062e2f5
以下も参考になりそう
最強のLaravel開発環境をDockerを使って構築する【新編集版】 - Qiita
https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4
■PHP+PostgreSQL
C:\Users\refirio\docker\ 内に以下を作成するとする
apache_php8_postgresql\html\index.php
<?php phpinfo() ?>
apache_php8_postgresql\docker\php\Dockerfile
FROM php:8.1-apache
RUN apt-get update
RUN apt-get install -y libonig-dev libpq-dev
RUN docker-php-ext-install pdo_pgsql mbstring
apache_php8_postgresql\docker\php\php.ini
date.timezone = Asia/Tokyo
apache_php8_postgresql\docker\postgresql\Dockerfile
FROM postgres:9.2
apache_php8_postgresql\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: ./docker/postgresql
php:
container_name: php
volumes:
- ./docker/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: ./docker/php
$ cd docker/apache_php8_postgresql
$ docker-compose build
… ビルドする場合(構成を変更した場合など)
$ docker-compose up -d
… 起動
$ docker-compose down
… 終了
$ docker container exec -it php bash
… phpコンテナのターミナルに接続する場合
$ docker container exec -it postgresql bash
… postgresqlコンテナのターミナルに接続する場合
root@bca889e7662a:/# psql -U user test
… PostgreSQLに接続(「psql -l」だと「role "root" does not exist」というエラーになる)
psql (9.2.23)
Type "help" for help.
test=# CREATE TABLE test(no INT, name TEXT);
test=# INSERT INTO test VALUES(1, 'Taro');
test=# INSERT INTO test VALUES(2, 'Hanako');
test=# SELECT * FROM test LIMIT 100;
no | name
----+--------
1 | Taro
2 | Hanako
(2 rows)
test=# \q
http://127.0.0.1/
以下のようなコードで、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";
$pdo = null;
} catch (PDOException $e) {
exit($e->getMessage());
}
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
■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-compose.yml
version: '3'
networks:
compose_network:
volumes:
compose_mysql_data:
services:
mysql:
container_name: mysql
volumes:
- ./docker/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: ./docker/mysql
node:
container_name: node
volumes:
- ./docker/node:/var/nodeapp:rw
command: node /var/nodeapp/server.js
environment:
TZ: Asia/Tokyo
PORT: 3000
ports:
- 3000:3000
networks:
- compose_network
build: ./docker/node
nginx:
container_name: nginx
volumes:
- ./docker/nginx/nginx.conf:/etc/nginx/conf.d/nginx.conf:ro
- ./:/var/www:rw
environment:
TZ: Asia/Tokyo
ports:
- 80:80
networks:
- compose_network
build: ./docker/nginx
起動方法
$ cd docker/nginx_node/docker
$ docker-compose build
$ docker-compose up -d
http://127.0.0.1:3000/ ... node.js
http://127.0.0.1/ ... nginx経由でnode.js
■Node.js(Docker Compose なしで単体起動する場合)
dockerコンテナ上でnode.jsのサーバを起動し、ホスト端末からアクセスする - Qiita
https://qiita.com/hotdrop_77/items/a2ca316c97ba4b748d9a
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 container run -v docker/node:/var/nodeapp -p 3000:3000 -it node:8.4.0 /bin/bash
# node /var/nodeapp/server.js
http://127.0.0.1:3000/ でアクセスできる
# node /var/nodeapp/server.js
の代わりに以下も有効?
# cd /var/nodeapp
# node server.js &
curl localhost:3000
# exit
$ docker container rm -f $(docker container ls -a -q)
上記手順で起動できた
以下は本番環境での稼働手順の参考に
AWS EC2でNodeを動作させる - Qiita
https://qiita.com/oishihiroaki/items/bc663eb1282d87c46e97