美文网首页Docker容器
jenkins+docker+node+mongo前端视角下的部

jenkins+docker+node+mongo前端视角下的部

作者: 其实杰伦 | 来源:发表于2019-08-21 15:28 被阅读4次

#1.准备工作

  • 我不会照搬文档上官方的话术,完全凭自己的理解写,可能不规范,不喜欢请左上角
  • 你的服务器必须装好了docker,怎么装的自行研究
  • 你已经部署好了jenkins并且和github建立了hook链接,怎么的请参考我之前的文章
  • 网上很多文章都写明了什么是dockerdocker api之类的,建议阅读掌握基本概念,但是我觉得他们说的都太表面了,举个栗子:
    1. Dockerfile文件: 这个文件是用来docker build -t (your image name) .,就是用来制作docker镜像的,这是基础,建议放在项目根目录
    2. docker-compose.yml: 是docker官方的docker-compose插件的构建文件,用来生成多个相关联的docker container容器的快捷方式,这里有很大的坑,后续讨论,不用这个也可以,可以用docker run -----的建立方式,一个个的建立容器,同样可以达到效果,并且兼容性(服务器环境或者jenkins环境)更佳,建议放在项目根目录

#2.开整

  • 我们首先采用docker-compose的方式:
  1. 因为项目是个Koa服务,所以你得明白koa是node的一个框架,那么自然你必须得想到项目是基于node的,docker容器可以理解为一个干净的操作系统,那么操作系统你想运行node应用是不是要安装node呢,当然是了,项目根目录建立Dockerfile文件,如下:
#FROM是所有Dockerfile文件的必须,并且开头就要写明,意思是依赖的环境,我们的项目依赖node镜像,所以要写node,10是版本号。
#不用管我好像没有pull node image啊,没关系这里写了,就会自动帮你下载
FROM node:10
# Dockerfile的概念就是 build一个镜像用的 什么依赖都在这里写
# 起注释的作用
LABEL maintainer = "qsm <348867341@qq.com>"
# 创建容器中的工作目录,容器是一个干净的目录什么都没有,你想要放一个项目肯定要创建一些目录
#为了简单,这里创了一个根目录下面的app目录, 每次构建镜像都删除app目录,其实没必要因为你每次构建镜像都是一个感觉的
RUN rm -rf /app
RUN mkdir /app
# 创建工作目录就是容器内部的目录 必须指定
WORKDIR /app

# 安装项目依赖  将当前目录所有文件拷贝到上面创建的容器工作目录 忽略.dockerignore的文件 copy 和 add都会忽略
COPY . /app
# 安装yarn 
#RUN curl -o- -L https://yarnpkg.com/install.sh | bash
#RUN $HOME/.yarn/bin/yarn install
RUN yarn
#RUN npm install
#RUN npm run build
#ENV PORT=4403 NODE_ENV=pro
# 该镜像生产的容器内的端口号,相当于后续docker run -p 8827: 9930的9930
EXPOSE 4403

#容器生成时 执行 yarn run prd启动项目
CMD yarn run prd
  1. node服务的镜像构建文件写好了,下面就是生成容器了,项目根目录新建docker-compose.yml文件,前提是你服务器安装了docker-compose,怎么装的请百度,如下:
#  写死就行  compose的版本 如果你的jenkins 支持docker componse 的话 用这个方法
version: '3.1'
services:
#services的名字 其他services需要关联的时候有用
  database:
#node依赖的mongo镜像,会自动帮你下载
    image: mongo
#容器的名字,建议声明
    container_name: xipasswordmongo
#总是重启
    restart: always
    # 映射到宿主机的端口,宿主27018,容器内27017(自己根据需要赋值)
    ports:
      - 27018:27017
#映射到宿主机的mongo目录,当你需要在宿主机也需要相应文件的时候,比如志,
#你总不能每次都进容器看吧,这样挂载到宿主机,会方便一些
#右边的/data/db是Mongo镜像默认生成的工作目录,你自定义的是:左边的
    volumes:
      - /usr/local/mongo:/data/db
#创建一个容器内的网络桥接,可以很方便的容器互联,比如node链接mongo,不需要写公网Ip了
#可以直接写mongods://(your container name):(容器内端口号)
   networks:
      - webapp-network
  web:
    # 你docker build 的镜像名(就是dockerfile 运行 build 生成的那个镜像)  因为镜像依赖的node镜像所有包含了 node了环境
    image: "qsmben/xitupassword"
    # 指定一个别名
    container_name: xipasswordkoa
    restart: always
    #保持一致 前面是你的宿主机目录 /app在docker里面创建的工作目录  注意:mac下挂在文件 仅仅支持 /Users /Volumes /tmp
    #volumes:
     #- /usr/local/nodefile/node/password:/app
    #links: 
    # - database
    # 依赖上面的数据库
    links:
     - database
    depends_on:
     - database
      #我在js里面手动写了
    #environment: 
    #  - NODE_ENV=pro 
    # 4403是 dockerfile暴露出来的端口  尽量和Node的端口全部保持一致 避免混乱
    ports:
      - 4403:4403
    networks:
      - webapp-network
