docker技术很多,但工作中用到的就那么几个, 整理下经常用到的.
1 容器操作
2 删除容器
docker rmi -f 容器名
3 启动容器
4 容器终止问题
docker run -d 容器1
上述命令后, 使用docker ps 查看很可能发现容器1停止了, 因为容器使用后台运行, 就必须有一个前台进行,若没有就会自动停止,解决办法: 添加一段持续运行的命令,如下:
docker run -d 容器1 /bin/sh -c "while true;do echo longwork;sleep 1;done"
5 进入正在运行的容器
docker exec -it 容器名 /bin/bash
6 提交/保存镜像
这是制作镜像, 封装服务并交付的环节. 工作中,项目开发完后, 交付给下一级部门和客户就是通过这种方式.
# 提交容器到镜像
docker commit 容器名 目标镜像名:tag
例如 docker commit trt-pytorch2.1 my_trt_image:20240221
# 保存镜像到本地
docker save -o 本地文件名.tar 目标镜像名:tag
# 加载本地tar文件到镜像
docker load < 本地文件名.tar
7 容器资源消耗
容器内跑程序, 容器外监控整个容器的内存/CPU使用情况, 从而达到性能测试的目的
docker stats 容器名 --format "{{json .}}" > normal.txt
8 容器内不能识别gpu
如torch不能使用gpu, 容器内nvidia-smi查看不到显卡,原因之一是启动容器的方式不对
/etc/docker/daemon.json中默认设置的不是nvidia,所以直接启动docker-compose,容器内是找不到nvidia-smi的
{
"default-runtime": "nvidia", # 要加上这句才行
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"registry-mirrors": ["https://registry.docker-cn.com"]
}
9 docker-compose 启动容器
进入docker-compose.yaml所在目录,执行:
# 后台启动
docker-compose up -d
# 停止容器
docker-compose stop
# 启动容器
docker-compose start
# 重启容器
docker-compose restart
# 停止容器, 然后删除该容器, 是清理容器的命令.
docker-compose down
docker-compose.yaml常用命令如下, 这几条配置可应付我使用的所有容器, 目测也能满足绝大多数人需求.
version: "3"
services:
# 服务名,可以不与container_name同名, 在Nginx中使用服务名做调度,
# 如果只想起个容器,服务名没啥用
lyb-cent7-cuda11_torch19:
image: lyb-cent7-cuda11-torch19:0324
container_name: "lyb-cent7-cuda11_torch19"
# 获取宿主机root权限,要映射端口也需要true
privileged: true
# 设置共享内存大小为16g,防止分布式训练dataloader时出错
shm_size: "16gb"
# 路径映射, 主机目录:容器内目录
volumes:
- /home/data/liyabin_project:/home
ports:
- "10086:22" # 容器内22端口映射到外部10086,22端口通常用于在外部调用容器内Python环境
- "10087:10087" # 用途待定,比如可以tensorboard --logdir=路径 --port 10087
"""
# 从外部传入变量
environment:
#- NVIDIAER_CAPABILITIES=compute,utility
- NVIDIA_VISIBLE_DEVICES=all
- GPU_IDS=1
- YOLO_THRESHOLD=0.6
- SERVER_PORT=3800
# 容器重新启动,比如当容器被其他人kill了,会自动重启
restart: always
# entrypoint是容器启动时默认运行的命令,command 是用于在运行时替换默认命令的命令,
# 因此,如果使用了command, 就没必要再使用entrypoint了,因为会被覆盖.
# entrypoint: /usr/sbin/init
# command后面的命令 与 tty:true都能使启动的容器不停止, tty是伪终端吧啦吧啦..,
# 他们区别是啥? I don't know! 如果不想探究, 那么从下面随便选一个就好!
command: ["/bin/bash", "-c", "sleep infinity"]
#tty: true
network_mode:
"bridge" # 默认桥接模式,容器之间不须要互相通讯.
#"host" # 当前模式下ports端口映射失效, 容器环境不隔离,将使用主机的端口和ip.