杜郎俊赏 - dujun.io

开源实例之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:

后记

题图:爱蜜社 Vol.673 张思允

体验更多实例

标签: 开源实例
日期:2022-12-04