0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Docker-compose常用的解决方法

马哥Linux运维 来源:马哥Linux运维 作者:马哥Linux运维 2022-09-05 15:22 次阅读

前言

我们常常见到很多比较棒的开源项目,但在本地安装运行的话就会很复杂,要配置不同的环境,安装不同的依赖,好一点的会用docker直接拉取,或者打包好。

这些无疑都会增加初学者上手的成本,所以这篇文章总结了下目前比较常用的解决方法之一:

使用docker-compose同时管理多个服务,只需要一行命令docker compose up -d,就可以启动一个包含后端项目、前端项目、数据库的完整服务。

而docker-compose作为docker容器的编排工具,可以帮助我们实现管理多个docker容器。

其实整体的过程并不难,但要配置完成,也要很多步骤,这篇文章主要是从实战的角度,将整个过程串起来。涉及的知识点包括:nginx、docker、docker-compose、node、mysql也需要了解下。

适合读下去的朋友:

对Docker有基本的了解

同时需要部署多个项目

需要开源项目或者自建项目的整体部署

需要打包部署一整个网站

需要提前准备的

Docker安装并启动(演示版本如下)

97b9695c-2acf-11ed-ba43-dac502259ad0.png

docker-compose(安装Docker同时会自动安装,如果没有可以自行安装,也很简单)

一个前端项目(这里演示使用React SPA)

一个后端项目(这里使用Express)

97e7227a-2acf-11ed-ba43-dac502259ad0.png

如图所示,通过docker-componse.yml文件一次启动不同的容器,然后他们都可以对外提供服务。

前端项目构建

前端项目处理

首先我们通过CRA下载一个项目模版,为了可以模拟实际的项目需要,对下载的模版做一些处理,让这个项目可以

1、区分当前项目是预发环境还是生产环境

2、引入Axios可以请求接口

接着我们打包yarn build:prod,打包后的文件夹build就是我们要部署的静态资源。

拉取Nginx镜像部署

我们通过Docker部署前面打包的静态资源,当前项目的路径是

/Users/user/Desktop/mine/fronted-demo2/build

直接运行下面命令行,启动前端服务

dockerrun-d-p80:80-v/Users/user/Desktop/mine/fronted-demo2/build:/usr/share/nginx/html--namefrontend-testnginx

980ab9a6-2acf-11ed-ba43-dac502259ad0.png

通过本机80端口访问,发现当前服务是生产环境,并且由于后端服务没有部署,此时数据库拿到的数据为空。

9818cbcc-2acf-11ed-ba43-dac502259ad0.png

测试,我们切换路由,发现页面404了,是因为单页面应用路由在前端,需要nginx转发下,接着我们用项目中的Nginx配置覆盖容器中的配置

提取Nginx配置到项目中

首先,我们进入上一步的Docker容器,可以看到Nginx的路径。

dockerexec-itfrontend-test/bin/bash

98269ce8-2acf-11ed-ba43-dac502259ad0.png

在项目根目录下新建nginx/default.conf

server{
listen80;
server_namelocalhost;
underscores_in_headerson;
root/home/frontend;
location/{
try_files$uri$uri/@router;
indexindex.html;
}
location@router{
rewrite^.*$/index.htmllast;
}
}

然后通过挂载的方式,启动容器,发现访问正常。

编写Dockerfile文件

FROMnginx

WORKDIR/home/frontend

COPYbuild.

COPY./nginx/default.conf/etc/nginx/conf.d/default.conf

EXPOSE80

在项目根目录下,新建Dockerfile文件,其中包括基础镜像、工作目录、将项目copy到镜像,将Nginx配置文件复制到镜像中。

构建前端服务镜像并启动

dockerbuild-tfrontend.

dockerimages

dockerrun-d-p80:80--namefrontend-v1frontend

可以发现前端服务的镜像已经打包完成并启动,打开本地80端口访问,测试完毕可以删除,然后留镜像frontend备用。也可以将镜像推送镜像仓库,后面直接通过远程来拉取也可以。

主意:如果之前的Docker容器启动,需要先关掉,否则会报端口被占用,如果不删除,就需要修改重新启动容器的名字。

数据库启动

拉取并启动数据库、连接数据库

dockerrun-p3306:3306--restart=always--privileged=true--namemysql-v/Users/user/Desktop/mysql/data:/var/lib/mysql-v/Users/user/Desktop/mysql/my.cnf:/etc/mysql/my.cnf-eMYSQL_ROOT_PASSWORD="123456"-dmariadb

