前言
该文章是个人学习docker的一个记录,挑选使用比较科学的指令,在这做个记录,同时方便初步接触docker的同学,能够快速且完整的掌握docker的基本使用。看完本文你可以掌握的知识点为:(1)使用dockerfile构建镜像 (2)按照交互式启动容器 (3)容器 端口和文件映射 (4)以较为科学的方式创建删除镜像和容器 (5)镜像迁移
查看docker镜像
docker images
删除无用的镜像
docker rmi $(docker images -f “dangling=true” -q)
该命令不会删除正被容器引用的 images
解释
docker rmi <image_id> :删除某个image的指令
docker images -f “dangling=true” -q
-f :显示时进行过滤
“dangling=true”: 表示过滤并显示悬挂状态的镜像,即没有被标签引用或者被其他层依赖的镜像
-q :只显示image id
docker rmi $(docker images -f “dangling=true” -q) 将docker images的结果传入rmi中删除
运行docker
打包镜像做debug时建议运行如下指令,然后使用attach进入容器内部,检验镜像是否构建正确,或者通过commit对image进行修改(不推荐)
docker run -itd --rm --net host --rm --name embedding-server15 --gpus all -v /home/cmge/log:/app/log -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro -p 54321:54321 embedding-server:latest
-itd :将会将docker运行在后台,并且提供交互,意味着,你可以通过attach 获取到containerid后,进入container执行shell指令等操作
–rm:在该容器结束后,会删除 embedding-server15这个容器
–gpus all:表示该容器可以使用gpu资源
-v : 为目录或文件映射“/home/cmge/log:/app/log " 表示将/home/cmge/log和容器中的/app/log做文件映射,可以让容器中的文件和宿主机文件进行互通
" -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro” 目的是保证container中的时间系统和运行container的机器保持一致
-p :用于做端口映射 "54321:54321"将container中的54321端口映射到宿主机的54321端口上; --net host 是直接使用宿主机的端口,所以可以不用-p做映射
embedding-server:latest:为镜像,即该容器依托的镜像
正式运行的指令
docker run --rm --name embedding-server15 --gpus all -v /home/cmge/log:/app/log -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro -p 54321:54321 embedding-server:latest
查看docker 容器
docker ps
进入docker容器
docker attach
docker 关闭停止容器
docker stop
提交镜像(直接在container中修改镜像)
这种做法不推荐,因为没有痕迹显示的告诉别人镜像中有什么
docker commit embedding-server15
不输入tag时将会自动填入tag为latest
重命名镜像
docker tag embedding-server
docker tag 6473262c5498 test
使用dockerfile构建镜像
docker build -t embedding-server:dockerfile-build -f ./agi-npcs-leo/Dockerfile --network host .
docker文件
# 使用cuda12的镜像
FROM nvidia/cuda:12.2.2-cudnn8-runtime-ubuntu22.04
# 设置置空proxy环境变量
RUN unset http_proxy && unset https_proxy
# 设置proxy环境变量,科学上网
ENV http_proxy=http://10.10.111.144:7900
ENV https_proxy=http://10.10.111.144:7900
# ENV http_proxy=http://10.10.111.148:17890
# ENV https_proxy=http://10.10.111.148:17890
# 如果不用代理,可以更换源为阿里云
# RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
# RUN apt-get clean
# 更新系统并安装依赖, -y避免手动确认呢(因为国内环境,建议每条单独执行)
RUN apt update
RUN apt upgrade -y
RUN apt install build-essential -y
RUN apt install zlib1g-dev
RUN apt install libncurses5-dev -y
RUN apt install libgdbm-dev
RUN apt install libnss3-dev -y
RUN apt install libssl-dev
RUN apt install libreadline-dev
RUN apt install libffi-dev
RUN apt install libsqlite3-dev
RUN apt install wget -y
# 下载和安装 Python 3.10.12
RUN wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz && \
tar -xf Python-3.10.12.tgz && \
cd Python-3.10.12 && \
./configure --enable-optimizations && \
make -j$(nproc) && \
make altinstall && \
python3.10 --version
RUN apt install -y python3-dev python3-pip
# 安装 FastAPI, ChromaDB, Torch 和 Sentence Transformers
RUN pip install fastapi chromadb torch torchvision torchaudio sentence_transformers
ENV CACHE=/root/.cache
ENV WORKSPACE=/app
# 创建工作目录,后续所有相对路劲都以/app开始
WORKDIR ${WORKSPACE}
# 将宿主机上的模型文件拷贝到对应目录下
COPY ./agi-npcs-leo/BAAI_bge-large-zh ${CACHE}/torch/sentence_transformers/BAAI_bge-large-zh
# 将宿主机上的工程复制到容器中的工作目录
COPY ./agi-npcs-leo ./
RUN unset http_proxy && unset https_proxy
# 下面踩过一个坑,这样运行会报错
# ENTRYPOINT ["python3 embeding_server/embeding-server.py"]
#ENTRYPOINT ,当调用docker run时,会立即执行的命令
ENTRYPOINT ["python3", "embeding_server/embeding-server.py"]
注意
dockerfile中使用WORKDIR之后,将会以WORKDIR指定的文件夹作为根目录,所以使用相对路径时要慎重 尤其是 "~/dir"这样将会是不正确的文件目录
docker镜像迁移
将docker镜像迁移到其他环境
docker镜像打包
docker save -o <output_tar_file>.tar …
其中,-o选项后面指定了输出的tar文件的路径和名称, …参数指定了要保存的镜像的名称或ID。
docker加载镜像
docker load -i myimage.tar