提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

1. 实验环境

1.1 基于阿里云容器镜像服务ACR配置镜像仓库

容器镜像服务 ACR
点击管理控制台
在这里插入图片描述

创建个人版实例

在这里插入图片描述

创建完成之后点击进去

然后设置设置Registry登录密码
在这里插入图片描述
然后在这里设置固定密码

然后是创建命名空间

然后是创建镜像仓库—》使用我们刚刚创建的命名空间

在这里插入图片描述

代码源选择本地仓库

2. 练习docker常用命令

docker search nginx

查询镜像

docker pull nginx

拉取最新镜像

docker images

查询全部镜像

在这里插入图片描述

1.21是我们以前创建的

docker run -d --name nginx_latest -p 70:80 nginx

表示运行镜像,创建容器
在这里插入图片描述

docker ps

查看正在运行的容器

2.1 挂载宿主目录

在这里插入图片描述

mkdir -p /opt/docker/nginx/conf.d
mkdir -p /opt/docker/nginx/logs
mkdir -p /opt/docker/nginx/html

先创建对应目录

docker cp nginx_latest:/etc/nginx/nginx.conf /opt/docker/nginx/
docker cp nginx_latest:/etc/nginx/conf.d /opt/docker/nginx/
docker cp nginx_latest:/usr/share/nginx/html /opt/docker/nginx/

然后是把容器里面的文件拷贝到挂载的目录上

docker stop nginx_latest

停止容器运行

docker ps -a

查看所有容器

docker rm nginx_latest

删除停止了的容器,-f强制删除没有停止的

docker run -d --restart=always --name nginx_latest -p 70:80 -v /opt/docker/nginx/nginx.conf:/etc/nginx/nginx.conf -v /opt/docker/nginx/conf.d:/etc/nginx/conf.d -v /opt/docker/nginx/html:/usr/share/nginx/html -v /opt/docker/nginx/logs:/var/log/nginx nginx

-d表示后端启动

docker start nginx_latest

启动容器

docker exec -it nginx_latest /bin/bash

进入容器

cd /usr/share/nginx/html/
echo "<h1>Hello,word</h1>" > test.html
exit

在这里插入图片描述

docker logs nginx_latest

查看日志

docker rmi nginx_latest

删除镜像

要先停止容器删除容器,才可以删除镜像

3. 构建docker容器镜像

本实验以Ubuntu镜像作为基础镜像,拟制作一个包含Python基础环境以及Nginx服务器的新镜像。整个制
作过程包含两大步骤,一是撰写Dockerfile文件,二是使用dockerbuild命令基于Dockerfile创建新镜像。

3.1 编写dockerfile文件

FROM ubuntu:22.04
LABEL maintainer="<ck@uestc.edu.cn>"
WORKDIR /app
RUN apt-get update && apt-get install -y \
        nginx \
        python3 \
        python3-distutils