一行命令启动Mariadb,这里选择Mariadb是由于我m1的电脑,不支持mysql镜像,所以改成了Mariadb,使用是一样。上面的命令除了启动数据库服务,还设置了数据的一些配置,密码,将数据库的数据放在了本地。

[mysqld]
skip-name-resolve
user=root
character-set-server=utf8
default_authentication_plugin=mysql_native_password
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1#忽略表名大小写

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

新建库和表

这里可以进入容器中操作数据库,还可以使用客户端连接数据库

984ccb2a-2acf-11ed-ba43-dac502259ad0.png

后端项目启动

下载Express项目模版并连接数据库

这里配置数据库,写好项目接口,确保本地启动服务正常。

拉起镜像,部署镜像

部署服务,我们选择使用pm2,为了区分生产环境和预发环境,我们在根目录下新建pm2.config.js,然后通过传入不同的参数,启动对应的环境

module.exports={
apps:[
{
name:"myapp",
script:"./bin/www",
watch:true,
env:{
"NODE_ENV":"development"
},
env_production:{
"NODE_ENV":"production",
}
}
]
}

启动预发环境pm2 start pm2.config.js --env development

启动生产环境pm2 start pm2.config.js --env production

再项目中通过process.env.NODE_ENV读取

编写Dockerfile并构建新的镜像

FROMkeymetrics/pm2

RUNmkdir-p/home/backend

WORKDIR/home/backend

COPY.//home/backend

RUNyarninstall

ENVNPM_CONFIG_LOGLEVELwarn

EXPOSE9000

CMD["pm2-runtime","start","pm2.config.js","--env","production"]

然后构建镜像docker build -t backend .

docker-compose.yml 配置

截止目前,我们有了三个Docker镜像,分别是前端服务的镜像,后端服务的镜像和数据库的镜像。然后我们编写docker-compose.yml来同时启动这三个服务,并且保证三者的启动顺序。

编写docker-compose配置文件

新建一个目录,然后再目录下新建docker-compose.yml和目录mysql,mysql中包含了mysql的数据和日志信息,这样就不用重启服务导致数据库信息丢失

version:'3'

networks:
app-web:
driver:bridge

services:
mysql:
image:mariadb
ports:
-3306:3306
command:--default-authentication-plugin=mysql_native_password
restart:always
networks:
-app-web
environment:
-TZ=Asia/Shanghai
-MYSQL_USER=root
-MYSQL_ROOT_PASSWORD=123456
volumes:
-./mysql/data:/var/lib/mysql
-./mysql/my.cnf:/etc/mysql/my.cnf
-/etc/localtime:/etc/localtime
backend:
image:backend
ports:
-9000:9000
depends_on:
-mysql
networks:
-app-web
frontend:
image:frontend
ports:
-80:80
depends_on:
-backend

看到这个配置不要怕,拆分开,其实很简单,整个配置文件就是一个完整的项目,包括了mysql、backend、frontend,每个部分和配置Dockerfile差不多,增加了depends_on,很好理解,前置的服务需要提前部署,networks,让不同的容器在相同的网络中运行。当然这只是提供了最基础的配置,更复杂的配置需要根据使用场景来完善。

启动服务

dockercomposeup-d

-d#是以守护进程的方式运行,通过docker ps可以查看当前所有运行中的服务。

9864b820-2acf-11ed-ba43-dac502259ad0.png

dockercomposedown

#停止当前集群下的所有服务,并删除容器。

到这里,我们的docker-compose整体打包部署一个网站已经完成了,过程中可能存在各种各样的坑,但只要配置报错日志进行查询,就能一一解决。

如果需要重新部署一套,或者发布新版本,只需要更新docker-compose.yml就可以了

注意点

1、mysql配置

数据库和项目的一些信息需要灵活配置,根据自己的需要。

自动迁移数据库

我们发现,一些新的数据库表,没有进行初始化,导致需要手动处理,在项目中我们可以用脚本去,或者使用一些数据库封装的orm进行自动迁移。

一些报错信息

986ff348-2acf-11ed-ba43-dac502259ad0.png

解决办法,修改mysql配置host为mysql

9887cf72-2acf-11ed-ba43-dac502259ad0.png

1、docker拉取镜慢的话,可以考虑国内镜像

