收集了老潘常用的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 中执行命令,就像在你自己的命令行中一样。
这个网站的资料不错: