如果您对docker-Django容器化部署感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于docker-Django容器化部署的详细内容,我们还将为您解答项目docker容
如果您对docker-Django容器化部署感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于docker-Django容器化部署的详细内容,我们还将为您解答项目docker容器化部署步骤的相关问题,并且为您提供关于.Net Core+Nginx+Mysql使用Docker-Compose实现多容器化部署、AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排、AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署、BI 系统打包 Docker 镜像及容器化部署的具体实现的有价值信息。
本文目录一览:- docker-Django容器化部署(项目docker容器化部署步骤)
- .Net Core+Nginx+Mysql使用Docker-Compose实现多容器化部署
- AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排
- AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署
- BI 系统打包 Docker 镜像及容器化部署的具体实现
docker-Django容器化部署(项目docker容器化部署步骤)
首先实现Django+docker本地部署
前期准备
软件安装
软件安装Docker:学习 Docker 当然要安装 Docker 软件了(免费的社区版),安装方法见官方文档。
Docker-compose:这是 Docker 官方推出的用于编排、运行多个容器的工具,安装方法见官方文档。本教程大部分内容都与它有关。
python3:教程部署的是 Django 项目,那 python3 是当然要有的了(包括 python 的包管理工具 pip)。
安装Python虚拟环境
创建虚拟环境
python3 -m venv blog_test
激活虚拟环境
. blog_test/bin/activate
创建Django项目
安装django2.2版本
pip install django==2.2 -i https://pypi.douban.com/simple/
去到一个喜欢的目录
cd /Users/zhihu/PycharmProjects/
创建DjangoAPP
django-admin startproject django_app
切换进Django app内
cd django_app
迁移数据
python manage.py migrate
注意:
教程后面的内容全部都在此目录中操作了。
为方便阅读,命令提示符 $ 代表目前在项目根目录 django_app/,
MysqL $ 则代表目前在目录 django_app/MysqL/ 中,请读者操作时稍加留意当前的工作目录
docker构建项目
Docker 的整个生命周期由三部分组成:镜像(image)+ 容器(container)+ 仓库(repository)。
容器是由镜像实例化而来 ,这有点像面向对象的概念:镜像就是类,容器是类实例化之后的对象。
镜像 是一个只读的模板,它包括了运行容器所需的数据。镜像可以包含一个完整的 Linux 操作环境,里面仅安装了 Python 或者其他用户需要的程序。
容器 是由镜像创建出来的实例,类似虚拟机,里面可以运行特定的应用,并且容器与容器是相互隔离的。
仓库 概念与 Git 和 Github 类似,如果你用过它们就非常容易理解。Docker 使用的默认仓库是由官方维护的 Docker hub 公共仓库,从中上传、拉取的操作类似 Git。
docker基本命令
查看镜像
docker images
查看容器
docker ps -a
docker rmi [images ID] # 删除此 ID 的镜像
docker container stop [container ID] # 停止此 ID 的容器
docker container start [container ID] # 启动此 ID 的容器
docker container rm [container ID] # 删除此 ID 的容器
Dockerfile
Docker 允许通过文本格式的配置文件来构建镜像,默认名称为 Dockerfile。因此在项目根目录新建文件 Dockerfile,写入:
# 从仓库拉取 带有 python 3.8 的 Linux 环境
FROM python:3.8
# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1
# 创建 code 文件夹并将其设置为工作目录
RUN mkdir /code
# 移动至code目录
workdir /code
RUN pip install pip -U -i https://pypi.douban.com/simple/
ADD requirements.txt /code/
RUN pip install -r requirements.txt -i https://pypi.douban.com/simple/
# 将当前目录复制到容器的 code 目录
ADD . /code/
理解这些 Docker 指令的关键在于,一定要牢记容器里的环境和外界(宿主机)是隔离的,它两是完全不一样的。
换句话说,要搞清楚哪些操作是针对宿主机、哪些操作是针对容器。
FROM python:3.7 指令从仓库拉取一个包含 python 3.7 的 Linux 操作系统环境(Linux 版本为 Debian)。
RUN 和 workdir 指令都是针对容器的,功能是在容器里创建目录、并将其设置为工作目录。注意宿主机是没有这个目录的。
ADD 指令出现了两次。
ADD requirements.txt /code/ 意思是将宿主机当前目录(即 Dockerfile 所在目录)的 requirements.txt 文件复制到容器的 /code 目录中。
ADD . /code/ 意思是把当前目录所有内容复制到容器 /code/ 目录,注意中间那个点。
导入当前虚拟环境的依赖
pip freeze > requirements.txt
当前文件目录
django_app
- Dockerfile
- requirements.txt
- manage.py
- django_app
- db.sqlite3
Docker-compose
Docker-compose在线上环境中,通常不会将项目的所有组件放到同一个容器中;更好的做法是把每个独立的功能装进单独的容器,这样方便复用。比如将 Django 代码放到容器A,将 MysqL 数据库放到容器B,以此类推。
因此同一个服务器上有可能会运行着多个容器,如果每次都靠一条条指令去启动,未免也太繁琐了。 Docker-compose 就是解决这个问题的,它用来编排多个容器,将启动容器的命令统一写到 docker-compose.yml 文件中,以后每次启动这一组容器时,只需要 docker-compose up 就可以了。因此教程也会用 docker-compose 来管理容器。
首先确认 docker-compose 是否安装成功:
$ docker-compose -v
docker-compose version 1.24.1, build 4667896b
确认无误后,在项目根目录创建 docker-compose.yml 并写入:
version: "3"
services:
app:
restart: always
build: . # '点'代表当前目录
command: "python3 manage.py runserver 0.0.0.0:8000"
volumes:
- .:/code
ports:
- "8000:8000"
让我们来分解一下其中的各项含义。
version 代表 docker-compose.yml 的版本,目前最新版为 3,不需要改动它。
接着定义了一个名叫 app 的容器。后面的内容都是 app 容器的相关配置:
- restart :除正常工作外,容器会在任何时候重启,比如遭遇 bug、进程崩溃、docker 重启等情况。
- build :指定一个包含 Dockerfile 的路径,并通过此 Dockerfile 来构建容器镜像。注意那个 "." ,代表当前目录。
- command :容器运行时需要执行的命令。这里就是我们很熟悉的运行开发服务器了。
- volumes :卷,这是个很重要的概念。前面说过容器是和宿主机完全隔离的,但是有些时候又需要将其连通;比如我们开发的 Django 项目代码常常会更新,并且更新时还依赖如 Git 之类的程序,在容器里操作就显得不太方便。所以就有卷,它定义了宿主机和容器之间的映射:"." 表示宿主机的当前目录,":" 为分隔符,"/code" 表示容器中的目录。即宿主机当前目录和容器的 /code 目录是连通的,宿主机当前目录的 Django 代码更新时,容器中的 /code 目录中的代码也相应的更新了。这有点儿像是在容器上打了一个洞,某种程度上也是实用性和隔离性的一种妥协。
严格意义上讲,这里用到的 .:/code 并不是卷,而是叫挂载,它两是有区别的,只不过 docker-compose 允许将挂载写到卷的配置中。后面章节会讲到。 - ports :定义了宿主机和容器的端口映射。容器的隔离不止环境,甚至连端口都隔离起来了。但 web 应用不通过端口跟外界通信当然不行,因此这里定义将宿主机的 8000 端口映射到容器的 8000 端口,即访问宿主机的 8000 端口就是访问到了容器的 8000 端口,但要确保端口没有被其他程序占用
配置就写好了。现在项目的目录结构如下:
django_app
- docker-compose.yml
- Dockerfile
- requirements.txt
- manage.py
- django_app
- db.sqlite3
测试
在项目跟目录启动输入指令 docker-compose up 启动容器服务:
可以看到 Docker 按照配置文件的要求,成功构建了镜像及容器,并启动了容器。
打开浏览器,输入本地 IP 端口 127.0.0.1:8000 :
看到 Django 的小火箭,项目成功运行起来啦。按 Ctrl + C 即可停止开发服务器运行。
停止服务器后实际上容器还存在,只是停止运行了而已。输入:
删除容器
$ docker-compose down
如果想在后台运行容器,则输入:
$ docker-compose up -d
如果你需要重新构建镜像,则输入命令
$ docker-compose build
启动和停止已有的容器:
$ docker-compose start
$ docker-compose stop
正常流程
docker-compose up 启动容器
启动和停止已有的容器即可:
$ docker-compose start
$ docker-compose stop
速度太慢
解决方法就是将资源拉取链接修改为国内的镜像源,比如清华的镜像源。
修改 Dockerfile 如下:
FROM python:3.8
ENV PYTHONUNBUFFERED 1
# 添加 Debian 清华镜像源
RUN echo \
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free\
> /etc/apt/sources.list
RUN mkdir /code
workdir /code
# 添加 pip 清华镜像源
RUN pip install pip -U -i https://pypi.tuna.tsinghua.edu.cn/simple
ADD requirements.txt /code/
# 添加 pip 清华镜像源
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
ADD . /code/
总结
本章初步感受了 Docker 的工作流程,并且很轻松的构建了一个容器化的 Django 项目。
下一章将 MysqL 数据库也加入到容器编排中。
参考
杜赛
docker相关线上文档
.Net Core+Nginx+Mysql使用Docker-Compose实现多容器化部署
一:构建docker-compose.yml文件
version: '3' services: MysqL.db: container_name: MysqL.db image: MysqL restart: always environment: MysqL_ROOT_PASSWORD: xxxxx command: --lower_case_table_names=1 #--initialize-insecure volumes: - /home/MysqL/:/var/lib/MysqL ports: - 3306:3306 dotnetapi: container_name: dotnetapicontains build: . depends_on: - MysqL.db links: - MysqL.db reverse-proxy: container_name: reverse-proxy image: Nginx depends_on: - dotnetapi ports: - "5002:5002" volumes: - ./proxy.conf:/etc/Nginx/conf.d/default.conf
其中定义了三个服务:
- myql.db:使用MysqL镜像,并挂载当前项目下的/home/MysqL/文件夹来持久化存储,参数顺序一定不要乱,不然会入坑。,
--lower_case_table_names=1数据库忽略大小写
- dotnetapi:基于当前项目构建的容器服务,依赖于MysqL.db服务。
- reverse-proxy:使用Nginx定义反向代理服务,其中挂载了当前项目下的proxy.conf文件作为反向代理配置文件。其中proxy.conf的配置如下(注意proxy_pass指定的url为http://dotentapi:5002)
二:构建proxy.conf文件
server { listen 5002; location / { proxy_pass http://dotnetapi:5002; } }
三:使用docker-compose命令发布
docker-compose up -d #后台运行 docker-compose up
AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排
一.前言
上一篇部署了一个最基础的helloworld应用,创建了两个容器和一个network,还算应付得过来。
如果该应用继续引入mysql、redis、job等若干服务,到时候发布一次得工作量之大就可想而知了,这时候就需要用到Docker Compose。
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,可以使用YAML文件来配置应用程序的服务,然后使用一条命令就可以从配置中创建并启动所有服务。
Docker Compose概述及命令使用 https://docs.docker.com/compose/reference/overview/
二.安装Compose
Windows下安装Docker Desktop时已经附带安装了Docker Compose
PS C:\Users\Administrator> docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.0.2o 27 Mar 2018
Linux下需要自行安装
root@VM-16-9-ubuntu:~# apt install docker-compose
三.使用Compose
1.编排服务
在解决方案下创建docker-compose.yml文件
version: ''3.4''
services:
helloworld:
image: helloworld:v2.0
build: #镜像构建
context: . #工作目录
dockerfile: HelloWorld/Dockerfile #Dockerfile位置
environment: #环境变量
- ASPNETCORE_ENVIRONMENT=Development
ports: #端口映射
- "81:80"
container_name: netcore_helloworld #容器名
deploy:
restart_policy: #重启策略
condition: on-failure
delay: 5s
max_attempts: 3
networks: #指定network
- default
- newbridge
mynginx:
image: mynginx:v2.0
build:
context: MyNginx
dockerfile: Dockerfile
ports:
- "80:80"
- "801:801"
container_name: mynginx
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
networks:
- default
networks:
default: #定义一个docker中已存在的network
external:
name: mybridge
newbridge: #新的network
#name: newbridge #compose版本3.5开始才支持自定义名称
2.启动容器
https://docs.docker.com/compose/reference/up/
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
docker-compose up指令包含了docker-compose build,当yml文件services中配置的image(helloworld:v2.0和mynginx:v2.0)不存在时会先build这两个镜像,再创建container,
如果image已存在,则直接创建container
PS C:\Users\Administrator> cd C:\Users\Administrator\source\repos\AspNetCore_Docker
PS C:\Users\Administrator\source\repos\AspNetCore_Docker> docker-compose up -d
WARNING: Some services (helloworld, mynginx) use the ''deploy'' key, which will be ignored. Compose does not support ''deploy'' configuration - use `docker stack deploy` to deploy to a swarm.
Creating network "aspnetcore_docker_newbridge" with the default driver
Creating netcore_helloworld ... done
Creating mynginx ... done
PS C:\Users\Administrator\source\repos\AspNetCore_Docker> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx v2.0 9c18561d7ab3 27 minutes ago 109MB
helloworld v2.0 c42e9f575fc4 24 hours ago 265MB
nginx latest 62c261073ecf 9 days ago 109MB
mcr.microsoft.com/dotnet/core/sdk 2.2-stretch e4747ec2aaff 3 weeks ago 1.74GB
mcr.microsoft.com/dotnet/core/aspnet 2.2-stretch-slim f6d51449c477 3 weeks ago 260MB
docker4w/nsenter-dockerd latest 2f1c802f322f 8 months ago 187kB
PS C:\Users\Administrator\source\repos\AspNetCore_Docker> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
66ff08eda2ae helloworld:v2.0 "dotnet HelloWorld.d…" 11 minutes ago Up 11 minutes 0.0.0.0:81->80/tcp netcore_helloworld
5357b641a7b1 mynginx:v2.0 "nginx -g ''daemon of…" 11 minutes ago Up 11 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp mynginx
3.删除容器
PS C:\Users\Administrator\source\repos\AspNetCore_Docker> docker-compose down
WARNING: Some services (helloworld, mynginx) use the ''deploy'' key, which will be ignored. Compose does not support ''deploy'' configuration - use `docker stack deploy` to deploy to a swarm.
Stopping mynginx ... done
Stopping netcore_helloworld ... done
Removing mynginx ... done
Removing netcore_helloworld ... done
Network mybridge is external, skipping #外部的bridge不会被删除,直接跳过
Removing network aspnetcore_docker_newbridge
四.远程镜像仓库
docker官方的只能创建一个免费私有仓库,国内各大云服务器商都有提供免费的、无限量的镜像仓库。
1.登录到远程registry
docker login --username=[username] ccr.ccs.tencentyun.com
PS C:\Users\Administrator> docker login --username=你的用户名 ccr.ccs.tencentyun.com
Password:
Login Succeeded
2.上传镜像
docker tag [ImageId] ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]
PS C:\Users\Administrator> docker tag c42e9f575fc4 ccr.ccs.tencentyun.com/wuuu/helloworld
PS C:\Users\Administrator> docker tag 9c18561d7ab3 ccr.ccs.tencentyun.com/wuuu/mynginx
PS C:\Users\Administrator> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ccr.ccs.tencentyun.com/wuuu/mynginx latest 9c18561d7ab3 2 days ago 109MB
mynginx v2.0 9c18561d7ab3 2 days ago 109MB
ccr.ccs.tencentyun.com/wuuu/helloworld latest c42e9f575fc4 3 days ago 265MB
helloworld v2.0 c42e9f575fc4 3 days ago 265MB
nginx latest 62c261073ecf 12 days ago 109MB
mcr.microsoft.com/dotnet/core/sdk 2.2-stretch e4747ec2aaff 3 weeks ago 1.74GB
mcr.microsoft.com/dotnet/core/aspnet 2.2-stretch-slim f6d51449c477 3 weeks ago 260MB
docker4w/nsenter-dockerd latest 2f1c802f322f 8 months ago 187kB
PS C:\Users\Administrator>
docker push ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]
PS C:\Users\Administrator> docker push ccr.ccs.tencentyun.com/wuuu/helloworld
The push refers to repository [ccr.ccs.tencentyun.com/wuuu/helloworld]
...
latest: digest: sha256:d991fe759257905f727593cc09d8299462e20e31ada3a92023a48fbc130f7484 size: 1581
PS C:\Users\Administrator> docker push ccr.ccs.tencentyun.com/wuuu/mynginx
The push refers to repository [ccr.ccs.tencentyun.com/wuuu/mynginx]
...
latest: digest: sha256:0eda000278411f5b6e034944993f6f5b94825125124f67cc7caf4e684aad5a85 size: 1155
PS C:\Users\Administrator>
2.通过远程镜像启动容器
在原yml文件基础上移除build项,修改image地址。
docker compose up会从远程仓库pull镜像并启动容器,如果是私有仓库,需要提前登录到远程registry。
version: ''3.4''
services:
helloworld:
image: ccr.ccs.tencentyun.com/wuuu/helloworld
environment: #环境变量
- ASPNETCORE_ENVIRONMENT=Development
ports: #端口映射
- "81:80"
container_name: netcore_helloworld #容器名
deploy:
restart_policy: #重启策略
condition: on-failure
delay: 5s
max_attempts: 3
networks: #指定network
- default
- newbridge
mynginx:
image: ccr.ccs.tencentyun.com/wuuu/mynginx
ports:
- "80:80"
- "801:801"
container_name: mynginx
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
networks:
- default
networks:
default: #定义一个docker中已存在的network
external:
name: mybridge
newbridge: #新的network
#name: newbridge #compose版本3.5开始才支持自定义名称
示例代码Github地址:https://github.com/wwwu/AspNetCore_Docker
- AspNetCore容器化(Docker)部署(一) —— 入门
- AspNetCore容器化(Docker)部署(二) —— 多容器通信
- AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排
- AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署
AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署
一.前言
(Jenkins、Docker、Git/Svn组建一套简单的自动化发布流程)
文章中用到的相关服务器角色
角色 | 环境 | 功能 |
开发机 | Win10、Docker(Linux OS) | 编码、调试 |
发布机(与开发机共享) | Win10、Docker(Linux OS)、Jenkins | 自动化部署 |
测试服务器 | Ubuntu、Docker | 测试环境 |
二.安装jenkins
1.Windows下安装jenkins
各环境下安装教程 https://jenkins.io/zh/doc/book/installing/
Windows下载地址:https://jenkins.io/zh/download/thank-you-downloading-windows-installer-stable
建议jinkens还是安装在docker的宿主机上,不论是windows还是linux,容器形式安装虽然很方便!但是后续很多坑,比如jenkins容器内共享宿主机docker和容器内运行docker-compose
下面是docker下安装的一些笔记(没走通),最终选择了宿主机下安装jinkens
PS C:\Users\Administrator> docker run -u root -d -p 8080:8080 -p 50000:50000 -v /e/DockerData:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean c8222a3716a327ce82770aa729fe80169cbcc28c4d2ada8891cf49ed0b38f3e3 PS C:\Users\Administrator> docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c8222a3716a3 jenkinsci/blueocean "/sbin/tini -- /usr/…" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp serene_feistel 66ff08eda2ae c42e9f575fc4 "dotnet HelloWorld.d…" 2 days ago Up 2 days 0.0.0.0:81->80/tcp netcore_helloworld 5357b641a7b1 9c18561d7ab3 "Nginx -g 'daemon of…" 2 days ago Up 2 days 0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp myNginx
-v /e/DockerData:/var/jenkins_home,把jenkins_home目录(包含插件、配置、工作数据)挂载到宿主机。
这里宿主机是windows,/e/DockerData相当于"e:\DockerData",前提是e盘必须被设置为Shared Drives,如果未设置会弹出提示。
/var/run/docker.sock:/var/run/docker.sock,映射宿主机的docker到jenkins容器。
进入jenkins容器内,查看宿主机docker信息
PS C:\Users\Administrator> docker exec -it c8222a3716a3 bash bash-4.4# docker version Client: Version: 18.09.1-ce API version: 1.39 Go version: go1.11.4 Git commit: 4c52b901c6cb019f7552cd93055f9688c6538be4 Built: Fri Jan 11 15:41:33 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.2 API version: 1.39 (minimum version 1.12) Go version: go1.10.6 Git commit: 6247962 Built: Sun Feb 10 04:13:06 2019 OS/Arch: linux/amd64 Experimental: false
还需要安装docker-compose,否则shell脚本通过compose来构建镜像时会报docker-compose not found。
docker-compose安装教程 https://docs.docker.com/compose/install/
这里跟宿主机不同的是,要选择在容器内的安装方式“INSTALL AS A CONTAINER”
PS C:\Users\Administrator> docker-compose -v #查看宿主机docker-compose版本 docker-compose version 1.23.2, build 1110ad01 PS C:\Users\Administrator> docker exec -it c8222a3716a3 bash #进入jenkins容器 bash-4.4# curl -L --fail https://github.com/docker/compose/releases/download/1.23.2/run.sh -o /usr/local/bin/docker-compose #bash脚本安装compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 596 0 596 0 0 587 0 --:--:-- 0:00:01 --:--:-- 587 100 1666 100 1666 0 0 831 0 0:00:02 0:00:02 --:--:-- 2127 bash-4.4# chmod +x /usr/local/bin/docker-compose bash-4.4# Unable to find image 'docker/compose:1.23.2' locally 1.23.2: Pulling from docker/compose 4fe2ade4980c: Pull complete 658ccff8d4f1: Pull complete 71166c3c8d42: Pull complete c246ed86dd59: Pull complete Digest: sha256:f6e4963cd17f709fb57f7cf0842e269ed6ba173c3490055b50c701a257feb860 Status: Downloaded newer image for docker/compose:1.23.2 bash-4.4# docker-compose -v #查看jenkins容器内compose版本 docker-compose version 1.23.2, build 1110ad01
2.登入jenkins
浏览器打开localhost:8080
根据提示找到initialAdminPassword文件中的初始密码
接下来根据导航依次执行“安装默认插件” ,“创建jenkins账号”,“登入jenkins”
三.创建jenkins发布项目
1.新建Item
2.源码设置
如果是私有仓库需要加凭据Credentials
Failed to connect to repository:Error performing command:git.exe,如果有安装git,那就是“Global Tool Configuration”配置的git路径不对。
Manage Jenkins - Global Tool Configuration
设置正确的git.exe路径
设置好保存后再进入helloworld项目的配置页面。
3.构建触发器和构建环境
构建触发器,就是设置如何进行自动构建。如其他项目构建完后触发该项目的构建、定时构建(不论有没有代码变更)、轮询代码构建(jenkins轮询远程仓库有代码变更则进行构建)。
这里都不选,则需要在工作台使用手动(点击按钮)构建。
4.添加PowerShell脚本
linux选择shell,windows下建议用powershell,batch command对docker命令的支持不是很友好。
安装powershell插件
切换到“可选插件”选项卡,搜索powershell安装
添加构建命令
#定义变量 $IMAGE_VERSION='latest' $REGISTRY_USER='镜像仓库账号' $REGISTRY_PWD='镜像仓库密码' $REGISTRY_HOST='ccr.ccs.tencentyun.com' $REGISTRY_NAMESPACE='镜像仓库namespace' $SERVICE_HELLOWORLD='helloworld' $SERVICE_MYNginx='myNginx' #jenkins拉取的项目默认路径 “安装路径根目录/workspace/jenkins里面建的项目名” $COMPOSE_PATH='D:\Program Files (x86)\Jenkins\workspace\helloworld\docker-compose.yml' echo "------------------------------ 构建镜像 ------------------------------" docker-compose -f "${COMPOSE_PATH}" build echo "------------------------------ 登录远程仓库 ------------------------------" docker login --username=${REGISTRY_USER} --password=${REGISTRY_PWD} ${REGISTRY_HOST} echo "------------------------------ 标记镜像 ------------------------------" docker tag ${SERVICE_HELLOWORLD}:${IMAGE_VERSION} ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${SERVICE_HELLOWORLD}:${IMAGE_VERSION} docker tag ${SERVICE_MYNginx}:${IMAGE_VERSION} ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${SERVICE_MYNginx}:${IMAGE_VERSION} echo "------------------------------ 推送到远程仓库 ------------------------------" docker push ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${SERVICE_HELLOWORLD}:${IMAGE_VERSION} docker push ${REGISTRY_HOST}/${REGISTRY_NAMESPACE}/${SERVICE_MYNginx}:${IMAGE_VERSION} echo "------------------------------ 清理None ------------------------------" docker rmi $(docker images -f "dangling=true" -q)
5.远程SSH
安装”Publish Over SSH“插件,安装完之后,进入到”Manage Jenkins“ - "Configure System"中配置远程服务器
Passphrase:SSH密码
Path to key:SSH私钥的文件路径
Key:私钥串,如果“Key”和“Path to key”都设置,则“Key”的优先级较高
disable exec:禁止在目标机上执行命令
SSH Server 配置(指定远程服务器的ip,可以配置多个ssh server )
Name:SSH节点配置的名称,在Job中使用Publish over SSH插件时,此名称将出现在“SSH Server”中“Name”的下拉列表中,如下图:
Hostname:通过SSH连接到的远程主机名或IP
Username:SSH服务使用的用户名,使用key进行连接时为key指定的用户名
详见插件官方介绍页 https://wiki.jenkins.io/display/JENKINS/Publish+Over+SSH+Plugin
添加一个docker-compose.staging.yml提交到git仓库,用于测试环境。
version: '3.4' services: helloworld: image: ccr.ccs.tencentyun.com/wuuu/helloworld:latest environment: #环境变量 - ASPNETCORE_ENVIRONMENT=Development ports: #端口映射 - "81:80" container_name: netcore_helloworld deploy: restart_policy: #重启策略 condition: on-failure delay: 5s max_attempts: 3 networks: #指定network - newbridge myNginx: image: ccr.ccs.tencentyun.com/wuuu/myNginx:latest ports: - "80:80" - "801:801" container_name: myNginx deploy: restart_policy: condition: on-failure delay: 5s max_attempts: 3 networks: - newbridge networks: newbridge: #新的network #name: newbridge #compose版本3.5开始才支持自定义名称
继续之前的构建,“增加构建步骤“ - ”Send files or execute commands over SSH“
Name:选择刚刚配置的远程服务器”Staging_Server“
Source files:要上传的文件的相对路径,多个文件以逗号分隔。相对workspace的路径(其实是相对workspace下项目的路径),也支持表达式,如上图中的“**/*.war”。
如:我的项目通过jenkins git插件拉取下来,所在的目录是D:\Program Files (x86)\Jenkins\workspace\helloworld,docker-compose.staging.yml刚好在hellworld目录下,所以此处直接填文件名
如果yml文件在hellowrold/mycompose/目录下,则需要填写mycompose/docker-compose.staging.yml
Remove prefix:文件复制时要过滤的文件夹。
Remote directory:远程服务器上的文件夹,此文件夹路径是相对于“SSH Server”中的“Remote directory”。如果该文件夹不存在将会自动创建。
由于配置Staging_Server时Remote directory没有设置,并且时直接使用root账户登录Staging_Server的,所以Remote directory路径默认为root/
此处填/mydokcercompose,则文件会被复制到服务器的/root/mydokcercompose/docker-compose.staging.yml
Exec command:shell命令
#!/bin/bash #定义变量 REGISTRY_USER='镜像仓库账号' REGISTRY_PWD='镜像仓库密码' REGISTRY_HOST='ccr.ccs.tencentyun.com' COMPOSE_PATH='mydockercompose/docker-compose.staging.yml' echo ------------------------------ 登录远程仓库 ------------------------------ docker login --username=$REGISTRY_USER --password=$REGISTRY_PWD $REGISTRY_HOST echo ------------------------------ 卸载服务 ------------------------------ docker-compose -f $COMPOSE_PATH down echo ------------------------------ 拉取镜像 ------------------------------ docker-compose -f $COMPOSE_PATH pull echo ------------------------------ 启动服务 ------------------------------ docker-compose -f mydockercompose/docker-compose.staging.yml up -d echo ------------------------------ 清除None ------------------------------ docker rmi $(docker images -f "dangling=true" -q)
6.手动构建
7.完成
构建完成之后,查看构建日志是否有异常
查看jenkins服务器上构建的image
PS C:\Users\Administrator> docker images REPOSITORY TAG IMAGE ID CREATED SIZE ccr.ccs.tencentyun.com/wuuu/helloworld latest 4024cdbb87dc About an hour ago 265MB helloworld latest 4024cdbb87dc About an hour ago 265MB ccr.ccs.tencentyun.com/wuuu/myNginx latest daca457eb2a9 7 hours ago 109MB myNginx latest daca457eb2a9 7 hours ago 109MB mcr.microsoft.com/dotnet/core/sdk 2.2-stretch e4747ec2aaff 4 weeks ago 1.74GB mcr.microsoft.com/dotnet/core/aspnet 2.2-stretch-slim f6d51449c477 4 weeks ago 260MB
查看演示服务器的image和container
root@VM-16-9-ubuntu:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ccr.ccs.tencentyun.com/wuuu/helloworld latest 4024cdbb87dc About an hour ago 265MB ccr.ccs.tencentyun.com/wuuu/myNginx latest daca457eb2a9 7 hours ago 109MB root@VM-16-9-ubuntu:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e1dc94a1886b ccr.ccs.tencentyun.com/wuuu/myNginx:latest "Nginx -g 'daemon of…" 8 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp myNginx 3ad3db4fbd94 ccr.ccs.tencentyun.com/wuuu/helloworld:latest "dotnet HelloWorld.d…" 8 minutes ago Up 8 minutes 0.0.0.0:81->80/tcp netcore_helloworld
浏览器打开演示服务器IP:801
示例代码Github地址:https://github.com/wwwu/AspNetCore_Docker
- AspNetCore容器化(Docker)部署(一) —— 入门
- AspNetCore容器化(Docker)部署(二) —— 多容器通信
- AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排
- AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署
BI 系统打包 Docker 镜像及容器化部署的具体实现
在过去的几年中,"云" 作为明星热词站在了各种新潮技术之中,你可能使用过,但说不清它的原理;或者是没用过,但听过它的大名;也可能连它的名字都没听过,但你对这只蓝色鲸鱼一定十分眼熟。作为一名技术人员,只要你在这个软件行业里摸爬滚打,就一定对他有不同程度的了解。
Docker 是什么?
Docker 的 LOGO 十分有特点,一条鲸鱼载着很多集装箱,集装箱中满是要交付的货物。鲸鱼就是操作系统,而集装箱就是 Docker,集装箱中的就是要交付的货物,也就是应用程序。各种 "货物" 之间的尺寸、大小、形状是各不相同的,都要放到鲸鱼身上,那么就要考虑各种货物怎么安放,还得考虑货物之间能否重叠起来。于是就有了集装箱的概念,将每件货物都放到集装箱中,这样鲸鱼就可以有顺序的安放,省时省力。
那么就可以理解为:打包好的软件放到容器中,容器再放到操作系统中,就是简单的 "build——ship——run",这样就可以保证在自己电脑上怎么运行,在服务器上也是怎么运行,大大减少因为环境原因出错而导致程序运行错误,开发需要花费大量的精力去折腾环境。
Docker 作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,将镜像打包后上传到仓库,就可以发布应用到任意平台中。在使用时,只用一条命令就可以将镜像拉取到本地,然后一条命令就可以快速的将项目部署起来。这也完美的诠释了 Docker 的三大核心:镜像,容器,仓库。
那么,首先我们要来了解一下 Docker 的优势:
1. 快
运行时的性能可以获取极大提升(经典的案例是提升 97%)。
管理操作(启动,停止,开始,重启等等) 都是以秒或毫秒为单位的。
- 敏捷
像虚拟机一样敏捷,成本更低,部署方式简单。
- 灵活
将应用和系统 "容器化",不添加额外的操作系统。
- 轻量
你会拥有足够的 "操作系统",仅需添加或减小镜像即可。在一台服务器上可以布署 100~1000 个 Containers 容器。
5. 便宜
开源的,免费的,低成本的。由现代 Linux 内核支持并驱动。注 * 轻量的 Container 必定可以在一个物理机上开启更多 "容器",注定比 VMs 要便宜。
- 云支持
云服务提供创建和管理 Linux 容器框架。
在之前的文章,我们也系统地介绍过 Docker,感兴趣的同学可以戳:
第一章:Docker 与 k8s 的恩怨情仇(一)— 成为 PaaS 前浪的 Cloud Foundry
第二章:Docker 与 k8s 的恩怨情仇(二)— 用最简单的技术实现 "容器"
第三章:Docker 与 k8s 的恩怨情仇(三)— 后浪 Docker 来势汹汹
第四章:Docker 与 k8s 的恩怨情仇(四)- 云原生时代的闭源落幕
第五章:Docker 与 k8s 的恩怨情仇(五)——Kubernetes 的创新
第六章:Docker 与 k8s 的恩怨情仇(六)—— "容器编排" 上演 "终结者" 大片
第七章:Docker 与 k8s 的恩怨情仇(七)—— "服务发现" 大法让你的内外交互原地起飞
第八章:Docker 与 k8s 的恩怨情仇(八)—— 蓦然回首总览 Kubernetes
Docker 应用部署 BI 数据分析
通过上面一系列的介绍,我们可以从发展背景到具体原理和使用了解 Docker。接下来我们将从 BI 数据分析应用为例,为大家介绍如何实现 Docker 应用程序部署。
首先我们从 BI 数据可视化分析说起。通过对目前国内市面上多个 BI 应用进行调研后发现这些应用都存在一些问题。
- 依赖于运行环境 JDK,JAR,.NET Core 等,若运行环境不一致也会导致各种问题出现。
- 安装复杂。对于非专业人员,部署一套系统需要投入很大精力。
- 过于依赖于操作系统。例如会存在 x32 位不可支持,win7 环境配置难度大,winserver2008 以前版本不支持等各种系统问题。
- PC 安装有各类应用软件,容易和已安装软件冲突,引发不可预知的异常问题。
- PC 安装各种杀毒软件,如 360、金山毒霸、电脑管家等一些杀毒软件,会将进程杀掉,引起一些 BI 服务无法正常运行。
- BI 产品普遍有很多运行计划任务,个人 PC 安装 BI 应用后,即使不打开软件,程序依然在跑,容易引起 PC 运行比较卡顿。
上述问题的存在,就让 Docker 可以很好凸显他的价值。
首先 Docker 中的容器是与其他容器相互隔离的,在所获取的镜像中包含了 Docker 运行所需要的全部依赖的运行环境;所以只需要简单两行代码,就可以安装一个完整的 BI 应用。我们以 Wyn Enterprise 的部署为例,给大家演示下 Docker 进行软件部署的具体过程。
示例步骤:
- 安装 Docker
- 获取镜像:
sudo docker pull grapecitycn/wyn-enterprise
- 创建并运行 docker 容器:
sudo docker run --name wyn -p 51980:51980 -d grapecitycn/wyn-enterprise
- 至此,我们就可以通过 http://{server_ip_address}:51980 来访问 Wyn
通过以上示例,我们可以看到,仅需简单的 3 个命令行,就快速完成了 BI 系统的部署。请问,还有什么比 Docker 更简单快捷的部署方式吗?
Docker 镜像打包
部署如此简单,那么如果要进行移植该如何做,集成的项目如何发布 Docker 仓库中呢?
接下来,我们通过一个案例系统的解镜像打包过程,为大家解答这两个问题。
事情的起因是客户找到葡萄,表示希望将 BI 软件打包到自己应用系统中,在实现 OEM 白标处理后,做一些个性化配置后,重新打包镜像,上传到 Docker 仓库中。
说做就做,咱们现在就开始项目。
- 首先,使用 Wyn Enterprise 提供的 Docker 镜像来创建一个自己的 Docker 容器
sudo docker pull grapecitycn/wyn-enterprise
sudo docker run --name wyn -p 51980:51980 -d grapecitycn/wyn-enterprise
通过:http://{server_ip_address}:51980 进行个性化操作配置。
- 按自己的要求进行系统配置
可以根据自己的需要来对系统进行配置,比如替换登录页面的背景图片和 LOGO,系统左上角显示的 LOGO,以及替换浏览器 tag 页上面显示的 LOGO;还可以根据自己的需要创建一些示例文档。
- 用 admin 登录到系统后,导出你需要的文档以及配置。
- 制作 Docker 镜像 4.1. 准备一台 Linux 机器,把文件夹 custom-wyn 拷贝到这台机器上面去; 4.2. 把步骤 3 中导出的压缩文件重命名为 sample_files.zip,并拷贝到目录 custom-wyn/sample_files; 4.3. 如果需要在自定义的 Docker 镜像中内置字体,请把准备好的字体文件拷贝到目录 custom-wyn/custom_fonts 下; 4.4. 根据自己的需要,修改 dockerfile 文件中 docker 镜像 wyn-enterprise 的 tag 名称; 4.5. 参照脚本文件 push-docker-image.sh 中的内容,制作并且上传 Docker 镜像到 Docker 仓库中。 4.6. 打包资源
从该地址下载即可:
https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=139206
4.7. 拉取 Docker 镜像进行验证
拉取上面步骤中创建好的 Docker 镜像,并使用该镜像创建一个 docker 容器。
访问该 docker 容器中运行的 Wyn Enterprise 应用并进行验证。
至此我们的 Docker 镜像都已经制作完成。
总结
这里我们系统为大家介绍了 Docker 应用的优势,以及整个 BI 项目在 docker 中部署的全过程。其中 Docker 镜像打包也是目前很多企业中比较喜欢的一个功能,通过简单的操作 BI 集成到自己的应用系统中一起打包,完美的解决了嵌入融合的问题。
目前越来越多开发者已经投入到 Docker 的队伍中,同时随着技术更新迭代,BI 也在不断进步,现在 WynEnterprise 已经支持 K8S 集群部署。接下来,将持续为大家分享数据集成,数据分析,集群部署等内容。
今天关于docker-Django容器化部署和项目docker容器化部署步骤的分享就到这里,希望大家有所收获,若想了解更多关于.Net Core+Nginx+Mysql使用Docker-Compose实现多容器化部署、AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排、AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署、BI 系统打包 Docker 镜像及容器化部署的具体实现等相关知识,可以在本站进行查询。
本文标签: