sudo docker images
sudo docker ps -a
详细用法参考:docker run
Docker run 命令基本结构:
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
sudo docker run --privileged --gpus all -it --name MegatronDeepSpeed -v ./megatron:/workspace/megatron -v ./dataset:/workspace/dataset -v ./checkpoints:/workspace/checkpoints -v /home/pcljgy/clash:/workspace/clash nvcr.io/nvidia/pytorch:23.08-py3
更常使用以下命令
sudo docker run --gpus all -it --name SD_jgy --runtime=nvidia --shm-size=16g --ulimit memlock=-1 --privileged --net host -v /mnt/guoyong/SD_DockerShared/:/workspace megatronjgy:latest /sbin/init
注意
(1) 使用--privileged
参数,container的root将具备Linux物理机上真正的root权限;如果不加该参数,则container的用户只是物理机上的普通用户。
两者有什么区别呢?root用户可以看到Host的很多设备,例如GPU设备。
如果不加该参数,运行容器可能出现以下错误:
ERROR: The NVIDIA Driver is present, but CUDA failed to initialize. GPU functionality will not be available.
这是因为作为普通用户,无法看到GPU等网络设备
https://blog.csdn.net/wangxuelei036/article/details/107457712
(2)/sbin/init
:容器启动时运行 /sbin/init
,通常用于启动一个完整的系统环境
(3) 参数说明
-v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录
docker run: Docker命令用于创建并启动一个新的容器。
–gpus all: 这个选项告诉Docker容器使用主机上所有的可用NVIDIA GPU。这适用于那些需要大量并行计算能力的任务,如训练深度神经网络。
-it: 这两个标志结合起来使用,-i保持STDIN打开,即使没有附加,-t分配一个伪TTY。这样你可以与容器进行交互。
-i 或 --interactive:这个标志保持标准输入(stdin)对容器打开。即使没有附加到终端,它也允许你与容器进行交互。如果你打算在容器内运行一个需要用户输入的程序或者想要直接与容器内的 shell 会话交互,使用 -i 是很重要的。
-t 或 --tty:这个标志分配一个伪TTY(teletypewriter,电传打字机)。TTY是一种早期的计算机终端类型,而伪TTY模拟了这样的终端环境。当你通过命令行与Docker容器交互时,-t 让你可以像在一个真正的终端里一样工作,支持完整的终端功能,比如使用方向键浏览历史命令、编辑当前命令等
如果没有 -it 标志,那么容器可能会迅速启动并执行完指定的命令然后退出,特别是如果那个命令是一个快速完成的过程,如打印一条消息或执行某个脚本。在这种情况下,你不会有机会与容器进行交互。
–name SD_jgy: 给新创建的容器指定一个名字叫做SD_jgy,便于以后管理(比如停止或删除)这个容器时引用。
–runtime=nvidia: 指定Docker使用NVIDIA容器工具包提供的运行时环境,以便在容器内可以正确地利用NVIDIA GPU。
–shm-size=16g: 设置容器内的共享内存大小为16GB。这对于一些应用程序是必需的,特别是当它们需要处理大型数据集或者要求较高的内存带宽时。
–ulimit memlock=-1: 取消对内存锁定大小的限制。这对于某些高性能计算应用非常重要,因为它们可能需要固定大量的内存页面到RAM中,防止被交换到磁盘上去。
–privileged: 授予容器扩展的权限。这允许容器几乎可以做任何事情,包括加载内核模块等。它极大地增加了安全性风险,因此只应在绝对必要时使用。
–net host: 容器将使用宿主机的网络命名空间,这意味着容器不会获得自己的IP地址,而是直接使用宿主机的网络接口。这种方式简化了网络配置,但也降低了隔离性。
-v /mnt/guoyong/SD_DockerShared/:/workspace: 将宿主机上的目录/mnt/guoyong/SD_DockerShared/挂载到容器内的/workspace路径下。这样做可以让容器内外的数据共享变得简单,同时也可以持久化存储在容器外部的数据。
megatronjgy:latest: 这是你想要运行的Docker镜像名称及其标签版本。在这里,latest标签表示你希望使用该镜像的最新版本。
/sbin/init: 最后这部分是指定容器启动时应该运行的进程。这里指定的是/sbin/init,这通常是Linux系统初始化过程的一部分,意味着你可能想让容器作为一个完整的系统来运行,而不是仅仅运行某个特定的应用程序。
(4) ssh连接docker
可以参考链接ssh使用docker开发
1 如果使用ssh,就不能使用主机提供的网络。否则会占用主机原本的端口。最好是进行一步端口转发。
使用-p参数
sudo docker run -p 50001:22 ...
代表将宿主机的50001端口映射到容器中的22端口。这样做了映射之后,可以通过50001访问该容器。
首先保证容器的ssh应用程序在运行
apt-get install openssh-server #安装openssh-server
/etc/init.d/ssh start #启动ssh
ssh-keygen # 生成秘钥
查看ssh应用是否启动
ps -auxe | grep ssh
假定服务器的IP地址是11.3.52.6,通过以下命令连接
ssh -p 50001 [email protected]
可以通过docker ps
或者docker container ls
命令,查看docker网络的端口映射
2 在使用主机端口下如何进行ssh连接
这种情况下,可以修改docker中ssh端口实现连接
首先,确保安装了openssh-server
其次,修改 /etc/ssh/sshd_config
在# Port 22
添加一行 Port 10001
,那么,就使用10001
端口连接ssh
重启服务
service sshd restart
如果出现sshd: unrecognized service
,执行以下命令
/etc/init.d/ssh restart
重启后使用新端口登录
ssh -p 10001 [email protected]
为配置免密登录,可以将公钥添加到文件authorized_keys
中
cd /root/.ssh
vim authorized_keys
sudo docker exec -it 96694feb8d35 /bin/bash
docker stop
sudo docker restart "docker_container_id"
尽管docker正在运行,不过也可以直接删除
docker rm -f $(docker ps -aq)
Docker 打包容器成镜像
要将一个容器打包成镜像,可以通过 Docker 命令行使用 docker commit 命令来完成。docker commit 命令会创建一个新的镜像,该镜像是基于指定容器当前状态的快照。
以下是一个简单的步骤来将容器打包成镜像:
确保容器正在运行:确保要打包成镜像的容器正在运行状态。
获取容器的 ID:使用 docker ps 命令获取容器的 ID。
docker ps
输出会显示运行中的容器列表,其中包括容器的 ID。
使用 docker commit 命令创建镜像:使用以下命令将容器打包成镜像。
docker commit
:是要打包成镜像的容器的 ID。
:是新镜像的名称。
例如:
docker commit 1a2b3c4d5e6f my-new-image:latest
验证新镜像:使用 docker images
命令验证新创建的镜像是否存在。
docker images
这会列出所有本地镜像,你应该能够在列表中看到刚刚创建的新镜像。
请注意,使用 docker commit 命令创建镜像时,它会基于当前容器的状态创建快照,但可能不会包含完整的构建历史记录或 Dockerfile 中的所有步骤。通常最佳做法是使用 Dockerfile 来构建镜像,这样可以更好地管理镜像的版本控制和构建过程。
原文链接:https://blog.csdn.net/Go_ahead_forever/article/details/134980597
https://www.runoob.com/docker/docker-container-usage.html
# 【docker】Ubuntu服务器docker搭建与使用
Linux教程