Docker-镜像制作-CI/CD
文章目录
文章目录
一、docker镜像制作(flask+redis)
本文环境:
-
CentOS 7
-
Docker 20.10.13
本文创建一个用python连接redis数据,输出到网页功能的镜像。
1.1 创建文件夹/mydocker以及如下文件
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YGjHBGzy-1662221736283)(D:\Typora\photo\image-20220829161244461.png)]](https://i-blog.csdnimg.cn/blog_migrate/36a4d3942130b94967d262b2c091069b.png)
1.2 编辑Dockerfile
FROM python:2.7-slim
WORKDIR /app # 进入到容器后,会进入的文件夹
ADD . /app # 复制linux系统当前目录下的内容到容器的/app目录下 类似于执行docker cp
VOLUME ["/data_flask"]
#安装requirements.txt库制作镜像时运行
RUN pip install --trusted-host pypi.python.org -r requirements.txt # 在容器内部执行的命令
EXPOSE 80 # 容器暴露80端口,监听80端口
ENV NAME Wosrld # 定义了环境变量NAME赋值World
ENV AUTHOR zkj #定义了环境变量AUTHOR赋值Zkj
CMD ["python","app.py"] #容器启动时执行命令 python app.py
1.3 编辑requirements.txt文件
Flask
Redis
1.4 编辑app.py文件
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# 容器启动的时候不知道ip 所以用名字进行连接
redis = Redis(host = "redis", db = 0, socket_connect_timeout = 2, socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, Counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Vistor:</b> {visits}"
return html.format(name = os.getenv("NAME", "world"), hostname = socket.gethostname(), visits = visits)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=80)
1.5 生成镜像文件
[root@docker mydocker]# docker build -t getting-started .
# -t getting-started 是指定制作的镜像的名字,名字可以自己定义
Sending build context to Docker daemon 4.608kB
Step 1/9 : FROM python:2.7-slim
---> eeb27ee6b893
Step 2/9 : WORKDIR /app
---> Using cache
---> 783796e25280
Step 3/9 : ADD . /app
---> Using cache
---> ad51881385b8
Step 4/9 : VOLUME ["/data_flask"]
---> Using cache
---> 6ff70abee09d
Step 5/9 : RUN pip install --trusted-host pypi.python.org -r requirements.txt
---> Using cache
---> 047a6b325e6b
Step 6/9 : EXPOSE 80
---> Using cache
---> 99eac2430436
Step 7/9 : ENV NAME World
---> Using cache
---> 1718fa0344ea
Step 8/9 : ENV AUTHOR Seesunman
---> Using cache
---> 7a4d5d5259ba
Step 9/9 : CMD ["python","app.py"]
---> Using cache
---> e1821c89e957
Successfully built e1821c89e957
Successfully tagged getting-started:latest
1.6 查看镜像
[root@docker mydocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
getting-started latest f3af4a625c0c 20 seconds ago 159MB
<none> <none> dbcae91db39b 4 minutes ago 148MB
mysql 5.7.39 daff57b7d2d1 4 days ago 430MB
nginx latest 2b7d6430f78d 6 days ago 142MB
python 2.7-slim eeb27ee6b893 2 years ago 148MB
1.7 启动容器
[root@docker mydocker]# docker run -dp 5080:80 getting-started
caf8be7d158d74fe2b5c1bf0d3de925c69de1a1b589ba70c65dd327b09ab0266
#需要启动一个redis容器,和我们制作镜像的容器
1.8 访问网站
如果没启动redis容器,访问不了数据库会显示如下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-71IlxyhT-1662221736284)(D:\Typora\photo\image-20220829165442228.png)]](https://i-blog.csdnimg.cn/blog_migrate/db0aeade3c386d639302f8d5c77cc2f1.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FCxIEkpW-1662221736284)(D:\Typora\photo\image-20220831102231414.png)]](https://i-blog.csdnimg.cn/blog_migrate/d340590fc565ccbdc4b9c7cba65fdd9c.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iKzdIVgT-1662221736284)(D:\Typora\photo\image-20220831102507508.png)]](https://i-blog.csdnimg.cn/blog_migrate/9fc14d4966a1335396b535ef9aec4a29.png)
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
1.9 镜像结构原理
参考博客:
第八篇:Docker镜像结构原理_Linux运维开发的技术博客_51CTO博客
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vpLJoJcP-1662221736285)(D:\Typora\photo\image-20220830112113347.png)]](https://i-blog.csdnimg.cn/blog_migrate/b2fa77e7c9dec413505c675e8ce5768b.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RzDsu0HK-1662221736285)(D:\Typora\photo\image-20220830113840318.png)]](https://i-blog.csdnimg.cn/blog_migrate/3b63a9136c7dfa20b5bd75c593beff8b.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mmF44lxF-1662221736285)(D:\Typora\photo\image-20220830143805975.png)]](https://i-blog.csdnimg.cn/blog_migrate/6b1d1b2b22736ce316893d0824665220.png)
1.10 练习(nignx镜像制作)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bS9WwzlO-1662221736286)(D:\Typora\photo\image-20220831111619566.png)]](https://i-blog.csdnimg.cn/blog_migrate/cb221a32bf4c51a5cd99aeb49c212556.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aDNWMY1Y-1662221736286)(D:\Typora\photo\image-20220831111444053.png)]](https://i-blog.csdnimg.cn/blog_migrate/f720bde18a7ff08732b16fa0656345be.png)
二、CI/CD
参考博客:
(79条消息) CI/CD的简介以及区别_听说唐僧不吃肉的博客-优快云博客_ci/cd
什么是持续集成(CI)/持续交付(CD)管道? (baidu.com)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o3QKeqHP-1662221736286)(D:\Typora\photo\image-20220830104947678.png)]](https://i-blog.csdnimg.cn/blog_migrate/cf7172564d2f26a151a161d795539b01.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TjaShRj3-1662221736287)(D:\Typora\photo\image-20220830105002257.png)]](https://i-blog.csdnimg.cn/blog_migrate/9bfdd859b5bc8058d83484085afeef4c.png)
2.1 CI(Continuous integration持续集成)
在传统的软件开发中,集成过程通常在每个人完成工作后的项目结束时进行。整合通常需要数周或数月的时间,可能会非常痛苦。持续集成是一种将集成阶段置于开发周期中较早的做法,因此,构建,测试和集成代码的时间安排更为规则。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J8ITAI1T-1662221736287)(D:\Typora\photo\image-20220830103133681.png)]](https://i-blog.csdnimg.cn/blog_migrate/78171f9defe520a583b5254e720ec2dc.png)
开发人员通常使用称为CI Server的工具来进行构建和集成。CI要求自检代码。这是用于自我测试以确保其按预期工作的代码,这些测试通常称为单元测试。集成代码后,当所有单元测试通过时,将得一个最新的的代码版本。这表明他们已经验证了自己的更改已成功集成到一起,并且代码按测试期望的那样工作
2.2 CD(Continuous delivery持续交付)
持续交付意味着每次更改代码,集成并构建代码时,他们还将在与生产非常相似的环境中自动测试该代码。我们将此部署到不同环境并在不同环境上进行测试的过程称为部署管道。部署管道通常具有开发环境,测试环境和过渡环境,但是这些阶段因团队,产品和组织而异。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1BMP1EJB-1662221736288)(D:\Typora\photo\image-20220830103101748.png)]](https://i-blog.csdnimg.cn/blog_migrate/dcf5b95f148d31faa9b68b51602932ea.png)
在每个不同的环境中,开发人员编写的代码都经过不同的测试。当代码在生产环境中部署时,它们将在生产环境中工作。至关重要的是,代码只提升到(上测试)在部署管道的下一个环境,如果出现故障,整个团队可以更轻松地了解问题可能出在哪里,并在代码进入生产环境之前予以解决。这个过程对我们这个行业的人来说非常强大。这意味着,如果代码的测试在所有环境中都通过了,团队负责人就会知道开发人员的代码在投入生产时可能会按预期工作。一旦测试在所有环境中通过,团队负责人就可以立即决定最终用户是否通过测试。我们现在要在生产中使用这种绿色产品吗?是! 因此,一旦开发人员完成构建,便可以立即为客户提供经过全面测试的全新工作软件。
2.3 什么是CD(Continuous deployment持续部署)
在这种实践中,团队负责人所做的每一项更改都通过了所有测试阶段,并自动投入生产。要实现连续部署,团队负责人首先需要进行连续交付,因此在开始练习连续部署之前,先决定哪个对您更合适,持续交付都是为了增强整个业务的能力,因此至少您应该参与确定是否应该使用持续部署。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GOS1tjrk-1662221736288)(D:\Typora\photo\image-20220830103353409.png)]](https://i-blog.csdnimg.cn/blog_migrate/a5aeb2cb9668140a0baa92f3cd7220b7.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cbuyFxQk-1662221736288)(D:\Typora\photo\image-20220830103844339.png)]](https://i-blog.csdnimg.cn/blog_migrate/067983bc142811706f4a7553cf9513f1.png)
1529

被折叠的 条评论
为什么被折叠?



