杜郎俊赏 - dujun.io

开源实例之容器最佳实践

前言

前文提到,本系列实例采用运行时容器 + 数据容器的部署方式。当项目多样性增加,运行时环境所需应用的排列组合也在增加。考虑到可维护性,决定遵循最佳实践重构,即一个容器只运行一个应用,通过编排完成部署。

本文以 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:

资源占用统计

后记

题图:爱蜜社 Vol.434 许诺

以上代码已开源,详见《开源实例之本系列镜像开源》

体验更多实例

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