本地Docker环境的说明

这篇文章是关于 SamZap Advent Calendar 2020 #1 的 12/5 文章。

我是森本,在Samzap从事智能手机游戏的企划与运营业务。

在Samzap中,有许多项目使用Docker构建本地环境。作为一个例子,我想介绍我参与的项目的本地环境。我们使用的Docker容器如下:

    • nginx

 

    • php-fpm

 

    • MySQL

 

    • memcache

 

    • Redis

 

    phpmyadmin

另外,关于DB迁移方面

    phinx migration

使用了

文件夹结构


local/
 ├ application/
 │ ├ mysql/
 │ │ ├ 1_initial_mysql.sh
 │ │ └ 2_initial_mysql.sql
 │ └ web/
 │   └ initial_web.sh
 ├ docker/
 │ ├ gatling/
 │ │ └ Dockerfile
 │ ├ misc/
 │ │ └ data/
 │ │   └ DB実態
 │ ├ nginx/
 │ │ ├ 鍵回り省略
 │ │ ├ Dockerfile
 │ │ ├ fastcgi.conf
 │ │ ├ nginx.conf
 │ │ └ server.conf
 │ ├ php-fpm/
 │ │ ├ Dockerfile
 │ │ ├ php.ini
 │ │ └ www.conf
 │ └ docker-compose.yml
 ├ dump/
 │ └ 移行前のDB,テーブル定義
 ├ mysql/
 │ └ custom.cnf
 └ phpmyadmin/
   ├ conf/
   │ └ config.user.inc.php
   └ sessions/
     └ 省略

本地/应用

本地/应用程序/MySQL

docker の MySQL image では /docker-entrypoint-initdb.d/ というディレクトリ内に初期化用の SQL やスクリプトを置くことで、最初に image を起動したときにデータの初期化を自動的に行う仕組みがあります

    1_initial_mysql.sh
cd /dump/
zcat 過去DB_table.gz | mysql -uroot -p*****
...

phinx 在导入之前正在创建数据库和表。

    2_initial_mysql.sql
grant all on *.* to user1@'%' identified by '*****';
grant all on *.* to user2@'%' identified by '*****';
...
insert ...

我正在创建MySQL用户和管理界面初始化数据。

执行顺序是按照文件名的顺序排列的,所以文件名前面有”1_”、”2_”的标识。

本地/应用程序/网页

    initial_web.sh

cd .../PhinxMigration
if [ ! -e vendor ]; then
    リンク作成(省略)
    cd .../PhinxMigration
    composer install
else
    until mysqladmin ping -h mysql --silent; do
        echo ""
        echo 'waiting for mysqld to be connectable...'
        echo ""
        sleep 3
    done
    cd .../phinx_migration/
    make migrate ENV=localhost
fi

web 起動時

初回起動の場合
(という切り分けができなかったので、composer install に実行時に作成される vender フォルダがない場合)
cd …/PhinxMigration
composer install 実行

初回起動ではない場合
(vender フォルダがある場合)
mysql サーバが立ち上がるまでループ
DB マイグレーション同期実行

を実行しています

docker 起動時(=web 起動時) に、毎回、DB マイグレーション同期実行 するようにしています

在执行 composer install 后,仍有一个任务需要完成:执行数据库迁移的同步操作(删除 else)。

本地/容器

local/application/nginx/

    Dockerfile
FROM nginx

ADD nginx.conf /etc/nginx/nginx.conf
ADD fastcgi.conf /etc/nginx/fastcgi.conf
ADD server.conf /etc/nginx/conf.d/default.conf
ADD localhost.key /etc/ssl/private/localhost.key
ADD localhost.crt /etc/ssl/certs/localhost.crt
ADD dhparam.pem /etc/nginx/ssl/dhparam.pem

将各个配置文件添加到nginx镜像中。

    fastcgi.conf
fastcgi_param   QUERY_STRING            $query_string;
fastcgi_param   REQUEST_METHOD          $request_method;
...

一般的な検索結果サイトから取得したもの

プロジェクトで使用しているものを追加しています

    nginx.conf
user            www-data;
pid     /var/run/nginx.pid;

# coreモジュールの設定

http{
    # httpモジュールの設定
}
...

一般的な検索結果サイトから取得したもの

ソケット通信に変更しています
user www-data;
pid /var/run/nginx.pid;

    server.conf
server {
    listen 80;
    ...
}
server {
    listen 443 ssl http2;
    ...

    location / {
        # other
        try_files $uri $uri/ /index.php?$args;
    }
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php7-fpm.sock;
        fastcgi_index index.php;
        include      fastcgi.conf;
    }

    ssl_certificate             /etc/ssl/certs/localhost.crt;
    ssl_certificate_key         /etc/ssl/private/localhost.key;
    ...
}
server {
    listen 80;
    server_name ~^(?<user>.+)\.local\.jp$;

    root       /var/www/$user/;
    ...
}

一般的な検索結果サイトから取得したもの

プロジェクトで使用している設定(記述変更、削除しています)

ソケット通信に変更しています
fastcgi_pass unix:/var/run/php7-fpm.sock;

