初探Docker---编写Dockerfile搭建PHP开发环境

使用Dockerfile搭建PHP开发环境(之后添加docker-compose),项目地址见原文链接

一、编写Dockerfile

1. PHP-FPM

FROM php:7.2-fpm

LABEL maintainer="AlanAlbert" version="1.0" description="php-fpm(php 7.2)"

# 设置时区
ENV TZ=Asia/Shanghai

# 复制php配置文件、php-fpm配置文件
COPY php.ini /usr/local/etc/php/
COPY php-fpm.conf /usr/local/etc/
COPY php-fpm.d/* /usr/local/etc/php-fpm.d/

# 安装PHP扩展——swoole、redis、pdo_mysql、mysqli
RUN docker-php-ext-install pdo_mysql mysqli \
    && pecl install redis swoole \
    && docker-php-ext-enable redis swoole

# 挂载站点目录、php-fpm日志目录为匿名卷
VOLUME /home/www /var/log/php-fpm

# 添加www用户及切换站点目录所有者
RUN useradd www \
    && chown -R www /home/www

# 切换工作目录为根目录
WORKDIR /

# 容器启动时执行命令
CMD ["/usr/local/sbin/php-fpm"]

# 声明使用9000端口
EXPOSE 9000

2. Nginx

FROM nginx

LABEL maintainer="AlanAlbert" version="1.0" description="nginx"

# 设置时区
ENV TZ=Asia/Shanghai

# 复制Nginx配置
COPY nginx.conf /etc/nginx/
COPY sites/*.conf /etc/nginx/conf.d/

# 挂载站点、Nginx日志为匿名卷
VOLUME /home/www /var/log/nginx

# 添加www用户、更换站点目录所有者
RUN useradd www \
    && chown -R www /home/www

# 设置工作目录
WORKDIR /home/www

# 设置容器启动时执行的命令
CMD ["/usr/sbin/nginx"]

# 声明使用的端口
EXPOSE 80 443

3. MySQL

FROM mysql:5.7

LABEL maintainer="AlanAlbert" version="1.0" description="mysql"

# 设置环境变量
ENV MYSQL_ALLOW_EMPTY_PASSWORD=true \
    MYSQL_ROOT_PASSWORD="" \
    TZ=Asia/Shanghai

# 复制MySQL配置
COPY my.cnf /etc/mysql/

# 挂载MySQL数据目录为匿名卷
VOLUME /var/lib/mysql

# 声明使用的端口
EXPOSE 3306

4. Redis

FROM redis

LABEL maintainer="AlanAlbert" version="1.0" description="redis"

# 设置时区
ENV TZ=Asia/Shanghai

# 声明需要使用的端口
EXPOSE 6379

二、编写shell脚本管理容器

因为暂时没有使用docker-compose,而docker命令较长,很复杂,所以编写脚本来管理容器

1. build

#!/bin/bash

# 发生错误,中断执行
set -e

echo "开始构建..."
echo "正在构建PHP-FPM..."

# 构建PHP-FPM镜像,并设置名称为alan/php-fpm
docker build -t alan/php-fpm php-fpm

# 创建PHP-FPM容器。
# 1. -p: 将容器9000端口映射到物理机9000端口;
# 2. --name: 指定名称为alan_php-fpm;
# 3. -i: 开启容器标准输入
# 4. -t: 分配一个伪输入终端
# 5. -v: 挂载www目录到/home/www、logs/php-fpm目录到/car/log/php-fpm
# 6. --network: 连接到alan_php_env网络
docker create -p 9000:9000 --name alan_php-fpm -it -v `pwd`/www:/home/www -v `pwd`/logs/php-fpm:/var/log/php-fpm --network alan_php_env alan/php-fpm

echo "PHP-FPM构建完成."
echo "正在构建Nginx..."

# 构建Nginx镜像,设置名称为alan/nginx
docker build -t alan/nginx nginx

# 创建Nginx容器。
# 1. -p: 映射端口
# 2. --name: 设置镜像名称
# 3. -i: 开启标准输入
# 4. -t: 分配伪输入终端
# 5. -v: 挂载目录
# 6. --network: 连接网络
docker create -p 80:80 --name alan_nginx -it -v `pwd`/www:/home/www -v `pwd`/logs/nginx:/var/log/nginx --network alan_php_env alan/nginx

echo "Nginx构建完成."
echo "正在构建MySQL..."

# 构建MySQL镜像
docker build -t alan/mysql mysql

# 创建MySQL容器
docker create -p 3306:3306 --name alan_mysql -it -v `pwd`/data:/var/lib/mysql --network alan_php_env alan/mysql

echo "MySQL构建完成."
echo "正在构建Redis..."

# 构建Redis镜像
docker build -t alan/redis redis

# 创建Redis容器
# --requirepass: 设置Redis密码
docker create -p 6379:6379 --name alan_redis -it --network alan_php_env alan/redis --requirepass ""

echo "Redis构建完成."
echo "正在创建网络..."

# 创建bridge网络
docker network create -d bridge alan_php_env

echo "网络创建完成."
echo "构建完成."

2. start

#!/bin/bash
set -e

echo "正在启动..."

# 启动所有容器
docker start alan_php-fpm alan_nginx alan_mysql alan_redis

echo "启动完成."

3. stop

#!/bin/bash

echo "正在停止..."

# 停止所有容器
docker stop alan_redis alan_mysql alan_nginx alan_php-fpm

echo "已停止."

4. restart

#!/bin/bash
set -e

echo "正在重启..."

# 重启所有镜像
docker restart alan_redis alan_mysql alan_nginx alan_php-fpm

echo "重启完成."

5. uninstall

#!/bin/bash

# 停止所有容器 && 删除所有容器 && 删除所有镜像 && 删除网络

echo "正在卸载..."
echo "正在停止运行容器..."

docker stop alan_redis alan_mysql alan_nginx alan_php-fpm

echo "已停止."
echo "正在删除容器..."

docker rm alan_redis alan_mysql alan_nginx alan_php-fpm

echo "已删除容器."
echo "正在删除镜像..."

docker rmi alan/redis alan/mysql alan/nginx alan/php-fpm

echo "已删除镜像."
echo "正在删除网络..."

docker network rm alan_php_env

echo "已删除网络."
echo "卸载完成."