docker安装
傻瓜式安装,最省心,容器不需要GPU支持可采用这种方法:
sudo snap install docker
普通安装,参照https://docs.docker.com/engine/install/ubuntu/
将python代码打包成镜像
1. 生成依赖列表
pipreqs ./
2. 编写python Dockerfile示例
# 第一阶段,基于的基础镜像
FROM python:3.9-buster as builder-image
# 安装支持
COPY requirements.txt .
RUN pip3 install -i https://pypi.mirrors.ustc.edu.cn/simple --trusted-host https://pypi.mirrors.ustc.edu.cn --default-timeout=60 --no-cache-dir -r requirements.txt
# 第二阶段,将安装的包拷贝过来. 因为用不到python中所有的功能,可以选择一个稍微小一点的基础镜像,压缩最终镜像大小。
FROM python:3.9-slim-buster
COPY --from=builder-image /usr/local/bin /usr/local/bin
COPY --from=builder-image /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
# 指定镜像中的工作目录
WORKDIR ./docker_demo
#ADD <源路径> <目标路径>。使用ADD指令可以将构建上下文目录中的源路径目录复制到镜像内的 <目标路径> 位置。第一个参数“.”代表Dockerfile所在的目录,即python项目dockerdemo下所有的目录(不包括docker_demo自身)。第二个参数“.”代表镜像的工作目录
ADD . .
CMD ["python", "./src/main.py"]
slim:通常只安装运行特定工具所需的最小包
buster: 表示使用debian 10的系统,与之对应的是stretch, debian 9的系统, jessie, debian 8 的系统
Alphine: 专门为容器构建的操作系统,更小,但是经常会出问题,不建议
3. 创建image
docker build -t [镜像名:版本号] .
# 也可不加版本号,直接写镜像名
# 查看image
sudo docker images
# 新建容器,并运行image
sudo docker run [镜像ID:版本号]
# 删除image
sudo docker rmi [镜像ID]
docker查找网上的镜像
例如,想寻找一个打包了openfoam软件的镜像,并拉取到本地使用
docker search openfoam
docker pull 镜像名
显示所有镜像或容器container
sudo docker images
sudo docker ps -a
删除镜像
sudo docker rmi 镜像ID
删除容器、删除已退出的所有容器
sudo docker rm 容器ID
sudo docker rm $(sudo docker ps -qf status=exited)
生成容器,并在容器中开启一个终端
sudo docker run -it [镜像ID] /bin/bash
# 如需指定容器名称,用--name
sudo docker run --name 容器名 镜像ID
# 如需指定共享宿主机网络给容器
sudo docker run -itd --name=容器名 --network=host 镜像ID
退出容器、启动已停止容器、进入容器
退出,exit或ctrl+D
启动/停止容器、进入已启动容器
用root身份进入已启动的容器
注意这里用的是[容器ID],不是镜像ID
sudo docker start/stop [容器ID]
docker exec -it [容器ID] /bin/bash
docker exec -u root -t -i container_id /bin/bash
容器与宿主机文件拷入拷出
注意这里用的是[容器ID],不是镜像ID
# docker cp 容器名:文件在容器的路径 宿主机路径
docker cp [容器ID]:/docker_demo/src/filename /home/
# docker cp 文件路径 容器名:容器里对应路径
docker cp filename [容器ID]:/docker_demo/src/
在容器中使用带有图形界面的软件
首先,安装x11-xserver-utils,ubuntu20.04自带不需要安装
sudo apt-get install x11-xserver-utils
其次,生成容器并进入容器终端,–net=host 必须加,否则无法正常显示
sudo docker run -it -v /etc/localtime:/etc/localtime:ro -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE --net=host --name of9ui f486261c8359 /bin/bash
在容器中使用GPU
需要先安装docker19或以上版本,并安装显卡驱动。然后安装nvidia-container-toolkit(参考https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html)
最后,生成容器,需要添加参数gpus=all
sudo docker run -it -v /etc/localtime:/etc/localtime:ro -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE --net=host --gpus=all --name of9ui f486261c8359 /bin/bash
测试是否成功:
docker run --help | grep -i gpus
运行nvidia官方提供的测试gpu的镜像:
docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
例如,在容器安装tensorflow并使用GPU、图形支持
docker pull tensorflow/tensorflow:1.8.0-gpu
docker run -it -v /etc/localtime:/etc/localtime:ro -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/guoli/Documents/00-projs:/root/00-projs -e DISPLAY=unix$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE --net=host --gpus=all --name 容器名称 镜像ID /bin/bash
镜像导出与加载
将一个镜像导出为文件,再使用docker load命令将文件导入为一个镜像。
docker save test -o test.tar
docker save 0fdf2b4c26d3 > test.tar
docker load -i test.tar
docker load < test.tar
容器保存与加载
docker import/docker export;将一个容器导出为文件,再使用docker import命令将容器导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。docker import 可以为镜像指定新名称。
docker export 容器ID > test.tar
docker import - new_test < test.tar
若要将修改保存为镜像, 则
docker commit d81abcfd2e3b demo:v1.3 提交你刚才修改的镜像,新的镜像名称为demo,版本为v1.3,期间容器不能停止。docker commit会保存镜像的历史提交记录,体积比docker export大。
删除容器或镜像
sudo docker stop 容器ID
sudo docker rm 容器ID
sudo docker rmi 镜像ID(镜像名)
删除none镜像
1 停止Exited容器
2 删除Exited容器
3 删除none镜像
sudo docker stop $(sudo docker ps -a | grep "Exited" | awk '{print $1 }')
sudo docker rm $(sudo docker ps -a | grep "Exited" | awk '{print $1 }')
sudo docker rmi $(sudo docker images | grep "none" | awk '{print $3}')
如果不想每次都输入sudo
# 添加docker用户组,一般已存在,不需要执行
sudo groupadd docker
# 将登陆用户加入到docker用户组中
sudo gpasswd -a $USER docker
# 更新用户组
newgrp docker
sudo service docker restart