windows 使用docker-compose+DockerFile部署项目(内含echo-server)

平时开发环境是windows下的集成环境,在一年前下载了Docker Desktop 想安装laradock 但是忘了什么原因了 失败了,最近闲来没事准备整一下本地的dockfile一键部署

本文的阅读和实践需要一些docker、lnmp、docker命令等基础。
重申一下 这是windows环境下laravel项目的部署。

感谢laradock项目给我的很多地方的灵感,让我自己编写dockerfile时得心应手。大家在部署的时候也可以参考它的源代码

目录

1. Docker Desktop 的安装 以及 配置
2. docker-compose.yml + dockerfile 文件说明
3. laravel-echo-server的部署指南
4. supervisor 监控队列
5. 容器内的定时任务
6. k8s 入门调试(下一篇文章吧)

1.Docker Desktop 的安装 以及配置

:no_mouth:就是官网下载安装,修改镜像源(Setting-Docker Engine-registry-mirrors,可以去DAOCloud找个源)。现在的desktop 更新的很智能了,不像之前还要手动添加允许file sharing,现在都随着挂载随着提示你允许,并且应该是自动安装好docker-compose,如果没有安装,就百度下安装方式吧。

2.docker-compose.yml + dockerfile 文件说明

先看下大体的项目目录吧

project

  • app
  • config
  • docker
    • app_local.dockerfile(workspace容器部署文件)
    • supervisor.conf(supervisord 配置文件)
    • crontabs(容器内的定时任务)
    • laravel-echo-server.dockerfile
    • package.json(单独安装laravel-echo-server 的)
    • php.ini
    • vhost.conf
    • web.dockerfile
  • public
  • resources
  • ….
  • .env
  • .laravel-echo-server.json
  • .docker-compose.yml
  • …..

  • 项目目录下创建docker-compose.yml和 docker/ *.dockfile,然后根据项目具体需求调整文件内容,下面我把用过的所有服务都列到下面举个例子。直接在代码里说明吧

composer和node我没有选择使用镜像容器处理,因为可扩展性不是很好,平时更新项目时可能需要修改composer和npm,我也下载过镜像进行模拟 使用起来都不尽如人意,不如直接在php app的容器(workspace)中进行命令操作。

version: '3.7'
services:
  app:
    image: xxx_app #镜像名称
    build: #指定该容器构建参数
      context: ./
      dockerfile: ./docker/app_local.dockerfile #dockerfile 的目录在当前项目下的docker文件下
    working_dir: /app # 指定容器工作目录
    restart: always
    volumes: #目录挂载 修改php配置
      - ./:/app
      - ./docker/php.ini:/usr/local/etc/php/conf.d/php.ini #配置文件
    environment: #这里可以添加修改.env的参数使其使用容器服务 
      - REDIS_HOST=redis

  # nginx
  web:
    image: xxxx_web
    build:
      context: ./
      dockerfile: ./docker/web.dockerfile
    restart: always
    depends_on:
      - app
    ports:
      - 80:80  #前面的80指本地端口 后面的80指容器中的端口
    volumes: #本机也需要记录日志
      - ./:/app
      - E:/DockerData/nginx/:/data/logs/nginx/

  # redis database 需要连接本地数据库时可以使用
  redis:
    container_name: xxx_redis #不使用dockfile的时候设置容器名称
    volumes:
      - E:/DockerData/redis:/data  # 挂载redis数据目录
      - E:/DockerData/conf/redis/redis.conf:/etc/redis/redis.conf  # 需要配置文件 不然无法启动
    image: redis
    command: redis-server /etc/redis/redis.conf
    ports:
      - 6380:6379

# mysql database 需要连接本地数据库时可以使用 
  database:
    container_name: xxx_mysql
    image: mysql:5.7
    command: --default-authentication-plugin=mysql_native_password
    ports:
    - 3316:3306
    environment: #MYSQL_ROOT_PASSWORD 才是登陆密码 env中的密码
    - "MYSQL_ROOT_PASSWORD=password"
    - "MYSQL_DATABASE=database_name"
    volumes: #需要数据转移的时候 可以挂载 没有的话就直接进入php容器 执行数据迁移
    - D:/xxxx/MySQL5.7.26/data/xxx:/var/lib/mysql/xxxx

  #  laravel-echo-server
  laravel-echo-server:
    build:
      context: ./
      dockerfile: ./docker/laravel-echo-server.dockerfile
    volumes:
      - ./laravel-echo-server.json:/usr/src/app/laravel-echo-server.json
    ports:
      - 6001:6001 #关键 别设置错
    links:
      - redis #通知关联redis服务
  • 下面我们来看dockfile和配置文件
  1. app_local.dockerfile (workspace 也就是php-fpm)
FROM php:7.3-fpm-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.huaweicloud.com/g' /etc/apk/repositories
RUN apk update \
    && apk upgrade \
    && apk add --no-cache \
        freetype \
        libpng \
        libjpeg-turbo \
        freetype-dev \
        libpng-dev \
        jpeg-dev \
        libjpeg \
        libjpeg-turbo-dev \
        libwebp-dev\
        libzip-dev\
        git
RUN docker-php-ext-configure gd \
                --with-freetype-dir=/usr/lib/ \
                --with-png-dir=/usr/lib/ \
                --with-jpeg-dir=/usr/lib/ \
                --with-webp-dir=/usr/lib/
RUN docker-php-ext-install mysqli pdo pdo_mysql gd zip
WORKDIR /app
RUN apk add composer npm
RUN composer config -g repos.packagist composer https://packagist.phpcomposer.com
RUN npm config set registry https://mirrors.huaweicloud.com/repository/npm/

