开源实例之容器最佳实践
前言
前文提到,本系列实例采用运行时容器 + 数据容器的部署方式。当项目多样性增加,运行时环境所需应用的排列组合也在增加。考虑到可维护性,决定遵循最佳实践重构,即一个容器只运行一个应用,通过编排完成部署。
本文以 WordPress 为例,示范如何以 Docker 最佳实践部署 LNMP 环境。
容器划分
WordPress 项目需要 4 个容器,即 PHP 容器、MySQL 容器、Nginx 容器和数据容器(WordPress 代码和上传文件存储)。
镜像构建Dockerfile
系统镜像
#Debian 系统镜像,包含 Debian 11.5,基于官方镜像 debian:stable-20221205-slim
FROM debian:stable-20221205-slim
MAINTAINER dujun
ENV LANG zh_CN.UTF-8
ENV LANGUAGE zh_CN.UTF-8
ENV TZ=Asia/Shanghai
COPY data /
RUN \
#设定时区
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone &&\
#修改源
apt-get update -y && apt-get upgrade -y && apt-get dist-upgrade -y
PHP镜像
#PHP 8.1,基于本地镜像 dujun_debian
FROM dujun_debian
MAINTAINER dujun
RUN \
#增加 ppa 源,安装 php8
apt-get install curl -y && curl -sSL https://packages.sury.org/php/README.txt | bash -x &&\
apt-get update -y && apt-get upgrade -y &&\
apt-get install php8.1 php8.1-fpm php8.1-mysql php8.1-mbstring php8.1-curl -y &&\
sed -i "s/listen = \/run\/php\/php8.1-fpm.sock/listen = 0.0.0.0:9000/g" /etc/php/8.1/fpm/pool.d/www.conf
MySQL镜像
#MariaDB 10.5,基于本地镜像 dujun_debian
FROM dujun_debian
MAINTAINER dujun
COPY data /
RUN \
#安装 mysql
apt-get install mariadb-server-10.5 -y &&\
#创建 mysql admin 账号
/etc/init.d/mariadb start &&\
mysql < /root/start/mysql_init.sql &&\
#修改配置
sed -i "s/# port = /port = /g" /etc/mysql/mariadb.cnf &&\
sed -i "s/socket = /# socket = /g" /etc/mysql/mariadb.cnf &&\
sed -i "s/bind-address /# bind-address /g" /etc/mysql/mariadb.conf.d/50-server.cnf &&\
#清理文件
rm -fr /root/start/
Nginx镜像
#Nginx 1.18,基于本地镜像 dujun_debian
FROM dujun_debian
MAINTAINER dujun
RUN \
#安装 nginx
apt-get install nginx=1.18.0-6.1+deb11u2 -y
WordPress镜像
#WordPress 镜像,包含 WordPress 6.1,基于官方镜像 busybox
FROM busybox
MAINTAINER dujun
COPY data /
RUN \
#设置目录权限
chown -fR www-data:www-data /wwwroot/app
镜像构建编排yml
version: '3'
services:
debian:
build:
context: ../00000_BASE/00001_debian
dockerfile: Dockerfile
image: dujun_debian
php:
depends_on:
- debian
build:
context: ../00000_BASE/00100_php
dockerfile: Dockerfile
image: dujun_php
mysql:
depends_on:
- debian
build:
context: ../00000_BASE/00200_mysql
dockerfile: Dockerfile
image: dujun_mysql
nginx:
depends_on:
- debian
build:
context: ../00000_BASE/00300_nginx
dockerfile: Dockerfile
image: dujun_nginx
wordpress:
build:
context: ./
dockerfile: Dockerfile
image: dujun_wordpress
容器生成编排yml
version: '3'
services:
data:
image: dujun_wordpress
volumes:
- wwwroot:/wwwroot
- vhost:/etc/nginx/sites-enabled
- start:/root/start
tty: true
mysql:
image: dujun_mysql
depends_on:
- data
volumes:
- start:/root/start
expose:
- "3306"
entrypoint: /bin/bash -c "/etc/init.d/mariadb start && mysql < /root/start/mysql_init.sql && /bin/bash"
tty: true
php:
image: dujun_php
depends_on:
- data
- mysql
volumes:
- wwwroot:/wwwroot
expose:
- "9000"
entrypoint: /bin/bash -c "/etc/init.d/php8.1-fpm start && /bin/bash"
tty: true
nginx:
image: dujun_nginx
depends_on:
- data
- php
volumes:
- vhost:/etc/nginx/sites-enabled
- wwwroot:/wwwroot
ports:
- "10111:8081"
container_name: wordpress
entrypoint: /bin/bash -c "/etc/init.d/nginx start && /bin/bash"
tty: true
volumes:
wwwroot:
vhost:
start:
资源占用统计
后记
以上代码已开源,详见《开源实例之本系列镜像开源》。
标签: 开源实例