2、前端、后端项目可以使用任意的语言,只要构架不同的镜像就可以了。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7538

    浏览量

    148153
  • 数据库
    +关注

    关注

    7

    文章

    3548

    浏览量

    63261
  • nginx
    +关注

    关注

    0

    文章

    135

    浏览量

    11973
  • Docker
    +关注

    关注

    0

    文章

    430

    浏览量

    11573

原文标题:使用 Docker-compose 打包整个网站项目一键部署

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【昉·星光 2 高性能RISC-V单板计算机体验】为 Ubuntu 安装 Docker常用软件

    docker sudo apt install docker.io 安装 docker-compose sudo apt-get install docker-compose
    发表于 02-21 17:54

    POP噪声常用解决方法及其工作原理

    音频系统应用中的“POP”噪声以其常用解决方法
    发表于 05-15 11:22

    docker常用命令有哪些?

    docker常用命令:Docker镜像相关Docker容器相关Docker仓库相关
    发表于 11-06 06:48

    基于DOCKER容器的ELK日志收集系统分析

    工具docker-compose,一键式构建基于Docker容器的ELK日志收集系统的实验环境,证明了本系统收
    发表于 11-06 14:15 3次下载
    基于<b class='flag-5'>DOCKER</b>容器的ELK日志收集系统分析

    POP噪音及其常用解决方法

    POP噪音及其常用解决方法
    发表于 11-27 14:56 14次下载

    云计算核心技术Docker教程:Docker Compose的pull和push命令详解

    Docker-Compose pull命令可以拉取docker-compose.yml或者docker-stack.yml文件中定义的服务关联的镜像,Docker-Compose pu
    的头像 发表于 11-17 18:22 8606次阅读

    云计算核心技术DockerCompose中的环境变量

    :${TAG}” 如果您有多个环境变量,则可以通过提供环境变量文件的路径来替换它们。默认情况下,该docker-compose 命令将.env在您运行该命令的目录中查找一个名为的文件。通过将文件作为参数
    的头像 发表于 02-16 09:58 3483次阅读

    Docker Compose Docker应用构建管理工具

    ./oschina_soft/compose.zip
    发表于 05-12 15:58 1次下载
    <b class='flag-5'>Docker</b> <b class='flag-5'>Compose</b> <b class='flag-5'>Docker</b>应用构建管理工具

    docker compose一键打包部署项目的实践

    【导读】本文介绍了 docker compose 一键打包部署项目的实践。
    的头像 发表于 08-30 11:03 1042次阅读

    使用podman-compose部署wordpress的示例

    我们对于docker-compose并不陌生,它是一个用于编排多个可能相互依赖的容器的工具。
    的头像 发表于 10-17 10:59 2217次阅读

    SpringBoot接入轻量级分布式日志框架GrayLog

    老样子,直接上docker-compose,如果一直跟着我的步伐,应该对着不陌生了。docker-compose.yml 的内容其实我也是抄官网的,这里还是贴下吧(就不用你们翻了)
    的头像 发表于 10-27 10:29 794次阅读

    使用Docker安装WordPress教程

    本教程将向您展示如何使用 Docker ComposeDocker 容器中运行 WordPress 安装。
    的头像 发表于 07-28 11:39 962次阅读
    使用<b class='flag-5'>Docker</b>安装WordPress教程

    docker进入容器的方法有哪些

    Docker是一种流行的容器化平台,它能够快速构建、交付和运行应用程序。在使用Docker时,我们经常需要进入容器进行调试、管理和运行命令等操作。本文将详细介绍Docker进入容器的各种方法
    的头像 发表于 11-23 09:45 1845次阅读

    如何利用树莓派安装DockerDocker-compose呢?

    本文主要演示了树莓派如何安装DockerDocker-compose的过程。
    的头像 发表于 12-14 16:19 971次阅读
    如何利用树莓派安装<b class='flag-5'>Docker</b>和<b class='flag-5'>Docker-compose</b>呢?

    基于Docker-Compose的Apollo部署安装与使用

    为什么选择 Apollo:稳定&简单,虽然比不上 Nacos 的性能,也没有服务发现功能,但是稳定啊!!! 在我自己部署前,会觉得这个东西好难,好重,好麻烦。写这篇文章的时候的感受只有两个字:牛*
    的头像 发表于 01-02 10:15 352次阅读
    基于<b class='flag-5'>Docker-Compose</b>的Apollo部署安装与使用