在使用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)
广告
将在 10 秒后关闭
bannerAds