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