Note on Docker - Part 2

常用命令
Docker run
功能:创建一个新的容器并运行一个命令
语法:
1 | docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
常用 OPTIONS:
| OPTION | 作用 |
|---|---|
| —name | 为容器指定一个名称 |
| -f | 根据条件过滤显示的内容 |
| -l | 显示最近创建的容器 |
| -n | 列出最近创建的 n 个容器 |
Docker ps
功能:列出容器
语法:
1 | docker ps [OPTIONS] |
常用 OPTIONS:
| OPTION | 作用 |
|---|---|
| -a | 显示所有的容器,包括未运行的 |
| -d | 后台运行容器,并返回容器 ID |
| -p | 指定端口映射,格式为:主机端口:容器端口 |
| -i | 以交互模式运行容器,通常与 -t 同时使用 |
| -t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用 |
| —volume, -v | 绑定一个数据卷 |
启动容器与附加到容器的区别
在Docker中,启动容器和附加到容器是两个不同的概念。
- 启动容器(Start Container):启动容器是指将一个已创建但处于停止状态的容器启动运行。当你启动一个容器时,Docker会根据容器的定义和配置启动容器内的进程,并分配所需的资源(例如CPU、内存)给容器使用。启动容器通常使用
docker start命令。 - 附加到容器(Attach to Container):附加到容器是指连接到一个正在运行的容器,以便与容器进行交互。当你附加到容器时,你可以在容器的终端执行命令、查看输出和与容器内部进行交互。附加到容器通常使用
docker attach命令。
总结起来,启动容器是将停止的容器变为运行状态,而附加到容器是连接到正在运行的容器的终端以进行交互。
需要注意的是,如果容器没有前台进程在运行,使用 docker attach 命令可能无法提供交互式终端。在这种情况下,你可以考虑使用 docker exec 命令在容器中执行特定命令,而无需连接到容器的终端。
创建容器
连接远程服务器后,根据以下命令创建容器:
1 | docker run --runtime=nvidia -d --name <container_name_or_id> -p 8886:8886 nvcr.io/nvidia/pytorch:21.02-py3 tail -f /dev/null |
其中 --runtime=nvidia 是为了使用 CUDA,--gpus 标志是 Docker 19.03 版本及更高版本的一个功能,用于在容器中启用 GPU 支持。如果 Docker 版本较旧,就要使用 --runtime=nvidia 参数来启用 GPU 支持。
这个命令中添加了 -d 标志将容器设置为后台模式,并在容器内运行 tail -f /dev/null 命令来保持容器的运行。这样,容器将保持运行状态,否则容器可能会直接退出。
进入运行中的容器
要进入正在运行的容器,可以使用以下命令:
1 | docker exec -it <container_name_or_id> bash |
其中,<container_name_or_id> 是要进入的容器的名称或容器的唯一标识符(ID)。
运行上述命令后,会打开一个新的终端会话,进入到容器的命令行环境中。我们可以在该终端会话中执行命令、访问容器内的文件系统和进行其他操作。
如果使用的容器内部的 shell 不是 Bash,可以将 bash 替换为相应的 shell 名称,例如 sh 或 zsh。
请注意,只能进入已经在运行中的容器。如果容器处于已停止状态,需要先启动容器,然后再使用 docker exec 命令进入。
运行图形界面
进入运行中的容器后,可以通过以下命令启动 Jupyter:
1 | jupyter lab --ip=0.0.0.0 --port=8886 --no-browser --allow-root |
复制给出的 URL,粘贴到浏览器中,并修改 hostname 为 localhost,修改 8888 为 8886(PuTTY 中给 Jupyter 设置的端口),就可以打开 Jupyter。
重新连接容器(Jupyter)
在 PuTTY 中通过以下命令进入容器的终端操作页面:
1 | docker exec -it <container_name_or_id> sh |
然后使用以下命令获得 token:
1 | jupyter server list |
最后前往浏览器,访问 localhost:8886,这里 8886 是 SSH 端口号。在弹出页面输入前面获得的 token。





