docker 安装与使用日记

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(运行下述代码安装)

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

最后,生成容器,需要添加参数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

镜像导出与加载

将一个镜像导出为文件,再使用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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值