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 命令得知这个路径后,会将路径下的所有内容打包
-
进入
test_docker
文件夹目录- 4个文件都在里面
- 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,表明创建成功
- 创建成功,得到一个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