全栈项目之docker部署前端+后端+mysql等服务

982 阅读3分钟

1 什么是docker

Docker 是一个开源的应用容器引擎,  
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。  
简单一点理解你可以把它当作一个虚拟机

2 安装

具体安装方法链接

3 docker nginx 部署多个web服务

#拉取官方nginx镜像
$ docker pull nginx
#使用 NGINX 默认的配置来启动一个 Nginx 容器实例
docker run --name runoob-nginx-test -p 8081:80 -d nginx
  • runoob-nginx-test: 容器实例名称可以自定义。
  • nginx: 官方nginx镜像。

根目录下创建目录nginx, 用于存放后面的相关东西。

mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf

拷贝容器内 Nginx 默认配置文件到本地当前目录下的 conf 目录。

docker cp 6dd4380ba708:/etc/nginx/nginx.conf ~/nginx/conf
  • 6dd4380ba708: 上面runoob-nginx-test容器实例ID,每次新建的都不一样,具体的看自己创建时的ID。
docker run -d -p 9001:80 --name myoa -v ~/nginx/www:/usr/share/nginx/html -v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/nginx/logs:/var/log/nginx nginx
  • www: 目录将映射为 nginx 容器配置的虚拟目录。
  • logs: 目录将映射为 nginx 容器的日志目录。
  • conf: 目录里的配置文件将映射为 nginx 容器的配置文件。
  • myoa:自定义docker容器名称
  • 9001:自定义端口号

线上地址

http://47.100.30.67:9001
部署第二个web 服务

docker run -d -p 9002:80 --name appoa -v ~/nginx/www1:/usr/share/nginx/html -v ~/nginx/conf1/nginx.conf:/etc/nginx/nginx.conf -v ~/nginx/logs:/var/log/nginx nginx
  • www1: 如需配置多个web服务在目录nginx下创建多个目录即可。
  • logs: 即可。
  • conf1:nginx配置刷新问题。
  • myoa:自定义docker容器名称
  • 9002:自定义端口号

nginx配置

server {
        
       
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

	    location / {
            try_files $uri $uri/ @router;
            index  index.html index.htm;
        }

        location @router {
        	rewrite ^.*$ /index.html last;
        }
    
    }

root /usr/share/nginx/html:代理html
try_files uriuri/ @router:解决vue/nginx路由问题

线上地址

http://47.100.30.67:9002
www/www1目录结构如下

| |____index.html
| |____static

nginx web服务代理根目录下必须得有index.html文件

4 docker部署mysql服务

# 拉取官方的镜像,标签为5.6
docker pull mysql:5.6
# 运行mysql容器
docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
  • -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
  • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
  • -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。
  • -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
  • -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。

5 docker部署node后端egg服务

项目根目录下Dockerfile文件

# 进入到myoa项目目录下
# 设置基础镜像,如果本地没有该镜像,会从Docker.io服务器pull镜像
FROM node:8.6.0-alpine
# 设置时区
RUN apk --update add tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && apk del tzdata

# 创建app目录
RUN mkdir -p /usr/src/node-app/koa-server

# 设置工作目录
WORKDIR /usr/src/node-app/koa-server

# 拷贝package.json文件到工作目录
# !!重要:package.json需要单独添加。
# Docker在构建镜像的时候,是一层一层构建的,仅当这一层有变化时,重新构建对应的层。
# 如果package.json和源代码一起添加到镜像,则每次修改源码都需要重新安装npm模块,这样木有必要。
# 所以,正确的顺序是: 添加package.json;安装npm模块;添加源代码。
COPY package.json /usr/src/node-app/koa-server/package.json

# 安装npm依赖(使用淘宝的镜像源)
# 如果使用的境外服务器,无需使用淘宝的镜像源,即改为`RUN npm i`。
RUN npm i --registry=https://registry.npm.taobao.org

# 拷贝所有源代码到工作目录
COPY . /usr/src/node-app/koa-server

# 暴露容器端口
EXPOSE 7001
# 启动node应用
CMD npm run dev


创建egg镜像

docker build -t eggnode .

创建egg服务容器

docker run -d --name eggnode -p 7001:7001 eggnode
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • itd 可连写

6 www/www1文件自动化部署sh

myoa.sh文件如下

# 进入到myoa项目目录下
cd mars/fe/myoa
# 拉取最新代码
git pull
# 下载node所有module(没有cnpm就用npm)
cnpm i --save
# 打包项目
npm run build
# 将打包好的文件拷贝到nginx代理的www文件目录下
cp -r ./dist/* ~/nginx/www

执行myoa.sh

sh myoa.sh

appweb.sh文件如下

# 进入到myoa项目目录下
cd mars/fe/app
# 拉取最新代码
git pull
# 下载node所有module(没有cnpm就用npm)
cnpm i --save
打包项目
npm run build
# 将打包好的文件拷贝到nginx代理的www文件目录下
cp -r ./build/* ~/nginx/www1

执行appweb.sh

sh appweb.sh

7 docker 具体命令参数链接地址

www.runoob.com/docker/dock…