# composer 和 npm的命令等容器创建好之后 进入容器进行 
# composer install composer autoload-dump 和 npm install npm run prod 等操作
  1. laravel-echo-server.dockfile(关于laravel-echo-server 使用和安装中的坑 可以看我之前的文章laravel-echo-server 踩坑记录)
FROM node:alpine

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# 拷贝 属于 echo-server自己的package.json 与项目本身的区分开
COPY ./docker/package.json /usr/src/app/

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories

RUN apk add --update \
    python \
    python-dev \
    py-pip \
    build-base

RUN npm install

# 根据项目自身的配置laravel-echo-server.json进行启动
COPY laravel-echo-server.json /usr/src/app/laravel-echo-server.json

EXPOSE 3000
CMD [ "npm", "start", "--force" ] #容器构建后 启动echo-server
  1. package.json (laravel-echo-server 使用的)
{
  "name": "laravel-echo-server-docker",
  "description": "Docker container for running laravel-echo-server",
  "version": "0.0.1",
  "license": "MIT",
  "dependencies": {
    "laravel-echo-server": "^1.5.0"
  },
  "scripts": {
    "start": "laravel-echo-server start"
  }
}
  1. php.ini(在yml文件中挂载了)
post_max_size = 500M
upload_max_filesize = 500M
memory_limit = 512M
#...其他配置的更改
  1. vhost.conf(nginx 配置 更具体的内容可以看看laradock项目)

client_max_body_size 500m;


proxy_read_timeout 240s;

server {
    listen 80;

    index index.php index.html;
    root /app/public;

    server_name xxxx.com;

    access_log /data/logs/nginx/xxxx_access.log;
    error_log /data/logs/nginx/xxxx_error.log;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000; #workspace的服务名称app
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
  1. web.dockerfile (nginx的镜像文件)
FROM nginx:1.17-alpine
ADD docker/vhost.conf /etc/nginx/conf.d/default.conf
RUN mkdir -p /data/logs/nginx/
#这里修改日志名称 与上面的文件相对应
RUN touch /data/logs/nginx/xxxx_access.log
#这里修改与上面的文件相对应
RUN touch /data/logs/nginx/xxx_error.log

laravel-echo-server的部署指南

  1. laravel-echo-server.json(authhost不修改的话会显示 Error authenticating)

    {
     "authHost": "http://web",
     "authEndpoint": "/broadcasting/auth",
     "clients": [],
     "database": "redis",
     "databaseConfig": {
         "redis": { //这里要修改的
             "port": "6379",
             "host": "redis"
         }
     },
     "devMode": true,
     "host": null,
     "port": "6001",
     "protocol": "http",
     "socketio": {},
     "sslCertPath": "",
     "sslKeyPath": ""
    }
  2. 最后提示一下.env文件别忘了修改 QUEUE_CONNECTION、BROADCAST_DRIVER为redis,DB_HOST修改为服务名称,我这里叫database。以及涉及到的主机挂载目录是否都已经创建?


然后你就可以愉快的 docker-compose up -d ,docker-compose build 了

supervisor 监控队列

先呈上supervisor.conf

[program:yourname_queue]#这里改个自己名字
process_name=%(program_name)s_%(process_num)02d
directory=/app #你的容器内的项目目录 
command=php artisan queue:work --tries=3 --sleep=3 --daemon
autostart=true 
autorestart=true
numprocs=1
user=root
stopasgroup=true
killasgroup=true
redirect_stderr=true
stderr_logfile=/app/storage/logs/err_queue.log #配置错误日志文件路径
stdout_logfile=/app/storage/logs/queue.log  #配置输出日志文件路径
[supervisord]

[supervisorctl]
  1. 在你的workspace容器内安装supervisor(直接配置dockfile即可), 然后copy配置文件到容器内
# 我这里是app_local.dockerfile
RUN apk add supervisor
# supervisor 服务配置文件
COPY ./docker/supervisor.conf /etc/supervisor/conf.d/supervisord.conf
  1. 在镜像完成成为容器后执行启动命令
docker exec your_container_name /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf

容器内的定时任务

呈上crontabs文件

#最好不要用windows记事本编辑这个文件出现换行,以免出现不必要的bug
* * * * * php /app/artisan schedule:run >> /app/storage/logs/crond.log 2>&1

因为我的workspace镜像使用的是alpine系统,不是centos和ubuntu之类的,所以它自带的crontab与其他的不同,这里我就列出alpine的步骤,其他系统的方式应该是先安装 然后需要修改crontab文件的权限为600 然后执行。

1.在dockerfile中copy我们自己的crontab文件(可选),也可以直接在命令行中echo方式书写一个crontab文件

# 可选
COPY ./docker/crontabs /etc/cron.d/
# 添加定时任务在docker中,似乎只能运行root的crontab命令,其路径在/var/spool/cron/crontabs/root中,并不是扫描cron.d/文件夹下面的所有文件,将自己的crontab脚本先copy到docker,再cat到docker的root脚本后面才可以运行
RUN cat /etc/cron.d/crontabs>>/var/spool/cron/crontabs/root

# 如果是不copy文件 直接书写crontab的方式(可选)
RUN echo -e '* * * * * php /app/artisan schedule:run >> /app/storage/logs/crond.log 2>&1'>>/var/spool/cron/crontabs/root
  1. 在镜像完成成为容器后执行启动命令(类似supervisor),如果不这样做的话 直接在dockerfile中CMD或者Entrypoint的话,我尝试过会报错。
docker exec your_container_name crond

这里我参考的文章链接在alpine linux构建的docker中使用crontab执行定时任务
里面也包含了修改容器 date 时区的方式 我就不赘述了。

再重申一遍 我这是alpine的镜像 其他linux的镜像方式可百度


好啦 结束了。以后若有新的dockerfile新增,我也会更新的。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!