因为目前工作中项目大部分都是使用的docker环境,使用docker-compose编排部署的,所以这段时间就自己尝试使用docker部署一下之前自己写的练手项目,其中的环境有
mysql8php7.4redis3rabbitmqnginxelasticsearch,当然这些技术有一些我都只是了解,平时工作用不到,自己也没有系统性的学习过,所以可能会有一些问题。

该docker项目的代码以及目录结构地址

https://gitee.com/wyqgg/blogdocker/tree/master/

dockerFile

php

这个镜像主要是安装一些项目中使用到的扩展,这里根据自己项目的需要来编写dockerfile,

FROM php:7.4-fpm

#pdo_mysql
RUN docker-php-ext-install pdo_mysql \
#mysqli
&& docker-php-ext-install mysqli \
#Redis
&& docker-php-ext-install redis \
#xdebug
&& pecl install xdebug-2.8.1 \
&& docker-php-ext-enable xdebug \
# Swoole
&& pecl install swoole-4.5.2 \
&& docker-php-ext-enable swoole \
# AMQP
&& apt-get update \
&& apt-get install -y librabbitmq-dev libssl-dev \
&& pecl install amqp \
&& docker-php-ext-enable amqp \
# Seaslog
&& pecl install seaslog \
&& docker-php-ext-enable seaslog \

我这里面除了php需要编写特定的dockerFile其他的环境都没有编写特定的dockerFile

docker-compose.yml

这里使用${}获取到的是docker-compose.yml 同级目录下的.env文件中设置的变量的值.

docker-compose.yml
version: '3.0'

#网络配置
networks:
  backend:
    driver: ${NETWORKS_DRIVER}
#服务器容器配置
services:
  nginx:
    image: nginx:latest #dockerHub中获取该镜像
    environment:
      - TZ=${TZ} #时区
    volumes:
      - ${CONF_PATH_HOST}/nginx:/etc/nginx/conf.d/ #配置文件路径,设置数据卷,让本地和容器的数据共享
      - ${WWW_PATH_HOST}:/usr/share/nginx/html #项目代码目录  
    ports:
      - "81:80"
      - "8001:8000"
      - "8002:8002"
      - "8003:8003"
    networks:
      - backend
    restart: always #指定容器退出后重启策略为始终重启 

  php:
    build:
      context: ./php #通过上层目录的php目录中的DockerFile来构造该镜像
    environment:
    - TZ=${TZ}
    volumes:
      - ${CONF_PATH_HOST}/php/conf.d:/usr/local/etc/php/conf.d #php的扩展目录,notes:这里最好先把php镜像build好,然后将镜像/usr/local/etc/php/conf.d目录中的配置文件复制一份放到本地文件${CONF_PATH_HOST}/php/conf.d中。不然的话就把这行注释。这里是为了今后在加其他php扩展准备的。
      - ${WWW_PATH_HOST}:/usr/share/nginx/html
    ports:
    - "${PHP_PORT}:9000"
    networks:
      - backend
    restart: always

  mysql:
    image: mysql/mysql-server:8.0 #dockerHub中获取该镜像
    environment:
      - TZ=${TZ}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_ROOT_PASSWORD={MYSQL_ROOT_PASSWORD}
    volumes:
      - ${DATA_PATH_HOST}/mysql:/var/lib/mysql #数据文件
      - ${CONF_PATH_HOST}/mysql/my8.cnf:/etc/my.cnf #配置文件
    ports:
      - "${MYSQL_PORT}:3308"
    networks:
      - backend
    restart: always

  redis:
    image: redis:3 
    environment:
      - TZ=${TZ}
    volumes:
      - ${CONF_PATH_HOST}/redis:/etc/redis #配置文件
      - ${DATA_PATH_HOST}/redis:/data #data文件
    ports:
     - "${REDIS_PORT}:6379"
    networks:
     - backend

  rabbitmq:
    image: docker_rabbitmq:latest
    environment:
      - TZ=${TZ}
      - RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER}
      - RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS}
    volumes:
      - ${DATA_PATH_HOST}/rabbitmq:/var/lib/rabbitmq
    restart: always
    ports:
      - "${RABBITMQ_PORT_CLIENT}:15672"
      - "${RABBITMQ_PORT_SERVER}:5672"  
    networks:
      - backend

  elasticsearch:
    image: elasticsearch:8.2.1
    environment:
      - discovery.type=single-node #以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - bootstrap.memory_lock=true
    volumes:
      - ${CONF_PATH_HOST}/elasticsearch:/usr/share/elasticsearch/plugins #插件文件
      - ${DATA_PATH_HOST}/elasticsearch:/usr/share/elasticsearch/data:rw #数据文件
      - ${LOG_PATH_HOST}/elasticsearch:/usr/share/elasticsearch/logs:rw #日志文件
    restart: always
    ports:
      - ${ELASTICSEARCH_PORT_OUTSIDE}:9200
      - ${ELASTICSEARCH_PORT_INSIDE}:9300
    networks:
      - backend

  kibana:
    image: kibana:8.2.1
    depends_on: 
      - elasticsearch #该镜像基于elasticsearch镜像,若elasticsearch镜像为build成功则该镜像也不会build成功。
    environment:
      ELASTICSEARCH_HOSTS: http://elasticsearch:9200
      I18N_LOCALE: zh-CN
    ports:
     - ${KIBANA_PORT}:5601
    networks:
      - backend
