老潘的Docker使用教程

收集了老潘常用的docker相关的命令,随时更新

安装Docker

1 常用命令

# 查看日志
docker logs 容器名字或者ID
## 查看日志最后几行
docker logs -f -t --tail=100 c337e9df72a7

# 打包docker镜像
docker save -o triton.tar triton:v1
# 在其他机器上解压镜像
docker load < triton.tar 

# 打镜像
docker build -t triton:v1 .
docker push triton:v1

# 拷贝
docker container cp -a 70e6365b5985:/usr/local/cuda-11.0/targets/x86_64-linux/lib .

# Docker和宿主机器之间移动数据 cocky_hawking 是容器的名字
docker cp TensorRT-8.1.0.6 cocky_hawking:/

# 启动停止的容器
docker start xxx 
# 进入正在运行的容器
docker exec -it xxx bash  

# 在线更新正在运行(或者停止docker)的内存和交换内存空间大小
docker update -m 3000M  --memory-swap 4000M xxx

# 利用正在运行容器制作docker
docker commit -a "oldpan" -m "message" 34fbc7e9ef5c triton:v1

# 一直运行
docker run -d triton:v1 /usr/bin/sh -c "while true; do echo hello world; sleep 20;done"

2 进阶

–ipc=host

在docker中debug

如果在docker中无法debug,示Error disabling address space randomization: Operation not permitted,需要这样启动docker:
docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined

小技巧

在run后面加了一个sh -c命令,可以同时执行多条语句:

docker run microsoft/dotnet sh -c "ls && ls"

不过最好还是编辑一个脚本文件(可以放多个执行命令)

用作开发的docker

一般来收,想让在docker中开发一些东西,比如写CUDA,调试CUDA,那么可能需要加一些权限到docker中,否则你啥也干不了。

所以老潘一般启动docker会使用以下命令:

docker run -it -d --cap-add=SYS_PTRACE --cap-add=SYS_ADMIN --security-opt seccomp=unconfined --gpus=all --shm-size=16g --privileged --ulimit memlock=-1 --name=develop -v/data/oldpan/software:/software -v/data/oldpan/code:/code xxx bash

介绍一下其中重要的参数:

  • -d: 这个参数的全名是 --detach,表示在后台运行容器,并打印容器 ID。

  • --cap-add=SYS_PTRACE--cap-add=SYS_ADMIN: 这两个参数是用来添加 Linux capabilities 的。SYS_PTRACE 允许进程对其他进程进行追踪,用于调试等。SYS_ADMIN 是一个非常强大的权限,相当于 root 用户的所有权限。

  • --security-opt seccomp=unconfined: 这个参数是用来禁用 seccomp 安全配置的,seccomp 是 Linux 内核的一个安全机制,用来限制进程可以调用的系统调用。unconfined 表示不限制任何系统调用。

  • --gpus=all: 这个参数表示分配所有可用的 GPU 到容器中。

  • --shm-size=16g: 这个参数设置共享内存的大小为 16GB,这对一些需要大量共享内存的应用,比如某些深度学习框架,是非常有用的。

  • --privileged: 这个参数表示给容器所有的 capabilities,这会使得容器拥有几乎和宿主机一样的权限。

  • --ulimit memlock=-1: 这个参数移除了内存锁定的限制,使得容器可以锁定无限量的内存。

需要注意,这个命令使用了很多高权限的参数,包括 --privileged--cap-add=SYS_ADMIN--security-opt seccomp=unconfined 等。这些参数可以增加容器的功能,但同时也可能增加安全风险,我们需要在理解这些参数后果的情况下使用它们。

3 常用命令解析

-rm

Docker 中的 --rm 参数在使用 docker run 命令启动容器时常常被用到。它的作用是在容器停止后自动删除容器实例。换句话说,当你停止运行一个带有 --rm 参数的 Docker 容器时,该容器的文件系统也会被清理。

以下是一个使用 --rm 参数的示例:

docker run --rm -it ubuntu bash

在这个例子中,我们使用 docker run 命令启动一个新的 Ubuntu 容器并打开 bash shell。-it 参数使我们能够在容器中交互式地运行 bash。--rm 参数的作用是,当我们退出 bash 或者停止容器后,这个 Ubuntu 容器就会被自动删除。

-it

在 Docker 命令中,-it 实际上是两个参数的组合:-i-t

-i 参数是 --interactive 的缩写,表示运行容器时,允许你能够输入和接收容器中的程序的交互式输出。

-t 参数是 --tty 的缩写,表示在新容器中分配一个伪终端或者说一个伪 tty。简单来说,这个选项能让你的容器有类似于命令行的交互方式。

所以,-it 的组合通常用在你需要运行一个交互式 shell 的场景,比如下面这个命令:

docker run -it ubuntu bash

这个命令会启动一个新的 Ubuntu 容器,然后打开一个 bash shell,你可以在这个 bash shell 中执行命令,就像在你自己的命令行中一样。

这个网站的资料不错:

参考