最近也是在准备为练手的 flutter项目 写个后台和接口,准备先部署到线上。因此抽空研究了下jenkins 和 docker 的持续性部署。目前这种技术也是被广大公司所使用吧。也感谢你们给个starhtml
首先咱们得有一台服务器。我这里用的是阿里云ECS,华东节点。具体的购买操做的话百度会有教程。购买完成之后你会有一个公网的ip,以及一个经过ssh登陆服务器的密码。vue
关于Docker的话,若是不了解的能够先去看文档。Docker的Container(容器)就像轮船上的集装箱。集装箱各自装着各自的货物,互不影响。好比一个Redis服务,一个Mongodb服务,均可以放到一个单独的Container(集装箱)里面。而这些容器,又依赖一个执行环境。这个执行环境就是Docker所说的Image(镜像)。每个Container管理着本身的生命周期。node
Jenkins是一款由Java开发的开源软件项目,主要是用来持续集成的。至关于就是预先写好脚本,调试成功以后,下一次若是再须要部署的时候就会自动执行上一次存储的脚本,无需再修改。linux
参考文档nginx
$ sudo apt-get remove docker docker-engine docker.io
复制代码
因为 apt 源使用 HTTPS 以确保软件下载过程当中不被篡改。所以,咱们首先须要添加使用 HTTPS 传输的软件包以及 CA 证书。git
$ sudo apt-get update
复制代码
$ sudo apt-get install
apt-transport-https \
ca-certificates \
curl \
software-properties-common
复制代码
鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。github
为了确认所下载软件包的合法性,须要添加软件源的 GPG 密钥。docker
$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 官方源
# $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
复制代码
而后,咱们须要向 source.list 中添加 Docker 软件源shell
$ sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \ $(lsb_release -cs) \ stable"
# 官方源
# $ sudo add-apt-repository \
# "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
# $(lsb_release -cs) \
# stable"
复制代码
以上命令会添加稳定版本的 Docker CE APT 镜像源,若是须要测试或每日构建版本的 Docker CE 请将 stable 改成 test 或者 nightly。npm
更新 apt 软件包缓存,并安装 docker-ce:
$ sudo apt-get update
$ sudo apt-get install docker-ce
复制代码
在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可使用这套脚本安装:
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun
复制代码
执行这个命令后,脚本就会自动的将一切准备工做作好,而且把 Docker CE 的 Edge 版本安装在系统中
$ sudo systemctl enable docker
$ sudo systemctl start docker
复制代码
默认状况下,docker 命令会使用 Unix socket 与 Docker 引擎通信。而只有 root 用户和 docker 组的用户才能够访问 Docker 引擎的 Unix socket。出于安全考虑,通常 Linux 系统上不会直接使用 root 用户。所以,更好地作法是将须要使用 docker 的用户加入 docker 用户组。
创建 docker 组:
$ sudo groupadd docker
复制代码
将当前用户加入 docker 组:
$ sudo usermod -aG docker $USER
复制代码
退出当前终端并从新登陆,进行以下测试。
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
复制代码
若能正常输出以上信息,则说明安装成功。
若是在使用过程当中发现拉取 Docker 镜像十分缓慢,能够配置 Docker 国内镜像加速。
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
复制代码
$ sudo chmod +x /usr/local/bin/docker-compose
复制代码
$ docker-compose --version
复制代码
在安装jenkins我选择了使用docker-compose
docker-compose 是一个用来把 docker 自动化的东西
有了 docker-compose 你能够把全部繁复的 docker 操做全都一条命令,自动化的完成。
/home/jenkins
- docker-compose.yml
- jenkins-home
复制代码
version: '3' # 指定 docker-compose.yml 文件的写法格式
services: # 多个容器集合
docker_jenkins:
user: root # 为了不一些权限问题 在这我使用了root
restart: always # 重启方式
image: jenkins/jenkins:lts # 指定服务所使用的镜像 在这里我选择了 LTS (长期支持)
container_name: jenkins # 容器名称
ports: # 对外暴露的端口定义
- '8080:8080'
- '50000:50000'
volumes: # 卷挂载路径
- /home/jenkins/jenkins_home/:/var/jenkins_home # 这是咱们一开始建立的目录挂载到容器内的jenkins_home目录
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker # 这是为了咱们能够在容器内使用docker命令
- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose # 一样的这是为了使用docker-compose命令
复制代码
咱们须要进入到 jenkins 目录下执行:
$ docker-compose up -d
复制代码
这个命令会帮咱们自动拉取镜像并配置
不出意外你如今能够打开你的服务器地址 http://xxxxxxx:端口号 就能看到这个界面:
打开你所建立的jenkins目录进入到jenkins-home
/home/jenkins/jenkins-home
进入 secrets 目录
$ cat initialAdminPassword
复制代码
而后把里面的文本复制出来填到管理员密码中
接下来须要安装两个插件
NodeJS Plugin
Publish Over SSH
复制代码
而后咱们滑到最下方
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.lovelp.xin; # 域名
location / {
root /app; # 指向目录
index index.html;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
复制代码
FROM node
WORKDIR /app
COPY package*.json ./ RUN npm install -g cnpm --registry=https://registry.npm.taobao.org RUN cnpm install COPY ./ /app RUN npm run build:prod
FROM nginx
RUN mkdir /app COPY --from=0 /app/dist /app COPY nginx.conf /etc/nginx/nginx.conf
复制代码
#!/usr/bin/env bash
image_version=`date +%Y%m%d%H%M`;
# 关闭shop_admin容器
docker stop shop_admin || true;
# 删除shop_admin容器
docker rm shop_admin || true;
# 删除shop/admin镜像
docker rmi --force $(docker images | grep shop/admin | awk '{print $3}')
# 构建shop/admin:$image_version镜像
docker build . -t shop/admin:$image_version;
# 查看镜像列表
docker images;
# 基于shop/admin 镜像 构建一个容器 shop_admin
docker run -p 9527:80 -d --name shop_admin shop/admin:$image_version;
# 查看日志
docker logs shop_admin;
#删除build过程当中产生的镜像 #docker image prune -a -f
docker rmi $(docker images -f "dangling=true" -q)
# 对空间进行自动清理
docker system prune -a -f
复制代码
最后咱们就能够愉快的 Build Now
了
文采很差 因此大部分采用了截图的方式 但愿你们多多包涵,后续会出一篇node的部署方式,文章就到此结束了,有赞的给个赞 O(∩_∩)O哈哈~