开源实例之Docker
前言
Docker 是最知名的开源容器引擎,是将容器技术推广开来的超级应用。官网的 slogon 是 "Develop faster. Run anywhere."
相对于虚拟机,容器最大的优势是极低的开销和超快的部署。这正是我实现这个开源实例系列的技术基础。本篇是对《开源实例之多项目部署方案》中 Docker 部分的展开。
相关镜像构建脚本已经开源,详见《开源实例之本系列镜像开源》。
容器架构方案
Docker 的最佳实践是一个容器只跑一个应用。比如 LNMP 环境可以用三个容器分别跑 PHP、MySQL 和 Nginx。通过 docker-compose 编排组网,管理起来倒也方便。
但在本系列中,这样部署实际很麻烦。像 WordPress 一键安装,默认 PHP 和 MySQL 在同一台机器上,相关配置是 localhost。多个容器组网的映射,就要改相应代码。
最初图方便,我将一个开源项目打包成一个镜像,这样管理是最容易的。但马上发现镜像文件太大,按目前磁盘来算最多部署几十个开源项目。
所以最终我的架构方案是运行时容器 + 数据容器。
如图所示,运行时镜像可以复用,而开源项目本身文件镜像是不大的,创建的数据容器也几乎不占资源。
镜像构建脚本
基础镜像
以官方 debian:stable-20221114-slim 为基础构建系统镜像。
Dockerfile
#Debian 系统基础镜像,包含 Debian 11.5,基于官方镜像 debian:stable-20221114-slim
FROM debian:stable-20221114-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
docker-compose build
version: '3'
services:
debian:
build:
context: ./
dockerfile: Dockerfile
image: dujun_debian
运行时镜像
以 PHP 运行时为例,基于上面的本地系统基础镜像。
Dockerfile
#PHP 开发环境,包含 PHP 8.1、MariaDB 10.5、Nginx 1.18,基于本地镜像 dujun_debian
FROM dujun_debian
MAINTAINER dujun
COPY data /
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 &&\
#安装 nginx、mysql、php
apt-get install nginx=1.18.0-6.1+deb11u2 mariadb-server-10.5 php8.1 php8.1-fpm php8.1-mysql php8.1-mbstring php8.1-curl -y &&\
#创建 mysql admin 账号
/etc/init.d/mariadb start &&\
mysql < /root/start/mysql_init.sql &&\
#清理文件
rm -fr /root/start/
docker-compose build
version: '3'
services:
debian:
build:
context: ../00001_debian
dockerfile: Dockerfile
image: dujun_debian
php:
depends_on:
- debian
build:
context: ./
dockerfile: Dockerfile
image: dujun_php
项目镜像
项目镜像只需要作为文件系统挂载,所以基于官方 busybox 创建。以 WordPress 为例:
Dockerfile
#WordPress 镜像,包含 WordPress 6.1,基于官方镜像 busybox
FROM busybox
MAINTAINER dujun
COPY data /
RUN \
#设置目录权限
chown -fR www-data:www-data /wwwroot/app
docker-compose build
version: '3'
services:
debian:
build:
context: ../00000_BASE/00001_debian
dockerfile: Dockerfile
image: dujun_debian
php:
depends_on:
- debian
build:
context: ../00000_BASE/00101_php
dockerfile: Dockerfile
image: dujun_php
wordpress:
build:
context: ./
dockerfile: Dockerfile
image: dujun_wordpress
容器构建脚本
一个项目包含运行时容器 + 数据容器,以 WordPress 为例,docker-compose.yml 如下:
version: '3'
services:
data:
image: dujun_wordpress
volumes:
- wwwroot:/wwwroot
- vhost:/etc/nginx/sites-enabled
- start:/root/start
container_name: wordpress_data
tty: true
app:
image: dujun_php
depends_on:
- data
volumes:
- wwwroot:/wwwroot
- vhost:/etc/nginx/sites-enabled
- start:/root/start
ports:
- "10111:8081"
container_name: wordpress
entrypoint: /bin/bash -c "/etc/init.d/nginx start && /etc/init.d/mariadb start && /etc/init.d/php8.1-fpm start && mysql < /root/start/mysql_init.sql && /bin/bash"
tty: true
volumes:
wwwroot:
vhost:
start:
后记
标签: 开源实例