PHP Slim环境配置(3)Redis、MySQL和PostgreSQL

使用 PHP Slim 构建环境(3) 集成 Redis、MySQL 和 PostgreSQL。

简介

上次,我把简单的Hello, World网站进行了SSL加密,并且通过Xdebug使其可以进行调试。

我們這次將在Docker中添加常用的redis、MySQL和PostgreSQL。然後,我們將使用slim框架來實際訪問它們。(4)

Docker-compose (用于定义和运行多个 Docker 容器的工具)。

在Docker Compose文件中,将添加用于Redis、MySQL和PostgreSQL的描述。对于每个服务,我们使用ports指定了可以从主机访问的端口,但如果存在安全上的担忧,请将这些描述移除。另外,通过volumes将数据持久化。

version: '3'

services:
  web_front:
    build:
      context: ./web_front
    links:
      - web_hoge
    ports:
      - "80:3128"
      - "443:8443"
    volumes:
      - ../certs:/etc/certs:ro
    container_name: web_front
    networks:
      - local_net

  web_hoge:
    build:
      context: ./web_hoge
      args:
        - environment=local
    environment:
      XDEBUG_CONFIG: "remote_host=172.17.0.1"
      PHP_IDE_CONFIG: "serverName=hoge.localhost"
    domainname: localhost
    volumes:
      - ../src/hoge:/var/www/hoge
      - ../src/vendor:/var/www/vendor
    container_name: web_hoge
    networks:
      - local_net

  redis:
    build:
      context: ./redis
    volumes:
      - redis-data:/var/lib/redis
    ports:
      - "16379:6379"
    sysctls:
      - net.core.somaxconn=1024
    container_name: redis
    networks:
      - local_net

  mysql:
    build:
      context: ./mysql
    volumes:
      - mysql-data:/var/lib/mysql
    ports:
      - "13306:3306"
    container_name: mysql
    networks:
      - local_net

  postgresql:
    build:
      context: ./postgresql
    volumes:
      - postgresql-data:/var/lib/postgresql
    ports:
      - "15432:5432"
    container_name: postgresql
    networks:
      - local_net

volumes:
  redis-data:
  mysql-data:
  postgresql-data:

networks:
  local_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/24

MySQL 是一种广泛使用的关系型数据库管理系统。

我会创建一个用于MySQL的Docker文件和用于初始导入的SQL文件(虽然实际使用的是MariaDB)。

FROM mariadb:10.4.8

ENV MYSQL_ROOT_PASSWORD hogehoge
ENV MYSQL_ROOT_HOST 172.28.0.1

ENV MYSQL_DATABASE userdb
ENV MYSQL_USER scott
ENV MYSQL_PASSWORD tiger

COPY init.d/* /docker-entrypoint-initdb.d/

EXPOSE 3306

CMD ["--sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", \
 "--skip-character-set-client-handshake", \
 "--default-time-zone=+00:00"]

如果将扩展名为sh或sql的文件放置在init.d目录下,则在数据库初始化时会被执行。

alter database default character set utf8mb4;
create table player (
  player_id int unsigned not null auto_increment,
  player_name varchar(255) not null,
  constraint player_pk primary key (player_id)
);

PostgreSQL 请简洁精准地翻译前来。

我会创建与MySQL类似的PostgreSQL配置。

FROM postgres:10.10

ENV POSTGRES_PASSWORD hogehoge
ENV POSTGRES_USER root
ENV POSTGRES_DB logdb

COPY init.d/* /docker-entrypoint-initdb.d/

EXPOSE 5432

与MySQL类似,可以通过将文件放置在init.d目录中来执行初始化时的命令。

create table if not exists player_created_log (
    player_id int,
    created_at timestamp
);

Redis 是一种开源的高性能键值对存储数据库。

创建Redis配置。

FROM redis:5.0.5

#configuration
COPY redis.conf /usr/local/etc/redis/redis.conf

EXPOSE 6379

#command
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

您可以指定Redis的配置文件。

# redis.conf
...(ここに設定を書く)...

确认

我会检查每个操作。使用docker-compose up -d命令启动每个组件。

MySql

我尝试使用MySQL客户端进行连接。

$ sudo apt install mariadb-client  # mysqlクライアント未インストールの場合
$ mysql --user=scott --password=tiger --port=13306 --host=127.0.0.1 --database=userdb
MariaDB [userdb]> select * from player;
Empty set (0.000 sec)

执行 “docker volume prune” 和 “docker-compose up” 后,可能会出现无法成功连接的情况,但具体原因我不太清楚…

运行psql程序

我将使用psql进行连接并进行确认。

$ sudo apt install postgresql-client-10   # psql未インストールの場合
$ psql --username=root --port=15432 --host=127.0.0.1 -W logdb
Password for user root:

logdb=# select * from player_created_log;
 player_id | created_at
---------+------------
(0 rows)

Redis (中文: 雷迪斯)

我会使用redis-cli进行连接和确认。

$ sudo apt install redis-tools    # redis-cli未インストールの場合
$ redis-cli -p 16379
127.0.0.1:16379> get hoge
(nil)
127.0.0.1:16379> set hoge 1
OK
127.0.0.1:16379> get hoge
"1"
127.0.0.1:16379> del hoge
(integer) 1
127.0.0.1:16379> get hoge
(nil)

初始化Docker卷

另外,MySQL、PostgreSQL的数据库初始化命令仅在首次启动时执行。如果想重新初始化,只需删除卷即可,但执行以下命令可以安全地删除(删除需自行负责,不对后果负责)。

$ docker-compose down
$ docker volume prune

更改历史

    2019/09/24

由于MySQL和Postgresql中术语”Player”和”User”不一致,所以将其统一为”Player”。

bannerAds