RUN rm -rf /var/lib/apt/lists/*
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

FROM ubuntu:22.04表示选择基础镜像
LABEL 是标签,是维护者信息
WORKDIR /app表示设置工作目录
设置WORKDIR /app的主要作用是为后续的指令(如RUN、COPY、ADD、CMD、ENTRYPOINT等)指定一个默认的工作目录,这个工作目录 /app 是在容器内部的
python3-distutils 是 Python 3 的一个基础工具包,主要包含了用于构建和安装 Python 模块的工具集
RUN rm -rf /var/lib/apt/lists/* - 清理包缓存,减小镜像体积

EXPOSE 80 声明的是容器内部会监听 80 端口,与宿主机的端口无关。

CMD [“nginx”,“-g”,“daemon off;”] - 容器启动时运行 Nginx,并以非守护进程模式运行,启动 Nginx 并强制其在前台运行

3.2 创建镜像

docker build -t npu .

npu 表示新构建镜像名字,.表示目录,在哪里的dockerfile

docker run -d  --name npu -p 70:80 npu
docker exec -it npu /bin/bash
python3
exit()
exit

4. ACR镜像管理与应用

4.1 推送镜像到ACR

ACR控制台

点击到镜像仓库

推送镜像的话,镜像名称要满足要求
镜像名称应该是由镜像仓库+Tag组成
所以我们要用docker tag重命名镜像
Tag是自己随便命名的

进入镜像仓库的管理页面,里面有对应的指令

docker tag [ImageId] 镜像仓库地址:[镜像版本号]
docker tag npu 镜像仓库地址:npu

在这里插入图片描述

npu就是我们弄的tag

然后是在ecs中登录阿里云acr,然后tuis
阿里云管理控制台都有命令的

docker login --username=xxxxxx xxxx.com

然后输入设置的密码

docker push 镜像仓库地址:[镜像版本号]

在这里插入图片描述

然后我们就可以在镜像版本那里看到了

4.2 拉取镜像都esc

先删除本地镜像和容器

docker pull 仓库地址:npu

在这里插入图片描述

5. 实验二

在Windows上上传镜像,然后再esc上pull镜像
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我们启动server.py

输入网址
http://127.0.0.1:8000/

在这里插入图片描述

5.1 在阿里云ecs以容器方式部署微服务范例

我们在Windows上上传镜像,然后再esc上pull镜像

# 使用 Ubuntu 22.04 作为基础镜像
FROM ubuntu:22.04

# 指定工作目录为 /app
WORKDIR /app
# 将主机文件系统中的 exp_pyms_api_demo 复制到镜像中
COPY exp_pyms_api_demo exp_pyms_api_demo

# 指示该服务使用的端口为 8000
EXPOSE 8000

# 指定容器的启动命令,device.csv 将存储在容器的 /var/lib/exp_pyms_api_demo/ 目录下,因此该目录应持久化
CMD ["/app/exp_pyms_api_demo", "/var/lib/exp_pyms_api_demo/device.csv"]

COPY exp_pyms_api_demo exp_pyms_api_demo 这条指令的意思是:将宿主机当前目录下的 exp_pyms_api_demo 文件或目录,复制到容器内的工作目录(/app)下,并且在容器内保持同名

/var/lib/exp_pyms_api_demo/device.csv:这是传递给主程序的参数,表示该程序需要使用 /var/lib/exp_pyms_api_demo/ 目录下的 device.csv 文件

这个是dockerfile

然后我们在Windows下运行

在这里插入图片描述
然后这里还有打好的包

docker build -t exp_pyms_api_demo:1.0 .

注意在Windows上使用docker命令的话,要先启动docker desktop

在这里插入图片描述在这里插入图片描述

5.2 本地上传镜像到镜像仓库

docker login
docker tag exp_pyms_api_demo:1.0 仓库地址:exp_pyms_api_demo-1.0
docker push 仓库地址:exp_pyms_api_demo-1.0

在这里插入图片描述

5.3 在ecs上拉取镜像并部署镜像

docker pull 仓库地址-1.0

在这里插入图片描述

mkdir exp_pyms_data
docker run -d --restart=always\
	--name exp_pyms_api_demo \
	-v ./exp_pyms_data/:/var/lib/exp_pyms_data/ \
	-p 8000:8000 \
	镜像名
docker run -d --restart=always\
	--name exp_pyms_api_demo \
	-v ./exp_pyms_data/:/var/lib/exp_pyms_data/ \
	-p 8000:8000 \
	d23f607ccf17

在这里插入图片描述

6. 实验三

直接将exp_pyws_demo拷贝到Ecs服务器

在这里插入图片描述

先进入我们以前设置的TestPython环境中

source TestPython/bin/activate

在这里插入图片描述

然后启动python web服务

python3 server.py

在这里插入图片描述

deactivate

退出虚拟环境

6.1 以容器形式部署这个服务

sudo apt-get install ntpdate
sudo ntpdate ntp.ubuntu.com

这样可以将主机的系统时间同步为准确的网络时间,避免因时间偏差导致仓库 Release 文件验证失败,因为 Debian 仓库的 Release 文件还未到有效时间,导致 apt-get update 失败,这通常是由于系统时间与实际时间不一致造成的

就在这个目录下创建Dockerfile

#基于Python最新基础镜像
FROM python:3.10-slim-bookworm
LABEL maintainer="<ck@uestc.edu.cn>"
# 工作目录
WORKDIR /app
# 安装Python库
COPY requirements.txt requirements.txt
RUN apt-get update  \
&& pip3 install -r requirements.txt
#清理apt软件包缓存
RUN rm -rf /var/lib/apt/lists/*
#复制当前文件夹中全部文件到镜像中
COPY  .  .
#暴露服务端口8090
EXPOSE 8000
#容器启动时执行命令
CMD ["python3","server.py"]

python:3.10-slim-buster->已停止支持的 Debian Buster 版本
python:3.10-slim-bookworm–》最新

docker build -t exp_pyms_demo .

在这里插入图片描述

docker run -d --restart=always --name exp_pyms_demo -p 8000:8000 exp_pyms_demo

-d表示后台运行
在这里插入图片描述
这样就成功了
然后删除镜像容器

7. 基于阿里云云效Flow在虚拟环境部署范例服务

7.1 创建代码仓库

阿里云代码仓库Codeup
我们在阿里云上创建一个仓库exp_pyws_demo和服务器上的exp_pyws_demo目录是对应的

在这里插入图片描述

然后进入我们服务器的目录
exp_pyws_demo

git init
git remote add origin ssh秘钥

这条命令的作用是在本地 Git 仓库中添加一个名为 origin 的远程仓库(remote),并将其关联到阿里云 Codeup 平台上的 exp_pyws_demo.git 仓库

origin:是给这个远程仓库起的名字,这是 Git 中约定俗成的、用来指代远程仓库的默认名称,当然也可以换成其他名字,不过使用 origin 会更符合大家的使用习惯,方便后续识别和操作。

git pull origin master

git pull之后就生成了.gitignore在服务器上,就把仓库里面的内容搞到服务器上了

git add .
git commit -m "init"
git push -u origin master

在这里插入图片描述
这样就把服务器上的弄到云上仓库了

git checkout -b venv

创建分支venv并切换为分支venv

git push --set-upstream origin venv

推送分支到云上
在这里插入图片描述

7.2 配置云效Flow以支持ECS虚拟环境部署

在云效流水线Flow系统新建流水线,选择云效预置模版[Python·测试、构建、部署到阿里云ECS/自有主
机」。将「测试」、「构建」、「部署」三个阶段命名分别改为「代码测试」、「制品构建」以及「服务部署」。

云效Flow流水线

在这里插入图片描述

在这里插入图片描述

7.3 流水线源

然后点击新建流水线源

点击「添加流水线源」,在「代码源」页面中:
「选择代码源」选择codeup
[代码仓库」选择exp_pyms_demo
[默认分支」选择venv
「触发事件」选择代码提交—》开启代码源触发–》代码提交
「工作目录」设为exp_pyms_demo

在这里插入图片描述

在这里插入图片描述

7.4 代码测试

这一步什么都不干

7.5 制品构建

在这里插入图片描述

对这个python构建进行设置

在这里插入图片描述

总共三个步骤

我们只需要设置第三个步骤

我们在第三个步骤里面,新建服务链接,新建服务授权证书
在这里插入图片描述

7,6 服务部署

本阶段模版设置有一个任务「主机部署」,其中
。「制品」选择上一步「构建物上传」步骤设定的制品名称Artifacts_${PIPELINE_ID}
。「主机组」
·首次使用时,需要点击「新建主机组」
由阿里云Ecs的就新建主机阿里云Ecs的
没有的
**加粗样式**
就选择这个手动安装Runner,然后复制命令,就可以添加主机了
在这里插入图片描述

这个主机就是我们本地的虚拟机
在这里插入图片描述
[部署配置」
「下载路径」保持默认即/home/admin/app/package.tgz。
「执行用户」保持默认即root。

部署脚本定义如下

#清理上一次部署时的运行环境
pkill python3
rm -rf ~/exp_pyws_demo
#解压代码制品到指定运行目录
mkdir ~/exp_pyws_demo
tar -xvzf /home/admin/app/package.tgz -C ~/exp_pyws_demo
#特别注意,此处路径必须与「部署配置->下载路径」一致
cd ~/exp_pyws_demo
#建立Python虚拟环境并安装依赖
python3 -m venv exp_venv
source exp_venv/bin/activate
pip3 install -r requirements.txt
#运行Web服务
nohup python3 server.py > /dev/null 2>&1 &
#nohup:即nohangup,程序输出重定向到nohup.out,终端退出不会影响运行
#>/dev/null:将server·py的日志输出重定向到/dev/nul1而非标注输出stdout
#2>&12为stderr,>&为重定向,将标准错误出重定向到标准输出
#&:让程序在后台执行,不会被CTRL+C触发的SIGINT中断,终端退出不会影响运行

我们服务器上没有pip3
所以要么改为pip来安装
要么安装pip3

apt install python3-pip

在这里插入图片描述

/home/admin/app/package.tgz这个路径是从这里来的,从这个部署这里的下载路径来的

在这里插入图片描述

7.7 运行流水线

在这里插入图片描述

直接运行发现是成功了的

然后访问一下

在这里插入图片描述

也是成功了

在这里插入图片描述

非常的成功

7.8 修改设备文件,提交代码并触发流水线

我们去修改devices.csv
然后git push
看会不会触发流水线,并增加内容
我我们给devices.csv增加一条数据

我们git push的地方是
在这里插入图片描述
不是~/exp_pyws_demo哦

在这里插入图片描述

在这里插入图片描述

我们git push之后,刚开始要指定是哪个分支push的时候,后面就不用了,都是venv分支了

在这里插入图片描述

马上去看,发现正在构建部署呢
在这里插入图片描述

发现确实变为四行数据了

7.9 完成测试后关闭范例服务

ps aux | grep server.py

在这里插入图片描述

kill 443235

8. 基于阿里云云效Flow以容器形式部署范例服务

8.1 git配置

我们在以当前分支venv 创建出新的分支docker,并转换为docker分支

git checkout -b docker
git branch

查看分支
在这里插入图片描述

git push --set-upstream origin docker 

提价分支

然后是准备Dockerfile

#基于Python最新基础镜像
FROM python:3.10-slim-bookworm
LABEL maintainer="<ck@uestc.edu.cn>"
# 工作目录
WORKDIR /app
# 安装Python库
COPY requirements.txt requirements.txt
RUN apt-get update  \
&& pip3 install -r requirements.txt
#清理apt软件包缓存
RUN rm -rf /var/lib/apt/lists/*
#复制当前文件夹中全部文件到镜像中
COPY  .  .
#暴露服务端口8090
EXPOSE 8000
#容器启动时执行命令
CMD ["python3","server.py"]

就和原来一模一样的

在这里插入图片描述
而且仓库已经有了

8.2 配置云效Flow

在这里插入图片描述

我们直接复制原来的流水线,然后修改

8.3 流水线源

默认分支选择docker
在这里插入图片描述

8.4 镜像构建

制品构建改名为镜像构建
在这里插入图片描述
删除原来任务:python构建上传到仓库
新建任务:python镜像构建

在这里插入图片描述
我们重点是配置这里第三步

点击「添加服务链接」,根据页面提示创建新的服务链接,新增服务授权,「使用范围」设为私密。
在这里插入图片描述

选择「地域」,如成都。
点击「仓库」,这个仓库我们选择直接输入,直接输入我们镜像仓库ACR的公网地址就可以了

在这里插入图片描述

▪标签:默认为${DATETIME}
·Dockerfile路径:默认为Dockerfile,即从仓库目录中直接查找

8.5 服务部署

首先新建「并行任务」用于容器部署,随后再删除原有任务「主机部署」(否则若该阶段没有任务存在,自身
也会被自动删除)。
新建「并行任务」时,在弹出页面中选择「部署」,再选择「Docker部署」。

在这里插入图片描述
在这里插入图片描述

先点击上面的变量与缓存

在具体配置「Docker部署」任务之前,先点击页面顶部的「变量和缓存」,新建字符变量ACR_LOGIN_PWD,
默认值为登陆阿里云容器镜像服务ACR时所需密码,必须采用「私密模式」保存。该变量将用于后续任务配置中
的「部署脚本」。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

主机组就是我们原来弄的主机组

用户选择root就可以了

然后是部署脚本的定义

docker login --username=<username> --password=${ACR_LOGIN_PWD} registry.<region>.aliyuncs.com -p密码
docker rm -f exp_pyws_demo
#确保历史容器实例
docker pull ${CONTAINER_TAG}
docker run -d --restart=always --name exp_pyws_demo -p 8000:8000 ${CONTAINER_TAG}

docker login的指令要自己去找,是镜像仓库登录的指令,这里一定要指定密码,因为密码我们不会手动输入了

docker login --username=nick2688209038 crpi-ru2a6rcf4x9ry77a.cn-hangzhou.personal.cr.aliyuncs.com
docker rm -f exp_pyws_demo
#确保历史容器实例
docker pull ${CONTAINER_TAG}
docker run -d --restart=always --name exp_pyws_demo -p 8000:8000 ${CONTAINER_TAG}

在这里插入图片描述
但是CONTAINER_TAG变量在哪里呢,我们还是在这个部署配置添加变量

在这里插入图片描述

选择上游任务,制品/镜像 下载地址

在这里插入图片描述
先选择第一个,意思就是CONTAINER_TAG变量就是我上一步镜像构建并推送的镜像tag

8.6 运行流水线

#基于Python最新基础镜像
FROM python:3.10-slim-bookworm
LABEL maintainer="<ck@uestc.edu.cn>"
# 工作目录
WORKDIR /app
# 安装Python库
COPY requirements.txt requirements.txt
RUN apt-get update  \
&& pip3 install -r requirements.txt
#清理apt软件包缓存
RUN rm -rf /var/lib/apt/lists/*
#复制当前文件夹中全部文件到镜像中
COPY  .  .
#暴露服务端口8090
EXPOSE 8000
#容器启动时执行命令
CMD ["python3","server.py"]

我们修改一下了
因为我们这个是在阿里云网上拉取镜像python:3.10-slim-bookworm
不是在我们的ecs服务器上拉取镜像python:3.10-slim-bookworm
所以我们这样配置的话,是会拉取海外的镜像python:3.10-slim-bookworm
是会拉取失败了

我们在Python 镜像构建这一步要修改配置了

在这里插入图片描述
第一就是构建集群,意思是在什么地方拉取镜像,我们这里必须要设置为香港的,因为香港是海外的,意思就是我们在香港拉取镜像python:3.10-slim-bookworm,如果构建集群设置在大陆内部,是拉取不了python:3.10-slim-bookworm的

在这里插入图片描述
然后是镜像仓库这里,地域必须是杭州,然后仓库是我们的镜像仓库公网地址,因为镜像仓库是在杭州的,所以地域要选择杭州,不然找不到的

这样就可以运行流水线成功了

在这里插入图片描述

因为我们设置了标签就是DATETIME,默认的变量,所以镜像名字就是时间

netstat -anp | grep 8000

查看端口号,然后杀死

然后是一点就是我们这个拉取镜像匿名拉取的话,只能拉取两三次,就是从dockerhub官网上拉取只能拉取两三次
在这里插入图片描述
只有登录过的才可以无限次数拉取

在这里插入图片描述
所以我们在最前面增加一个dockerlogin的操作
在这里插入图片描述
在这里插入图片描述

添加服务链接,里面的授权证书就是我们在dockerhub官网的账户名和密码,邮箱我用的是谷歌的邮箱
dockerhub注册

镜像仓库地址填https://index.docker.io/v1/

然后直接运行

在这里插入图片描述

在这里插入图片描述
这样我们就成功了
在这里插入图片描述

8.7 修改代码文件,提交代码并触发流水线

在这里插入图片描述

在这里插入图片描述
这样就成功了

在这里插入图片描述

8.8 拉取我们自己镜像仓库里的python:3.10-slim-bookworm

我们可以在ecs上拉取镜像python:3.10-slim-bookworm,这个我们配置过docker加速的
然后把python:3.10-slim-bookworm推送到我们阿里云的镜像仓库上面
然后流失线的From python:3.10-slim-bookworm
就从我们阿里云上面的python:3.10-slim-bookworm拉取就可以了

#拉取镜像
docker pull python:3.10-slim-bookworm
#登录阿里云仓库
docker login --username=xxxx xxxx.com
docker tag 4c94d23a29c6 xxxxxxx:my_python_-slim-bookworm
docker push xxxxxxxxxxx:my_python_-slim-bookworm

我们tag为my_python_-slim-bookworm

在这里插入图片描述

然后在流水线的镜像构建这里

在这里插入图片描述

其中服务连接的就是我们阿里云的账户名和密码

镜像仓库地址就是我们阿里云的镜像仓库地址

在这里插入图片描述
这里就不用写香港的了,写杭州内地就可以了,因为我们的仓库就是杭州的

然后是流水线的服务部署这里,什么都不用改
最后是Dockerfile那里要修改

#基于Python最新基础镜像
FROM 阿里云镜像仓库地址:my_python_-slim-bookworm

这样就可以了

就可以运行了

然后我们就只运行一个流水线,不要同时运行多个,因为它们都是一个端口的,有一个服务的

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