.env
#设置时区
TZ=Asia/Shanghai

#设置网络模式
NETWORKS_DRIVER=bridge

#配置文件根目录
CONF_PATH_HOST=./conf

#宿主机上代码存放的目录路径
WWW_PATH_HOST=./www

#宿主机上mysql Redis数据存放的目录路径
DATA_PATH_HOST=./data

#宿主机上存放log日志的目录路径
LOG_PATH_HOST=./log

#Mysql服务映射主机端口号,可在宿主机127.0.0.1:3307访问
MYSQL_PORT=3307
MYSQL_USER=wyq
MYSQL_PASSWORD=Wyqgg@123
MYSQL_ROOT_PASSWORD=123456

#Redis服务映射主机端口号
REDIS_PORT=6380

#PHP端口号
PHP_PORT=9000

#rabbitMq
#端口号
RABBITMQ_PORT_SERVER=5672
RABBITMQ_PORT_CLIENT=15672
#
RABBITMQ_DEFAULT_USER=wyqgg
RABBITMQ_DEFAULT_PASS=123456


#Elasticsearch端口号
ELASTICSEARCH_PORT_OUTSIDE=9200
ELASTICSEARCH_PORT_INSIDE=9300

#kibana端口号
KIBANA_PORT=5601

在docker-compose.yml目录执行下面命令就可以成功build一些镜像run一些容器,创建网络。将这些容器编排到一个环境下

docker-compose docker-compose.yml up -d

项目的目录结构
在这里插入图片描述

解读

conf目录:保存配置文件,可以独立配置每个容器的配置,执行完docker-compose文件可以直接生效,我这里因为记不住配置文件我基本上都是把容器先跑起来不建立数据卷,将该容器服务的默认配置copy到这个文件夹之后在添加容器卷,然后就可以根据自己的需求进行修改了。
data目录:保存数据目录,比如redis、mysql的数据、若没有这个的话、每次down掉docker-composer服务,那么运行的数据就都丢失了。
具体服务目录:里面都是具体服务的dockerFile,当然这里可以只有需要独立编写dockerFile的服务才建立这些文件夹,我这里是都建了。
www目录:该目录绑定的就是nginx默认配置的起始页,当然这个是可以修改的。

若成功执行则如下图所示
在这里插入图片描述

项目运行

首先在www目录下拉取之前项目的代码
根据项目需求修改nginx配置。
恢复数据库
成功执行项目

这个是我之前编写的项目,可以在docker环境下运行,有些界面还有些问题,需要我修复下代码,但是环境是没有问题的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pIqZJ9oh-1664964855438)(img_2.png)]

若成功执行则如下图所示
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