docker使用记录
简介
每个容器都是由镜像创建的应用程序的一个实例,并且一个主机系统可以运行多个容器,每个容器都是隔离的。
windows docker下载和使用
Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。
因此,Docker 必须部署在 Linux 内核的系统上。如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。
- 启用windows虚拟化功能:
- 设置搜索
启用或关闭windows功能
- 启用
Hyper-V
- 查看虚拟化功能是否开启(右下角虚拟化)
- 下载并使用
wsl2
- 微软商店下载ubuntu22.04 LTS
-
设置
wsl2
为默认版本wsl --set-default-version 2
-
查看版本
wsl -l -v
- docker 下载链接:https://www.docker.com/
docker hub
Docker Hub是docker社区,可以上传自己构建的镜像,自由选择公开还是私有,上面也有大量其他开发者公开的镜像,例如python、ubuntu、cuda+pyTorch等镜像。
相关命令
查看镜像列表
docker images
例如:
一个完整的镜像包含:用户名/仓库名:版本号,例如上面的yk1127/rmdb:v1
。
使用时如果不指定版本号,默认为latest
,如果本地没有,会到远程仓库中拉取,因此使用时确保带上版本号TAG
拉取镜像
docker pull 镜像名[:TAG]
查看单个镜像相关信息
docker image inspect 镜像[:TAG]
查看镜像的可用选项和参数信息
docker run --rm 原镜像[:TAG]/镜像ID --help
镜像改名
docker tag 原镜像[:TAG] 目标镜像[:TAG]
删除镜像
docker image rm 镜像
查看单个容器的内部信息
docker inspect 容器名/容器ID
查看创建容器
-
查看当前运行容器
docker ps
-
查看所有容器(包括停止的)
docker ps -a
-
查看最新创建的容器,只列出最后创建的
docker ps -l
-
列出最后创建的x个容器
docker ps -n=x
创建并运行容器
较简单使用:
docker run -it [--name 容器名] 镜像名
较复杂使用:
docker run --gpus all --rm -it -w /code -v D:\mypyTorch\code:/code -v D:\mypyTorch\input:/input -v D:\mypyTorch\output:/output yk1127/hepar_divide:v1 python run.py
docker run常见参数:
-
–gpus all:使用本机上的全部GPU资源
-
-i:表示"interactive"(交互式),它使得容器的标准输入保持打开状态。这允许用户与容器的终端进行交互,即可以从终端向容器发送输入。
-
-t:表示"tty"(终端),它为容器分配一个伪终端,使得容器内部的应用程序可以与终端交互。
-
–name:指定容器名
-
/bin/bash:指定linux shell为bash
-
–rm:容器停止时自动删除
-
-w:设置容器启动的工作目录
-
CMD命令(跟在镜像名后):启动容器时执行的命令
例如上述的
python run.py
,启动时执行这条命令如果要执行多条指令:
docker run -it 镜像[:TAG] sh -c "cd test && ls && python run.py"
如果报错sh flag无法识别,那么需要指定entrypoint:
docker run -it --entrypoint "" 镜像[:TAG] sh -c "cd test && ls && python run.py"
CMD的命令会被加到ENTRYPOINT后面跟着执行
-
挂载相关参数:
- -v(或者-volume):
用法为Host_dir:Container_dir:[options]
,将本机目录挂载到容器,只能创建bin mount(绑定挂载)
,本机目录必须是绝对路径,如果路径不存在则会自动创建。其中options为可选参数,rw
为读写,ro
为只读,默认为读写。
- –mount,挂载一个主机目录作为数据卷
默认情况下用来挂载volume,但也可以用来创建bind mount和tmpfs。如果不指定type选项,则默认为挂载volume。
volume是一种更为灵活的数据管理方式,示例:
docker run --name $CONTAINER_NAME -it \
--mount type=bind,source=$PWD/$CONTAINER_NAME/app,destination=/app \
--mount source=${CONTAINER_NAME}-data,destination=/data,readonly \
avocado-cloud:latest /bin/bash
注释:
挂载volume命令格式:[type=volume,]source=my-volume,destination=/path/in/container[,...]
创建bind mount命令格式:type=bind,source=/path/on/host,destination=/path/in/container[,...]
如果创建bind mount并指定source则必须是绝对路径,且路径必须已经存在,不存在会报错
示例中readonly表示只读,默认为读写。
挂载主机目录
的配置信息在 “Mounts” 下面,使用docker inspect命令
"Mounts": [
{
"Type": "bind",
"Source": "/src/webapp",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
-
有关挂载可以参考:
Docker数据卷挂载命令volume(-v)与mount的总结 https://blog.csdn.net/sch0120/article/details/106292036
Docker容器数据卷 https://www.cnblogs.com/wtzbk/p/14911229.html
启动已创建容器(处于停止状态的)
docker start
进入已启动容器
docker exec -it 容器ID
停止容器
docker stop
删除容器
docker rm 容器ID
或者
docker rm 容器名
扩展:
rm -f
是一个命令行选项,用于强制删除文件或目录,即使文件或目录被保护或只读也可以删除。该选项将忽略文件或目录的权限设置和警告提示,直接删除它们。
具体来说,rm -f
中的-f
代表"force"(强制),它会强制执行删除操作,无论文件或目录是否被保护、只读或其他任何原因导致删除操作会被阻止。
使用rm -f
命令时需要特别小心,因为它不会提供任何警告或确认提示,而是直接删除目标文件或目录。因此,在使用rm -f
时要确保你要删除的文件或目录是你希望删除的,并且你理解删除操作的后果。
请注意,rm -f
只能删除文件或空目录。如果要删除非空目录,需要使用rm -rf
命令,其中-r
选项表示递归删除目录及其内容。在使用rm -rf
时要特别小心,确保你要删除的目录及其内容是你希望删除的。
退出容器
exit或者ctrl+D //此种方法退出会停止容器运行状态
ctrl+P+Q //此种方法退出不会停止容器运行状态
构建自己的镜像
方法一
- 下载基础镜像并且创建容器
- 在容器内部使用命令安装所需要的软件包和库
- 以不停止容器运行的方式退出容器,即ctrl+P+Q
- 用
docker ps -a
获取当前容器ID - 使用
docker commit
命令获取修改过的镜像并且重命名
docker commit 容器ID 镜像名[:TAG]
方法二
这种方法需要自己编写Dockerfile,有关语法可以参考:https://www.runoob.com/docker/docker-dockerfile.html
构建镜像要先创建一个空目录(即所谓上下文目录),将Dockerfile置于其中,并将COPY命令相关的本机目录置于其中,因为构建时只能在该上下文目录中搜索所需文件。
docker build -t 镜像名[:TAG] .
上传镜像
- 上传镜像前先在Docker Hub中登录账号,并且新建仓库
- 保证docker登录了账号
docker login
- 镜像命名带上仓库名,例如yk1127 / hepar_divide
然后上传:
docker push 镜像名[:TAG]
vscode连接进入docker开发
docker官方插件,但是不好用:
推荐Dev Containers + Remote-SSH:
其中,Remote-SSH是远程连接工具,安装以上两个插件后,可以在侧边栏看到: 这个图标,点进去
,切换到开发容器一栏,会显示本机的容器,
,可以直接在docker容器内部
开发。左下角出现说明已经在容器内部:
debug
问题1
C:\Windows\system32>docker ps -a
error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json?all=1": open //./pipe/docker_engine: The system cannot find the file specified.
解决方案:
该错误提示表明Docker守护进程未在运行,你可以按照以下步骤解决此问题:
请确保你已经正确地安装了Docker并且已经启动了Docker守护进程。如果你是在Windows上使用Docker Desktop,请确保Docker Desktop已成功启动。你可以在任务栏中找到Docker图标并确认它正在运行。
问题2
C:\Windows\system32>docker run -it --name=test deepmi/fastsurfer /bin/bash
ERROR: Flag /bin/bash unrecognized.
解决方案:
该错误表明在运行docker run
命令时,Docker无法识别/bin/bash
标志。这可能是因为你正在运行的镜像不支持以交互方式启动终端。要解决此问题,你可以尝试以下方法:
使用默认的启动命令:不指定/bin/bash
标志,让Docker使用镜像的默认启动命令。在终端中运行以下命令:
docker run -it --name=test deepmi/fastsurfer
这将以默认的启动命令启动deepmi/fastsurfer
镜像,并将你连接到容器的终端。
图标并确认它正在运行。
问题2
C:\Windows\system32>docker run -it --name=test deepmi/fastsurfer /bin/bash
ERROR: Flag /bin/bash unrecognized.
解决方案:
该错误表明在运行docker run
命令时,Docker无法识别/bin/bash
标志。这可能是因为你正在运行的镜像不支持以交互方式启动终端。要解决此问题,你可以尝试以下方法:
使用默认的启动命令:不指定/bin/bash
标志,让Docker使用镜像的默认启动命令。在终端中运行以下命令:
docker run -it --name=test deepmi/fastsurfer
这将以默认的启动命令启动deepmi/fastsurfer
镜像,并将你连接到容器的终端。