目录
docker 使用教程
本篇是 PWstudio 容器日常使用过程中会用到的 Docker 命令合集,从基础概念、常用命令速查,到针对 PWstudio 容器本身的操作(查看日志、进容器、传文件、开机自启),以及几个最常遇到的报错处理,都整理在这里。遇到问题可以直接搜索关键字定位,不需要通篇读完。所有命令都建议复制粘贴执行,注意不要把命令提示符也一起复制进去。
1. 基本概念
简单理解一下几个概念,方便看懂下面的命令:
- 镜像(Image):相当于一个打包好的“安装盘”,里面包含了运行 PWstudio 所需要的完整环境(系统、依赖库、程序等),比如
ccr.ccs.tencentyun.com/lxkt/qflowgpu:latest就是 PWstudio gpu 版的镜像。镜像本身是只读的,不会因为你使用而发生改变。 - 容器(Container):是镜像“运行起来”之后的一个实例,相当于用安装盘装出来的一台正在运行的机器。你平时说的 “qflowcpu”、“qflowgpu” 就是给这个容器起的名字(
–name参数指定的),一个镜像可以启动出多个容器,但本教程场景下一般只启动一个。 - 需要注意:删除容器(
docker rm)不会删除镜像,下次可以用同一个镜像重新创建容器;但容器内部产生、且没有映射到宿主机的数据,一旦容器被删除就会丢失,所以重要数据要么放在通过-v参数映射出来的目录里,要么记得提前备份。
2. 常用命令速查
以下命令大部分需要 root 权限,如果提示权限不够(permission denied),在命令最前面加上 sudo 即可。
2.1 查看容器状态
# 查看正在运行的容器 sudo docker ps # 查看所有容器,包括已经停止的 sudo docker ps -a
docker ps 只显示当前正在运行的容器;如果容器之前被停止了(比如宿主机重启过),需要加上 -a 才能看到它,STATUS 列会显示 “Exited …” 表示已停止,“Up …” 表示正在运行。
2.2 查看本地镜像
sudo docker images
会列出当前服务器上已经下载好的所有镜像,包括镜像名、版本号(TAG)、大小等信息。
2.3 启动 / 停止 / 重启容器
# 启动一个已经存在、但当前处于停止状态的容器 sudo docker start qflowcpu # 停止一个正在运行的容器 sudo docker stop qflowcpu # 重启一个容器(等价于先 stop 再 start) sudo docker restart qflowcpu
请把 qflowcpu 换成你自己实际的容器名(gpu 版一般是 qflowgpu,可以用 2.1 的 docker ps -a 查看确认)。这几条命令都是针对已经创建好的容器,不会重新拉取镜像,也不会丢失容器内的数据。
宿主机(服务器)重启之后,之前创建的容器不会自动消失,但也不一定会自动启动,取决于创建容器时有没有加自动重启的参数。如果重启服务器后发现网页打不开了,先执行 sudo docker ps -a 看看容器是不是处于 “Exited” 状态,如果是,执行 sudo docker start qflowcpu(换成你的容器名)手动启动一下即可,不需要重新执行整个 docker run。
2.4 进入容器内部
# 进入容器内部,打开一个交互式命令行 sudo docker exec -it qflowcpu bash # 操作完成后,退出容器、回到宿主机(不会导致容器停止) exit
这是最常用的排查方式:进到容器里面,就相当于登录到了一台独立的 Linux 系统上,可以在里面查看文件、运行命令。执行 exit 只是退出这个交互窗口,容器本身仍然继续在后台运行,不受影响。
2.5 查看容器日志
# 查看容器最近的日志(容器内部程序打印出来的信息) sudo docker logs qflowcpu # 只看最后 100 行,比较常用,避免刷屏 sudo docker logs --tail 100 qflowcpu # 实时滚动查看日志(相当于 tail -f),按 Ctrl+C 退出 sudo docker logs -f qflowcpu
当网页打不开、或者提交计算任务报错,但又不确定是哪里出的问题时,先看一眼容器日志往往是最快的排查方法,很多报错信息会直接打印在这里。
2.6 容器与宿主机之间拷贝文件
# 把宿主机上的文件拷贝进容器里 sudo docker cp /宿主机上的路径/文件名 qflowcpu:/容器里的路径/ # 把容器里的文件拷贝到宿主机 sudo docker cp qflowcpu:/容器里的路径/文件名 /宿主机上的路径/
这个命令平时不常用(因为正常情况下都是通过网页或者 SSH/SFTP 上传下载数据,参考 MobaXterm 新手教程),但如果遇到特殊情况需要直接在宿主机和容器之间传单个文件,可以用这条命令,不需要额外安装东西。
2.7 查看容器资源占用
sudo docker stats qflowcpu
会实时显示这个容器当前占用的 CPU、内存等资源情况,如果怀疑是资源不够导致计算跑得很慢或者报错,可以看一下这里,按 Ctrl+C 退出查看。
2.8 拉取(下载)镜像
sudo docker pull ccr.ccs.tencentyun.com/lxkt/qflowcpu:latest
从远端镜像仓库下载 PWstudio 镜像到本地。如果本地已经有相同版本,会很快提示“已是最新”;如果没有,会下载完整镜像,根据网速可能需要几分钟到十几分钟,请耐心等待。
2.9 彻底删除容器 / 镜像
# 删除一个容器(容器必须先停止,否则会提示报错,可以先 docker stop) sudo docker rm qflowcpu # 删除一个镜像(注意:如果还有容器在用这个镜像,需要先把容器删掉) sudo docker rmi ccr.ccs.tencentyun.com/lxkt/qflowcpu:latest
docker rm 删除的只是容器这个“运行实例”,不会删除镜像本身,也不会删除你通过 -v 参数挂载到宿主机上的数据文件;但容器内部、没有做数据映射的文件会随着删除一起消失,删除前请确认好,重要数据建议提前备份。
3. 排查处理容器名冲突(最常见报错)
如果你在重新创建或者重启容器时,看到类似下面这个报错:
docker: Error response from daemon: Conflict. The container name "/qflowcpu" is already in use by container "02919a65bee0615eb8960ff7f9ee0f54c8f2924cf6f692fcd8a9191f1356ead3". You have to remove (or rename) that container to be able to reuse that name.
意思是:你想创建的容器名字(比如 “qflowcpu”)已经被一个已存在的旧容器占用了,Docker 不允许两个容器同名,需要先把旧容器处理掉,再重新创建。按下面顺序操作:
- 确认一下:执行
sudo docker ps -a,能看到一行NAMES列显示qflowcpu的记录,跟报错信息里的名字对上。 - 停止旧容器:
sudo docker stop qflowcpu - 删除旧容器:
sudo docker rm qflowcpu
如果只是想让容器重启一下(并不是想改名字或者换镜像版本),不需要这么麻烦,直接执行 sudo docker restart qflowcpu 就够了,不用先 stop 再 rm 再 run。
4. 常见报错
4.1 端口被占用
Error response from daemon: driver failed programming external connectivity on endpoint qflowcpu: Bind for 0.0.0.0:80 failed: port is already allocated
说明宿主机上的 80(或 81、2297 等)端口已经被别的程序占用了,常见原因是服务器上已经装了别的 Web 服务(比如 nginx/apache),或者是之前启动的旧容器还占着这个端口。可以先执行 sudo docker ps -a 看看是不是有别的容器占用了对应端口,处理掉冲突(停止占用端口的服务,或者把旧容器删除)之后再重新启动。
4.2 磁盘空间不足
no space left on device
说明服务器磁盘空间不够了,可执行下面命令清理一下 Docker 长期积累下来的、没用的镜像和临时文件(不会影响正在使用的镜像和容器):
sudo docker system df # 先查看 docker 占用了多少空间 sudo docker system prune # 清理没有被使用的镜像、容器、网络等垃圾数据
执行 docker system prune 时会先询问是否确认,输入 y 回车确认即可。
4.3 permission denied
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
说明当前登录用户没有权限直接使用 Docker,最简单的办法是在命令前面加上 sudo;如果不想每次都加 sudo,可以参考安装文档里“配置非 root 用户权限”那一小节(把自己加入 docker 用户组),设置完需要重新登录一次才会生效。
4.4 找不到命令行提交任务时的其它问题
如果是容器内部(比如 slurm 提交计算任务)出现的报错,跟 Docker 本身没有关系,请查看 PWstudio 安装常见问题 或者 PWstudio 在命令行提交。
