在使用Docker构建LAMP和Redis环境时,同时学习和记下各种用法
如果有任何不清楚的地方或错误,请指正,谢谢。
做的事情 (zuò de
php-fpm(php7.4)
centos7
apache2.4
mariadb
phpMyadmin
nodejs (with Gulp)
redis
-
- 上記の環境をDockerで構成する
-
- Dockerfileと各環境の設定ファイルを構成する
-
- docker-compose.ymlを構成する
-
- docker-composeで各環境のコンテナーを起動し内部状態を確認する
- Laravel上で、MariaDBとRedisのコネクションを確認する
全体源代码
参考了的文章和Github仓库
以下是原文的中文释义及翻译链接:
1. Qiita上的链接:https://qiita.com/temori1919/items/487d68a19ca1de1a63c8
2. Github上的链接:https://github.com/temori1919/docker-lamp
请注意,原文链接提供了两个不同的网页链接,因此上述翻译中包含了两个独立的网页链接。
基本参考资料
Dockerfile的参考资料
https://docs.docker.com/engine/reference/builder/
Docker Compose参考指南
https://docs.docker.com/compose/compose-file/
1. Docker 架构
1) 网页架构(CentOS & Apache)
公式DockerHub网址:https://hub.docker.com/_/centos。
建筑的构造
docker-lamp/
`-- web
| |-- Dockerfile
| |-- docker.conf # Copy to /etc/httpd/conf.d
| `-- logs # for apache log
网站/容器配置文件
Apache的配置文件。
主要用于定义虚拟主机相关的设置。
由于将php处理交给了php-fpm,因此需要进行代理设置。
# rootdomain
<VirtualHost *:443>
...
ServerName lamplocal.me
VirtualDocumentRoot /var/www/html/home_root/public
...
</VirtualHost>
# subdomain. phpの動作が可能
<VirtualHost *:443>
...
ServerName lamplocal.me
ServerAlias *.lamplocal.me
VirtualDocumentRoot /var/www/html/home_sub/%1/public
<FilesMatch \.php$>
SetHandler "proxy:fcgi://php:9000"
</FilesMatch>
...
</VirtualHost>
网络/ Docker 文件
安装Apache 2.4
创建任意SSL认证书
将docker.conf复制到容器中
# centos:7のイメージを元にコンテナーを作成
FROM centos:7
# 指定のコマンド実行
RUN ...
# ホストシステムからコンテナーにファイルをコピー
COPY docker.conf /etc/httpd/conf.d/docker.conf
# コンテナー起動時に実行するコマンド
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
2) PHP架构(PHP-FPM 7.4)
Docker Hub 的官方网址是 https://hub.docker.com/_/php
构造
docker-lamp/
|-- php
| |-- Dockerfile
| |-- logs # For xdebug.log
| `-- xdebug.ini # Copy to /usr/local/etc/php/conf.d
xdebug.ini 调试配置文件
除了设置xdebug的基本配置外,还要设置xdebug.log文件的保存。
xdebug.remote_log=/var/log/xdebug/xdebug.log
Dockerfile的释义是什么?
# php:7.4-fpmのイメージを元にコンテナーを作成
FROM php:7.4-fpm
# phpのイメージで提供するユティリティの`docker-php-ext-install`,`docker-php-ext-enable`でPHP EXTENSTIONを設置
RUN pecl install xdebug-2.8.1 \
&& docker-php-ext-enable xdebug \
&& docker-php-ext-install bcmath pdo_mysql
# ホストシステムからコンテナーにファイルをコピー
COPY ./xdebug.ini $PHP_INI_DIR/conf.d/
# 外部イメージから、コンテナーにファイルをコピー
# 公式composerイメージから、phpコンテナーにcomposerを設置
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
3) MariaDB的组成
官方 DockerHub
https://hub.docker.com/_/mariadb
构造
docker-lamp/
|-- db
| |-- Dockerfile
| |-- logs # For slow query log
| `-- my.cnf # Copy to /etc/mysql/conf.d
我的.cnf
参考文章
https://qiita.com/mamy1326/items/9c5eaee3c986cff65a55
字符集、慢查询日志、等待超时、以及其他与InnoDB相关的设置
default-character-set=utf8mb4
character-set-server=utf8mb4
# slow query log
slow_query_log=true
slow_query_log-file=/var/log/mysql/mysql-slow.sql
long_query_time=1
# コネクションタイムアウト時間
wait_timeout=28800
Dockerfile => Docker文件
FROM mariadb
COPY my.cnf /etc/mysql/conf.d/my.cnf
4) Redis的架构设计
公式 DockerHub
https://hub.docker.com/_/redis
形成
docker-lamp/
|-- redis
| |-- Dockerfile
| |-- data # for redis data
| |-- logs # for redis log
| `-- redis.conf # Copy to /usr/local/etc/redis/redis.conf
redis配置文件
Redis服务器的配置
参考链接:
https://qiita.com/uryyyyyyy/items/9ccadcccf7f7060d544a
中文翻译:
请参考以下链接:
https://qiita.com/uryyyyyyy/items/9ccadcccf7f7060d544a
请设置好Redis以记录日志。
logfile "/var/log/redis/redis-server.log"
Dockerfile → Dockerfile
FROM redis
RUN mkdir /var/log/redis
COPY ./redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
5) 节点的构成
公式 DockerHub:https://hub.docker.com/_/node
形式。
|-- node
| `-- Dockerfile
Docker文件
FROM node:latest
RUN npm install -g gulp@3.9.1 gulp-phpunit config && \
npm install gulp@3.9.1 gulp-phpunit config && \
apt-get -y update && \
apt-get -y upgrade && \
apt-get -y install ca-certificates apt-transport-https && \
wget -q https://packages.sury.org/php/apt.gpg -O- | apt-key add - && \
echo "deb https://packages.sury.org/php/ stretch main" | tee /etc/apt/sources.list.d/php.list && \
apt-get -y update && \
apt-get -y install php7.2 php7.2-cli php7.2-common php7.2-opcache php7.2-curl php7.2-mbstring php7.2-mysql php7.2-zip php7.2-xml
WORKDIR /var/www/html
2. 文件根目录的组成
docker-lamp/
|-- code # -- Mounted on /var/www/html
| |-- config
| | `-- default.json.example
| |-- gulpfile.js
| |-- home_root # -- root home
| | `-- public # documentroot of lamplocal.jp
| | `-- index.html # can run only static contents.
| |-- home_sub # -- virtual host home
| | `-- test # you can add directory & use by subdomain
| | `-- public # documentroot of test.lamplocal.jp
| | `-- index.php # can run php script
| `-- nodeapp
3. Docker Compose配置文件
version: '3.7'
services:
# centos7 apache2.4.*(http2)
web:
build: ./web
container_name: lamp-web
ports:
- '443:443'
volumes:
- ./code:/var/www/html
- ./web/logs:/var/log/httpd
- cert:/etc/ssl/private
restart: always
env_file: .env
# php-fpm 7.4
php:
build: ./php
container_name: lamp-php
ports:
- '9000'
volumes:
- ./code:/var/www/html
- ./php/logs:/var/log/xdebug
restart: always
env_file: .env
# mariaDB
db:
build: ./db
container_name: lamp-db
restart: always
env_file: .env
ports:
- 3306:3306
volumes:
- ./db/logs:/var/log/mysql
- datastore:/var/lib/mysql
# phpMyadmin
phpmyadmin:
container_name: lamp-phpmyadmin
image: phpmyadmin/phpmyadmin
env_file: .env
ports:
- 8080:80
depends_on:
- db
# node js (include gulp)
node:
build: ./node
container_name: lamp-node
restart: always
tty: true
environment:
- NODE_ENV=production
ports:
- '3000:3000'
volumes:
- ./code:/var/www/html
depends_on:
- web
# redis server
redis:
build: ./redis
container_name: lamp-redis
restart: always
ports:
- '6379:6379'
volumes:
- "./redis/data:/data"
- "./redis/logs:/var/log/redis"
volumes:
cert:
datastore:
4. 检验行动
请参考以下使用alias的执行命令:execute :
这里可以参考alias设置的内容和各个命令的解释。
https://qiita.com/genie-oh/items/266857d788a85e2da8f9
1) 建设 shè)
$ al docki
execute : docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
$ al dockcb
execute : docker-compose build
phpmyadmin uses an image, skipping
Building web
...
...
Successfully built 43bb05ec0f39
Successfully tagged docker-lamp_redis:latest
$ al docki
execute : docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-lamp_redis latest 43bb05ec0f39 About a minute ago 104MB
docker-lamp_node latest 1cffc83ebe6f About a minute ago 1.06GB
docker-lamp_db latest e112492cc9c2 4 minutes ago 407MB
docker-lamp_php latest 5a3452fcbf58 4 minutes ago 671MB
docker-lamp_web latest 9af33e8e4219 9 minutes ago 540MB
...
2) 运行容器
$ al dockcu
execute : docker-compose up -d
...
Status: Downloaded newer image for phpmyadmin/phpmyadmin:latest
Creating lamp-web ... done
Creating lamp-php ... done
Creating lamp-redis ... done
Creating lamp-db ... done
Creating lamp-node ... done
Creating lamp-phpmyadmin ... done
$ al dockps
execute : docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea93226c6b49 phpmyadmin/phpmyadmin "/docker-entrypoint.…" 17 seconds ago Up 14 seconds 0.0.0.0:8080->80/tcp lamp-phpmyadmin
52a68fde7bdd docker-lamp_node "docker-entrypoint.s…" 17 seconds ago Up 14 seconds 0.0.0.0:3000->3000/tcp lamp-node
13e52a01700e docker-lamp_php "docker-php-entrypoi…" 19 seconds ago Up 16 seconds 0.0.0.0:32837->9000/tcp lamp-php
43eb81b6410e docker-lamp_web "/usr/sbin/httpd -DF…" 19 seconds ago Up 15 seconds 0.0.0.0:443->443/tcp lamp-web
473ffaf3439b docker-lamp_redis "docker-entrypoint.s…" 19 seconds ago Up 15 seconds 0.0.0.0:6379->6379/tcp lamp-redis
ae80a8fd00c6 docker-lamp_db "docker-entrypoint.s…" 19 seconds ago Up 15 seconds 0.0.0.0:3306->3306/tcp lamp-db
3)浏览网页
$ curl -k https://lamplocal.me --silent | grep "<title>"
<title>Hello World</title>
$ curl -k https://test.lamplocal.me --silent | grep "<title>"
<title>PHP 7.4.7 - phpinfo()</title><meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" /></head>
检查容器中每个软件包的版本。
$ al dockeit lamp-web httpd -v
execute : docker exec -it lamp-web httpd -v
Server version: Apache/2.4.41 (IUS)
Server built: Aug 25 2019 19:41:04
$ al dockeit lamp-php php -v
execute : docker exec -it lamp-php php -v
PHP 7.4.7 (cli) (built: Jun 11 2020 18:41:17) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Xdebug v2.8.1, Copyright (c) 2002-2019, by Derick Rethans
$ al dockeit lamp-db mysql --version
execute : docker exec -it lamp-db mysql --version
mysql Ver 15.1 Distrib 10.5.4-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
$ al dockeit lamp-redis redis-server -v
execute : docker exec -it lamp-redis redis-server -v
Redis server v=6.0.5 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=db63ea56716d515f
$ al dockeit lamp-node node -v
execute : docker exec -it lamp-node node -v
v14.5.0
5)下降的容器
$ al dockcd
execute : docker-compose down
Stopping lamp-phpmyadmin ... done
Stopping lamp-node ... done
Stopping lamp-php ... done
Stopping lamp-web ... done
Stopping lamp-redis ... done
Stopping lamp-db ... done
Removing lamp-phpmyadmin ... done
Removing lamp-node ... done
Removing lamp-php ... done
Removing lamp-web ... done
Removing lamp-redis ... done
Removing lamp-db ... done
Removing network docker-lamp_default
只执行特定的容器
$ dockcu php db
Creating network "docker-lamp_default" with the default driver
Creating lamp-php ... done
Creating lamp-db ... done
7) 確認 php、mariadb、redis 的連携情況。
安装Laravel并确认每个连接。
# docker-lamp\code\home_sub\cgi\.env
DB_CONNECTION=mysql
DB_HOST=lamp-db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=rootpw
REDIS_HOST=lamp-redis
REDIS_PASSWORD=null
REDIS_PORT=6379
# docker-lamp\code\home_sub\cgi\app\Http\Controllers\TestController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Facades\DB;
class TestController extends Controller
{
public function index ()
{
$redisResult = Redis::connection()->ping('redis pong');
$dbResult = DB::table('test')->get();
return view('test/index', compact('redisResult', 'dbResult'));
}
}
$ curl -k https://cgi.lamplocal.me/test
redisResult : redis pong
dbResult : [{"id":0,"name":"abc"}]
結尾的話
-
- 違うプラットフォームの開発完了などをDockerでコード化しておくと、いろんな開発環境に柔軟に対処できるのはいい。
-
- PythonやJava、Full Stack Javascript環境も構成してコード化しておきたい。
- 機会があれば、Dockerイメージのサービスデプロイ&運用も勉強したい。(Kubernate, AWS ECS)