4.Docker-镜像制作-CI/CD

Docker镜像制作实战与CI/CD流程详解

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)]

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)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FCxIEkpW-1662221736284)(D:\Typora\photo\image-20220831102231414.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iKzdIVgT-1662221736284)(D:\Typora\photo\image-20220831102507508.png)]

$# 是传给脚本的参数个数
$0 是脚本本身的名字
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

1.9 镜像结构原理

参考博客:

第八篇:Docker镜像结构原理_Linux运维开发的技术博客_51CTO博客

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vpLJoJcP-1662221736285)(D:\Typora\photo\image-20220830112113347.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RzDsu0HK-1662221736285)(D:\Typora\photo\image-20220830113840318.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mmF44lxF-1662221736285)(D:\Typora\photo\image-20220830143805975.png)]

1.10 练习(nignx镜像制作)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bS9WwzlO-1662221736286)(D:\Typora\photo\image-20220831111619566.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aDNWMY1Y-1662221736286)(D:\Typora\photo\image-20220831111444053.png)]

二、CI/CD

参考博客:

CI/CD概述 - 简书 (jianshu.com)

(79条消息) CI/CD的简介以及区别_听说唐僧不吃肉的博客-优快云博客_ci/cd

什么是持续集成(CI)/持续交付(CD)管道? (baidu.com)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o3QKeqHP-1662221736286)(D:\Typora\photo\image-20220830104947678.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TjaShRj3-1662221736287)(D:\Typora\photo\image-20220830105002257.png)]

2.1 CI(Continuous integration持续集成)

在传统的软件开发中,集成过程通常在每个人完成工作后的项目结束时进行。整合通常需要数周或数月的时间,可能会非常痛苦。持续集成是一种将集成阶段置于开发周期中较早的做法,因此,构建,测试和集成代码的时间安排更为规则。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J8ITAI1T-1662221736287)(D:\Typora\photo\image-20220830103133681.png)]

开发人员通常使用称为CI Server的工具来进行构建和集成。CI要求自检代码。这是用于自我测试以确保其按预期工作的代码,这些测试通常称为单元测试。集成代码后,当所有单元测试通过时,将得一个最新的的代码版本。这表明他们已经验证了自己的更改已成功集成到一起,并且代码按测试期望的那样工作

2.2 CD(Continuous delivery持续交付)

持续交付意味着每次更改代码,集成并构建代码时,他们还将在与生产非常相似的环境中自动测试该代码。我们将此部署到不同环境并在不同环境上进行测试的过程称为部署管道。部署管道通常具有开发环境,测试环境和过渡环境,但是这些阶段因团队,产品和组织而异。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1BMP1EJB-1662221736288)(D:\Typora\photo\image-20220830103101748.png)]

在每个不同的环境中,开发人员编写的代码都经过不同的测试。当代码在生产环境中部署时,它们将在生产环境中工作。至关重要的是,代码只提升到(上测试)在部署管道的下一个环境,如果出现故障,整个团队可以更轻松地了解问题可能出在哪里,并在代码进入生产环境之前予以解决。这个过程对我们这个行业的人来说非常强大。这意味着,如果代码的测试在所有环境中都通过了,团队负责人就会知道开发人员的代码在投入生产时可能会按预期工作。一旦测试在所有环境中通过,团队负责人就可以立即决定最终用户是否通过测试。我们现在要在生产中使用这种绿色产品吗?是! 因此,一旦开发人员完成构建,便可以立即为客户提供经过全面测试的全新工作软件。

2.3 什么是CD(Continuous deployment持续部署)

在这种实践中,团队负责人所做的每一项更改都通过了所有测试阶段,并自动投入生产。要实现连续部署,团队负责人首先需要进行连续交付,因此在开始练习连续部署之前,先决定哪个对您更合适,持续交付都是为了增强整个业务的能力,因此至少您应该参与确定是否应该使用持续部署。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GOS1tjrk-1662221736288)(D:\Typora\photo\image-20220830103353409.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cbuyFxQk-1662221736288)(D:\Typora\photo\image-20220830103844339.png)]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值