此外,还为在本地克隆了多个源代码库的人提供了以下选项:


test.local.jp
にアクセスすると
/var/www/test/
以下のソースを見に行くようにしています

本地/应用程序/PHP-FPM

    Dockerfile
FROM php:7.4-fpm

ADD php.ini /usr/local/etc/php/conf.d/php.ini
ADD www.conf /usr/local/etc/php-fpm.d/zzz-www.conf

RUN apt-get update && apt-get install -y libmcrypt-dev mariadb-client bc zlib1g-dev libmemcached-dev procps curl unzip git libonig-dev \
  && docker-php-ext-install pdo_mysql mysqli mbstring opcache bcmath

RUN pecl install memcached-3.1.3 \
    && docker-php-ext-enable memcached

RUN mkdir -p /usr/src/php/ext/redis \
    && curl -L https://github.com/phpredis/phpredis/archive/5.1.1.tar.gz | tar xvz -C /usr/src/php/ext/redis --strip 1 \
    && echo 'redis' >> /usr/src/php-available-exts \
    && docker-php-ext-install redis

RUN pecl install timecop-beta \
    && docker-php-ext-enable timecop

RUN pecl install apcu \
  && docker-php-ext-enable apcu

# install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

ソケット通信の設定ファイルは、「zzz-」をつける必要があります
PHPの公式DockerイメージでUNIXソケット通信しようとして罠にハマるの巻
ADD www.conf /usr/local/etc/php-fpm.d/zzz-www.conf

    www.conf

套接字周围的设置等。

[www]
listen = /var/run/php7-fpm.sock
listen.owner = www-data
listen.group = www-data
request_terminate_timeout = 30s

本地/应用程序/ Docker-compose.yml

version: '3.7'

volumes:
  php_sockert:

services:
  memcached:
    image: memcached
    container_name: memcached

  redis:
    image: redis
    container_name: redis

  mysql:
    image: mysql:5.7.31
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --max_allowed_packet=32M
    environment:
      MYSQL_ROOT_PASSWORD: ********
      MYSQL_DATABASE: mysql_database
      MYSQL_USER: user
      MYSQL_PASSWORD: ********
      TZ: "Asia/Tokyo"
    ports:
      - "3306:3306"
    volumes:
      - ../application/mysql/:/docker-entrypoint-initdb.d/
      - ../dump/:/dump/
      - ../mysql/:/etc/mysql/conf.d/
      - ./misc/data:/var/lib/mysql
    container_name: mysql

  nginx:
    build: ./nginx
    ports:
      - "80:80"
      - "443:443"
    environment:
      TZ: "Asia/Tokyo"
    volumes:
      - ../../local/:/var/www/local
      # local複数環境用     - ../../test/:/var/www/test
      - php_sockert:/var/run
    depends_on:
      - web
    container_name: nginx

  web:
    build: ./php-fpm
    tty: true
    privileged: true
    ulimits:
      core: -1
    volumes:
      - ../application/web/initial_web.sh:/tmp/initial_web.sh
      - ../../local/:/var/www/local
      # local複数環境用     - ../../test/:/var/www/test
      - php_sockert:/var/run
    depends_on:
      - mysql
      - memcached
      - redis
      - rabbitmq
    environment:
      DATABASE_HOST: 'mysql'
      DATABASE_NAME: 'mysql_database'
      DATABASE_USER: 'user'
      DATABASE_PASSWORD: '********'
      TZ: "Asia/Tokyo"
    command: bash -c "bash /tmp/initial_web.sh && php-fpm"
    container_name: web

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=********
    links:
      - mysql
    ports:
      - 8080:80
    volumes:
      - ../phpmyadmin/sessions:/sessions
      - ../phpmyadmin/conf/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php

图像:memcached
这是通过Docker Hub获取的图像

镜像:mysql:5.7.31
您可以使用冒号进行版本指定。

nginx:
build: ./nginx
のように記述すると、./nginx/Dockerfile を読みにいきます
Dockerfile 内で image を指定したり
command を指定したりしています

容器名称:memcached
“etc/hosts”文件中将添加上述名称

– 主机的 /misc/data 及其子目录与虚拟机的 /var/lib/mysql 及其子目录共享。

如果在mysql中没有共享主机和客户端的上述数据,那么关闭docker中的mysql将会导致数据被删除。

卷:
php_socket: 卷:

nginx:
卷:
– php_sockert:/var/run

网站和web的”/var/run”是共享的,使用了socket。

command:
イメージが作られた時点で、記述内容が実行されます
ports:
ホストのポートとゲストのポートが結びつきます

nginx:depends_on:
– web
nginx コンテナからwebコンテナへ通信するため web 起動してから、nginx 起動するように設定

最终

我介绍了我参与的项目中的本地环境。

将来

    • 本文中に記述した問題の改修

 

    jenkins 導入

などを改修、導入できればと思っています!!

明天是@shirai_suguru。请期待!!

山姆扎普的圣诞日历由于人数关系有两个版本。请多多关照!山姆扎普2020年第二版圣诞日历 – Qiita

广告
将在 10 秒后关闭
bannerAds