docker创建镜像并上传云端服务器的实现示例
作者:图图淘气
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,本文介绍了如何使用Docker创建镜像,并将其上传到云端,感兴趣的可以了解一下
docker容器与镜像的关系
- 镜像:
- 相当于一个类
- 不可修改内容
- 容器:
- 对镜像类的实例,可以在环境中更新库
- 容器可以保存为一个新的镜像
- 再根据保存的新镜像可以实例化新镜像的容器
1.基本镜像相关文件创建
1.1 创建dockerfile文件
文件内容
# linux基础系统 FROM nvidia/cuda:11.7.1-runtime-ubuntu22.04 # 修改镜像源 RUN sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list RUN sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list RUN sed -i s/ports.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list # 安装基本环境库 vim unzip git wget python3 python3-venv python3-pip build-essential libgl-dev libglib2.0-0 wget RUN apt update && apt-get -y install vim unzip git wget python3 python3-venv python3-pip build-essential libgl-dev libglib2.0-0 wget # pip 代理 RUN pip config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple RUN pip config set global.trusted-host mirrors.cloud.tencent.com # 创建自己目录 RUN mkdir /home/data && chmod 777 /home/data # 将/home/data作为根目录 WORKDIR /home/data # 本地文件复制上传到容器 # 文件上传文件 # copy load_file_path docker_file_path COPY upload_server_api.py /home/data/upload_server_api.py COPY upload_server_webui.py /home/data/upload_server_webui.py COPY do.sh /home/data/do.sh # 赋予.sh权限 RUN chmod 777 /home/data/do.sh # 执行.sh文件 RUN /home/data/do.sh # 暴漏端口,连接的端口 EXPOSE 7860 #暴漏 upload_server_api.py端口 EXPOSE 5566 #暴漏 upload_server_webui.py端口 EXPOSE 5560 ENTRYPOINT ["python3","-m","http.server","2023"]
1.2.创建do.sh文件
文件内容
#!/bin/bash # 进入根目录 cd /home/data # 创建python虚拟环境,虚拟环境名为venv python3 -m venv venv # 虚拟环境安装相关库 /home/data/venv/bin/python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ bottle /home/data/venv/bin/python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ flask /home/data/venv/bin/python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ cgai-io /home/data/venv/bin/python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ cgai-socket /home/data/venv/bin/python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ gradio # 后台运行upload_server_api.py,upload_server_webui.py文件 nohup /home/data/venv/bin/python -u /home/data/upload_server_api.py >/dev/null 2>&1 & nohup /home/data/venv/bin/python -u /home/data/upload_server_webui.py >/dev/null 2>&1 &
1.3 创建upload_server_api.py文件
文件内容
import os from bottle import route,request,static_file,run # 文件上传 @route('/upload',method='POST') def do_upload(): upload = request.files.get('upload') _dir = request.forms.get('dir') _dir = _dir.replace('\\','/') if _dir.endswith('/'): _dir = _dir[:-1] save_path = f'{_dir}/{upload.filename}' print('save_path:',save_path) upload.save(save_path,overwrite=True) return f'保存文件到:{save_path}' # 查看目录文件 @route('/check',method='GET') def check(): _dir = request.query.dir files = os.listdir(_dir) s = '' for i in files: s += i + '\n' return s if __name__=='__main__': run(host='0.0.0.0',port=5566)
1.4 创建upload_server_webui.py文件
文件内容
import os import socket import gradio as gr from cgai_io import copyfile,mvfile def get_ip(): s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.connect(("8.8.8.8",80)) a = s.getsockname() return a[0] def upload(save_dir,temp_file): file_path = temp_file.name file_name = os.path.basename(file_path) name,t = os.path.splitext(file_name) fs = name.split('_') fs.remove(fs[-1]) oname = '_'.join(fs) + t save_path = os.path.join(save_dir,oname) mvfile(file_path,save_path) return f'上传到路径: {save_path}' def check(save_dir): files = os.listdir(save_dir) s = '' for i in files: s += i + '\n' return s with gr.Blocks() as demo: gr.Markdown(f"当前连接ip: {get_ip()}") with gr.Column(): save_dir = gr.Text(label='上传路径',value='/home') local_file = gr.File(label='上传文件(注意:1.文件名称不要有下划线_,否则上传后的文件名称可能有误) 2.文件大小超过4G请使用客户端上传') with gr.Row(): upload_btn = gr.Button("上传") check_btn = gr.Button('检测') tip = gr.Text('',label='') upload_btn.click(fn=upload, inputs=[save_dir,local_file], outputs=tip) check_btn.click(fn=check, inputs=[save_dir], outputs=tip) demo.launch(server_name='0.0.0.0',server_port=5560)
1.5 文件保存位置
存放在同一个文件夹中,我的存放在 test_docker
文件夹中
2. 创建镜像操作
2.1 创建镜像
相关参数
参数 | 含义 |
---|---|
- f | dockerfile文件路径 |
- t | 新镜像标签名 |
. | 指明docker context为当前目录,context上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包 |
进入 文件夹目录
4个文件都在里面
在 test_docker
文件夹目录下创建镜像
docker build -f kohya_ss_dockerfile -t wang0724/gpu_python3_ubuntu22:v1 .
查看镜像
sudo docker image ls
2.3 创建容器
根据镜像实例化容器
# sudo docker run -itd --name=容器名称--runtime=nvidia --gpus all -p 6161:7860 镜像名称 sudo docker run -itd --name=kohya_test --runtime=nvidia --gpus all -p 6161:7860 wang0724/gpu_python3_ubuntu22:v1
创建成功,得到一个id,表明创建成功
查看运行的容器
sudo docker ps
2.2 进入环境容器
进入容器
# sudo docker exec -it 容器id /bin/bash sudo docker exec -it 1283aa83664a /bin/bash
查看根目录的文件
do.sh
upload_server_api.py
upload_server_webui.py
, do.sh中创建的venv虚拟环境
文件都在
ls
2.3 激活python虚拟环境
进入python虚拟环境venv文件目录
激活python虚拟环境
source venv/bin/activate
进入虚拟环境后,可以安装自己需要的python库
2.4 文件传输步骤
文件传输的目的=: 容器中现在只有基本的文件,需要自己上传自己的需要的文件
注意事项: 需要退出容器才能传输文件
2.4.1 退出容器
相关命令
exit
2.4.2 文件传输
本地文件复制到容器路径
# sudo docker cp load_file_path 容器id:docker_file_path sudo docker cp kohya_ss 1283aa83664a:/home/data
容器路径复制到本地文件
# sudo docker cp 容器id:docker_file_path load_file_path sudo docker cp 1283aa83664a:/home/data a.txt
2.4.3 进入容器
进入容器
# sudo docker exec -it 容器id /bin/bash sudo docker exec -it 1283aa83664a /bin/bash
2.4.4 查看文件
kohya_ss
已经成功传输到容器中
ls
3. 将容器保存为新的镜像
将上面的容器保存为新的镜像
# docker commit -m="描述信息" -a="作者" 容器id 目标镜像名: [TAG] # sudo docker commit -m="test" -a="w" 1283aa83664a os-harbo.cloudos:11443/home/test:v1 sudo docker commit -m="image create" -a="wang" 1283aa83664a wang0724/gpu_python3_ubuntu22:v1
查看镜像列表
sudo docker image ls
4.根据镜像创建新的镜像
4.1.制作镜像
根据已有的镜像创建 【就是copy一个】
参数 | 含义 |
---|---|
old | 容器名称 |
v1 | tag |
os-harbor-svc.default.svc.cloudos:0000/env | 项目路径 |
-- old:v1 已有镜像名称 -- new:v2 新创建镜像名称 sudo docker tag old:image1 os-harbor-svc.cloudos:0000/env/new:v2
再次查看镜像,就发现多了一个
4.2. 上传镜像到sdg
登录仓库
sudo docker login https://os-harbor-svc.cloudos:0000
提交镜像
sudo docker push os-harbor-svc.cloudos:0000/env/new:v2
拉取镜像
sudo docker pull os-harbor-svc.cloudos:0000/env/new:v2
到此这篇关于docker创建镜像并上传云端服务器的实现示例的文章就介绍到这了,更多相关docker创建镜像并上传云端内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!