1 前置任务
1.1 安装docker
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
1.2 安装nvidia-docker
curl https://get.docker.com | sh \
&& sudo systemctl --now enable docker
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
sudo docker run --rm --gpus all nvidia/cuda:10.2-devel nvidia-smi
查看docker镜像
nvidia-docker image ls
2 项目概况
作为一个打包文件,进行项目部署。编写的Dockerfile如下:
FROM anibali/pytorch #继承的基础镜像
USER root
WORKDIR /YOLOX_JYZ
RUN ln -sf /usr/bin/python3.8 /usr/bin/python
RUN apt-get update && apt-get install -y wget
RUN wget https://bootstrap.pypa.io/get-pip.py && \python get-pip.py && \rm get-pip.py
RUN apt-get update && apt-get install -y \
build-essential \
libgfortran5 \
libatlas-base-dev
ENV PIP_INSTALL="python -m pip --no-cache-dir install"
RUN $PIP_INSTALL numpy==1.21 llvmlite
RUN apt-get update && apt-get install -y cmake
RUN apt-get update && apt-get install -y protobuf-compiler
RUN echo "Current directory contents:" && ls && echo "Current working directory:" && pwd
COPY requirements.txt /YOLOX_JYZ/requirements.txt
COPY . /YOLOX_JYZ
RUN $PIP_INSTALL -r /YOLOX_JYZ/requirements.txt
ADD . /
文件结构上:需要将Dockfile和项目的其他文件放在一起,并且Dockfile应当使用copy将项目打包入镜像。从而构建上下文关联
3 操作步骤
3.1 编写Dockfile文件,无后缀
3.2 首先从dockerhub上拉取基础镜像-相当于一个最小系统,纯净版
sudo docker pull anibali/pytorch:1.10.0-cuda11.3-ubuntu20.04
3.3 build一个自己的镜像
base> yufeixie@y-B460HD3:~/myprojects/YOLOX_JYZ$ sudo docker build -t jyz_dockerimage20.04 .
格式为:sudo docker build -t [image_name]
docker build 是用于构建 Docker 镜像的指令,它有很多参数可以配置构建过程。以下是一些常见的 docker build 参数解释:
-t, --tag: 为镜像指定一个标签 (tag),通常使用 [仓库名]/[镜像名]:[标签] 格式。例如:-t myrepo/myimage:latest。
-f, --file: 指定用于构建的 Dockerfile 文件的路径。默认情况下,Docker 会在当前目录下查找名为 Dockerfile 的文件,但您可以通过 -f 参数指定其他路径。例如:-f /path/to/Dockerfile。
--build-arg: 设置构建时的构建参数,这些参数可以在 Dockerfile 中使用。格式为 变量名=值。例如:--build-arg MYVAR=myvalue。
--network: 指定用于构建过程的网络类型。
--no-cache: 在构建过程中不使用缓存,强制重新下载所有依赖项和重新构建所有层。
--pull: 在构建过程中始终尝试从远程仓库拉取最新的基础镜像。
--compress: 在构建过程中使用压缩算法来减小镜像大小。
--squash: 在构建过程中对镜像进行压缩,以减小镜像大小。
--progress: 设置构建时的进度输出格式,可以是 auto, plain, tty。
--secret: 指定构建过程中使用的 Docker 构建秘钥。
--ssh: 指定构建过程中使用的 SSH 认证。
3.4 运行一个实例
sudo docker run -it --gpus all --name yolox_jyz_container yolox_jyz /bin/bash
参数解释:
docker run 是用于在容器中运行一个新的进程的指令。它有很多参数可以配置容器的运行方式和行为。以下是一些常见的 docker run 参数解析:
-i, --interactive: 保持标准输入 (stdin) 打开,允许用户与容器的进程进行交互。
-t, --tty: 分配一个伪终端 (pseudo-tty),通常与 -i 一起使用,允许容器中的进程与用户进行交互。
--name: 为容器指定一个名称。
-d, --detach: 让容器在后台运行 (守护模式)。
--rm: 当容器退出时自动删除容器。
--restart: 容器退出后自动重启策略。可以是 no (不重启), on-failure[:max-retries] (失败时重启,最多重试次数), always (总是重启) 等。
--volume, -v: 挂载主机目录到容器中,格式为 [主机路径]:[容器路径]。
--env, -e: 设置环境变量,格式为 变量名=值。
--network: 指定容器连接的网络类型。
--publish, -p: 将容器的端口映射到主机的端口,格式为 [主机端口]:[容器端口]。
--privileged: 以特权模式运行容器,拥有主机的所有权限。
--user: 指定运行容器的用户。
如果要创建一个同名容器,则需要进行stop和删除,才能再创建
sudo docker stop f48419b9453512a1e07f49e0fac80e90d658b425f9f7c95f96e56cbb05ae3cc4
sudo docker rm f48419b9453512a1e07f49e0fac80e90d658b425f9f7c95f96e56cbb05ae3cc4
3.5 保存导出导入
# 保存文件
docker save -o output-filename image-name
sudo docker save -o docker_image.tar docker_sample:latest
sudo docker load -i docker_image.tar
4 常见问题
4.1 FROM镜像提示不存在:
需要从dockerhub上下载 docker pull
4.2 docker run提示图形库没有:
需要将宿主的图形库挂载到镜像
sudo docker run -it --name yolox_jyz -v /usr/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu jyz_dockerimage /bin/bash
-v: 挂载主机目录到容器中,格式为 [主机路径]:[容器路径]
4.3 docker 环境变量问题,来源于项目中DJI测温irp文件,所以要加入环境变量
export LD_LIBRARY_PATH=/YOLOX_JYZ
这个可以写在dockfile里面也可以在产生容器后使用
参考文献:
https://blog.csdn.net/qq_40243750/article/details/130661104?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-130661104-blog-130378511.235%5Ev38%5Epc_relevant_default_base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-130661104-blog-130378511.235%5Ev38%5Epc_relevant_default_base&utm_relevant_index=2
https://blog.csdn.net/whyAholic/article/details/111247081?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169137993316800180644276%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=169137993316800180644276&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-111247081-null-null.142v92koosearch_v1&utm_term=%20FROM%20centos%3Alatest&spm=1018.2226.3001.4187
https://blog.csdn.net/qq_41627642/article/details/127316515?ops_request_misc=&request_id=e9dd0df0b9ff4d069fd8abe53c8352f7&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2allkoosearch~default-2-127316515-null-null.142v92koosearch_v1&utm_term=docker%E6%89%93%E5%8C%85%E9%83%A8%E7%BD%B2%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E6%A8%A1%E5%9E%8B&spm=1018.2226.3001.4187