基于 PostgreSQL 的 PHP 项目容器化

 Technique  comment

搭建基于 PostgreSQL PHP NGINX 的 Docker 容器化架构

部署

拉取镜像

# docker pull redis:5-alpine
# docker pull nginx:stable-alpine-perl
# docker pull php:fpm-alpine
# docker pull postgres:alpine
# docker pull memcached:alpine

小贴士:使用全部 Alpine 基础镜像的镜像。

创建私网

# docker network create backend

创建容器

创建 PostgreSQL 容器

# docker run --name mypdb --memory=512m --restart=always --network=backend \
-p 127.0.0.1:5432:5432 \
-v /usr/mystack/data:/var/lib/postgresql/data \
-e POSTGRES_INITDB_ARGS="--data-checksums" \
-e POSTGRES_PASSWORD=y6S9EbZj6N8w872CzkOFf -d postgres:alpine

创建 PHP 容器

# docker run --name myphp --memory=512m --restart=always --network=backend \
-v /usr/mystack/php/php.ini:/usr/local/etc/php/php.ini:ro \
-v /usr/mystack/www:/var/www -d php:fpm-alpine

创建 NGINX 容器

# docker run --name myngx --memory=64m --restart=always --network=backend \
-p 80:80 -p 443:443 \
-v /usr/mystack/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /usr/mystack/nginx/conf.d:/etc/nginx/conf.d \
-v /usr/mystack/nginx/logs.d:/etc/nginx/logs.d \
-v /usr/mystack/nginx/cert.d:/etc/nginx/cert.d \
-v /usr/mystack/www:/var/www -d nginx:stable-alpine-perl

创建 Memcached 容器

# docker run --name mymcd --memory=64m --restart=always --network=backend \
-p 127.0.0.1:11211:11211 \
-d memcached:alpine

定制容器

初始情况下的官方 PHP 容器不支持 PostgreSQL ,需要定制 PHP 容器。

# docker exec -it myphp /bin/sh

安装额外组件(PostgreSQL)

# apk add --no-cache postgresql-dev postgresql-libs
# docker-php-ext-install pdo_pgsql pdo opcache
# apk del --no-cache postgresql-dev

安装额外组件(GD XML XMLRPC等)

# apk add --no-cache freetype libpng libjpeg-turbo freetype-dev libpng-dev libjpeg-turbo-dev
# docker-php-ext-install gd xml xmlrpc
# apk del --no-cache freetype-dev libpng-dev libjpeg-turbo-dev
# apk add --no-cache autoconf build-base
# pecl install igbinary
# docker-php-ext-enable igbinary
# pecl install msgpack
# docker-php-ext-enable msgpack

安装额外组件(Memcached)

# apk add --no-cache libmemcached \
    libmemcached-libs \
    libmemcached-dev \
    libevent \
    libevent-dev \
    zlib-dev \
    build-base \
    autoconf

# pecl install memcached
# docker-php-ext-enable memcached

# apk del --no-cache libmemcached \
    libmemcached-dev \
    libevent-dev \
    zlib-dev \
    build-base \
    autoconf

导入数据

创建临时容器登陆数据库

# docker run -it --rm --network backend postgres:alpine psql -h mypdb -U postgres

创建角色、用户、数据库,并授权

postgres=# CREATE USER typecho WITH PASSWORD 'y6S9EbZj6N8w872CzkOFf';
postgres=# CREATE DATABASE typecho OWNER typecho;
postgres=# GRANT ALL PRIVILEGES ON DATABASE typecho TO typecho;

定时备份

容器化数据库导出

# docker exec -t mypdb pg_dumpall -c -U postgres > $DUMPPATH/dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

附录

参考链接

回复