#创建链接桥
networks:
  webapp-network:
    driver: bridge
  1. 运行docker-compose up -d, 不出意外会新建两个容器, docker ps -a查看:
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                    PORTS                                NAMES
bc64dfdba38e        qsmben/xitupassword   "docker-entrypoint..."   3 hours ago         Up 3 hours                0.0.0.0:4403->4403/tcp               xipasswordkoa
0687206883aa        docker.io/mongo       "docker-entrypoint..."   17 hours ago        Up 17 hours               0.0.0.0:27018->27017/tcp             xipasswordmongo
  1. 如果不行,恭喜您 和我一样, 服务器无论如何都装不上docker-compose,我也谷歌过各种方法没啥用,遂放弃这种方法,采用官网的run方法。
  • docker run 方法, 直接贴代码和上面的都是对应的,很容易理解:
#创建容器内的网络桥接    
  docker network create -d bridge xituNet

   # mongo 容器
   docker run \
   -d \
   --name xipasswordmongo \
   -u root \
   -p 27018:27017 \
   -v /usr/local/mongo:/data/db \
   --network xituNet \
   docker.io/mongo

# node服务 容器 依赖mongo
 docker run \
   -d \
   -it \
   --rm \
  --name xipasswordkoa \
   -u root \
   -p 4403:4403 \
   --link xipasswordmongo \
   --network xituNet \
   qsmben/xitupassword

#3.jenkins配置

  • 上面连各种构建容器的方法,到底在哪运行比较合适呢,如果你采用jenkins 持续构建那肯定写在jenkins构建服务里比较合适,在jenkins的构建栏目选择执行shell,然后填入 配置如下:
whoami 
echo '开始项目构建命令'
echo $PATH
node -v
npm -v
echo '当前分支'
git branch -a

echo '拉代码'
git config -l
git pull origin master

echo 'docker image'
docker image ls 
echo 'docker container'
docker ps -a


echo 'build docker image'

echo '停止之前的docker容器和删除'
#/usr/local/bin/docker-compose down
docker stop xipasswordkoa 
docker rm xipasswordkoa
docker rmi qsmben/xitupassword
docker build -t qsmben/xitupassword .
echo '构建compose'

docker run \
  -d \
  -it \
  --rm \
 --name xipasswordkoa \
  -u root \
  -p 4403:4403 \
  --link xipasswordmongo \
  --network xituNet \
  qsmben/xitupassword

#ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose
#chmod 0755 /usr/local/bin/docker-compose
#docker-compose up -d
#docker-compose up -d

echo '容器运行列表'
docker ps -a
echo '镜像列表'
docker image ls
  • 上面的注释基本告诉了啥意思,还是那句话如果docker-compose没问题采用docker-compose,不行的话就跟我一样用docker run好了, 我这里只每次git提交 构建koa的node应用,因为mongo的容器基本不需要变动的,又不是业务代码,所以你在服务器内手动构建一次就好了。
  • 如果不遇到不懂的api或者对docker不明白,强烈建议看docker中文文档
  • 写完了,告辞!

相关文章

  • jenkins+docker+node+mongo前端视角下的部

    #1.准备工作 我不会照搬文档上官方的话术,完全凭自己的理解写,可能不规范,不喜欢请左上角 你的服务器必须装好了d...

  • 前端视角下的Ruby

    请把话筒转交给我,对Ruby我有一些逼要装。 在Beansmile做前端已经有半年多了,这件四川特产我还留着。倒不...

  • 大型网站技术架构-瞬时响应高性能架构-网站性能测试

    1、不同视角下的网站性能 1)用户视角的网站性能: 使用前端架构优化手段:优化页面HTML样式、利用浏览器端的并发...

  • 深入分析:微信小程序与H5的区别

    作为前端工程师,从前端的视角,为大家分析下微信小程序和HTML5与之间的主要区别 第一条是运行环境的不同。 传统的...

  • 前端规范

    常用html、CSS、javascript前端命名规范无论是从技术角度还是开发视角,对于web前端开发规范文档都有...

  • 墨镜下的视角

  • 夕阳下的视角

    夕阳西下时,我刚好从楼里出来。没走多远,忽然,我的眼睛被一道刺眼的光亮“闪”了一下。我定睛一看,只见在路旁灯柱上,...

  • 视角学实践论(7):【认知视角】初阶训练

    视角学之实践次第,总体上而言包括三大部分:认知视角、训练视角、妙用视角。 先说第一部分:认知视角。 视角学所说的视...

  • 前端视角的WEEX入门

    最近在看关于跨端开发的技术,出现在视野里较多的关键字React Native、WEEX、Flutter,不论宣传的...

  • 我们都在错过

    匆匆三年,如果站在学生的视角,如一部冗长无味的书,从自己的视角,是一部前差后优的电影,但从爱你的人的视角,确实一...

网友评论

    本文标题:jenkins+docker+node+mongo前端视角下的部

    本文链接:https://www.haomeiwen.com/subject/xpwbsctx.html