https://learn.microsoft.com/zh-cn/windows/wsl/tutorials/wsl-containers
https://yeasy.gitbook.io/docker_practice/basic_concept
可以用 wsl2 引擎来运行 docker,然后通过 vscode 图形化界面来启动,非常方便
Docker 包括三个基本概念
- 镜像(
Image
) - 容器(
Container
) - 仓库(
Repository
)- 一个 Docker Registry 中可以包含多个 仓库(
Repository
);每个仓库可以包含多个 标签(Tag
);每个标签对应一个镜像。 - 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过
<仓库名>:<标签>
的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest
作为默认标签。
- 一个 Docker Registry 中可以包含多个 仓库(
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker run -it --rm ubuntu:18.04 bash
docker run
就是运行容器的命令,具体格式我们会在 容器 进行详细讲解,我们这里简要的说明一下上面用到的参数。
-it
:这是两个参数,一个是-i
:交互式操作,一个是-t
终端。我们这里打算进入bash
执行一些命令并查看返回结果,因此我们需要交互式终端。--rm
:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动docker rm
。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用--rm
可以避免浪费空间。ubuntu:18.04
:这是指用ubuntu:18.04
镜像为基础来启动容器。bash
:放在镜像名后的是 命令,这里我们希望有个交互式 Shell,因此用的是bash
。
docker image ls
镜像列表中,还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 <none>
这个镜像原本是有镜像名和标签的,原来为 mongo:3.2
,随着官方镜像维护,发布了新版本后,重新 docker pull mongo:3.2
时,mongo:3.2
这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 <none>
。除了 docker pull
可能导致这种情况,docker build
也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none>
的镜像。这类无标签镜像也被称为 虚悬镜像 (dangling image) ,可以用下面的命令专门显示这类镜像:
一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除。
$ docker image prune
为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker image ls
列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 -a
参数。
$ docker image ls -a
这样会看到很多无标签的镜像,与之前的虚悬镜像不同,这些无标签的镜像很多都是中间层镜像,是其它镜像所依赖的镜像。这些无标签镜像不应该删除,否则会导致上层镜像因为依赖丢失而出错。实际上,这些镜像也没必要删除,因为之前说过,相同的层只会存一遍,而这些镜像是别的镜像的依赖,因此并不会因为它们被列出来而多存了一份,无论如何你也会需要它们。只要删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除。
如果要删除本地的镜像,可以使用 docker image rm
命令,其格式为:
$ docker image rm [选项] <镜像1> [<镜像2> ...]
一、Docker 核心概念快速理解
- 镜像(Image)
- 静态的模板,类似于操作系统的安装光盘。
- 例如:
ubuntu:22.04
是一个 Ubuntu 系统的镜像。
- 容器(Container)
- 镜像的运行时实例,相当于一个轻量级的虚拟机。
- 容器是临时且可销毁的,默认情况下数据不持久化。
- 卷(Volume)
- 持久化存储数据的机制,独立于容器生命周期。
- 分为命名卷(手动管理)和绑定挂载(直接挂载主机目录)。
“
二、容器管理命令
1. 启动容器
# 基础启动(使用 -it 进入交互式终端)
docker run -it ubuntu:22.04 /bin/bash
# 后台运行(使用 -d 参数)
docker run -d --name my_container ubuntu:22.04 sleep infinity
-it
的作用:-i
:保持标准输入(STDIN)打开,允许你与容器交互。-t
:分配一个伪终端(TTY),让命令行操作更友好。
--name
:为容器指定一个易记的名称(否则 Docker 会随机生成)。
2. 查看容器
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
3. 停止/删除容器
# 停止容器
docker stop my_container
# 删除容器(必须先停止)
docker rm my_container
# 强制删除运行中的容器
docker rm -f my_container
# 删除所有已停止的容器
docker container prune
4. 进入已运行的容器
# 进入容器的终端(推荐)
docker exec -it my_container /bin/bash
# 如果容器未运行,先启动再进入
docker start my_container
docker exec -it my_container /bin/bash
三、镜像管理
1. 拉取镜像
docker pull ubuntu:22.04 # 指定版本
docker pull ubuntu # 默认拉取最新版(latest)
2. 查看本地镜像
docker images
3. 删除镜像
docker rmi ubuntu:22.04
# 强制删除(如果镜像正在被使用)
docker rmi -f ubuntu:22.04
4. 构建自定义镜像
通过 Dockerfile
可以自定义镜像(后续深入学习时可探索)。
四、数据持久化:Volume 与临时存储
1. 使用 Volume 持久化数据
# 创建命名卷
docker volume create my_volume
# 启动容器并挂载卷
docker run -it -v my_volume:/data ubuntu:22.04 /bin/bash
- 数据会保存在
my_volume
中,即使容器被删除,卷依然存在。
2. 临时数据存储
- 默认情况下,容器内修改的文件(未挂载到卷的)会保存在容器的可写层。
- 容器删除后,这些数据会丢失!若需保留,务必使用卷或绑定挂载。
3. 绑定挂载(直接挂载主机目录)
# 将主机当前目录挂载到容器的 /app 路径
docker run -it -v $(pwd):/app ubuntu:22.04 /bin/bash
五、端口映射:通过 VSCode 远程连接
1. 映射容器端口到主机
# 将容器的 22 端口映射到主机的 2222 端口
docker run -d -p 2222:22 --name ssh_container ubuntu:22.04
2. 在容器内安装 SSH 服务
# 进入容器
docker exec -it ssh_container /bin/bash
# 更新包列表并安装 SSH
apt update && apt install -y openssh-server
# 设置 root 密码(用于 VSCode 连接)
passwd
# 启动 SSH 服务
service ssh start
3. 通过 VSCode 连接
- 在 VSCode 安装 Remote - SSH 扩展。
- 按
F1
,选择 Remote-SSH: Connect to Host。 - 输入
ssh root@localhost -p 2222
,输入密码即可连接。
六、完整操作示例
场景:启动一个 Ubuntu 容器,挂载卷,映射端口,用 VSCode 连接
# 步骤 1:创建并启动容器
docker run -d \
--name my_ubuntu \
-v my_volume:/home/data \
-p 2222:22 \
ubuntu:22.04
# 步骤 2:进入容器安装必要工具
docker exec -it my_ubuntu /bin/bash
apt update && apt install -y openssh-server nano
passwd # 设置密码
service ssh start
# 步骤 3:在 VSCode 中通过 SSH 连接
# 使用 root@localhost:2222 和设置的密码
七、常见问题解答
-
关闭后的容器数据在哪?
- 数据仍在容器的可写层,但容器被删除后数据会丢失。务必使用卷或绑定挂载持久化重要数据。
-
如何清理无用资源?
docker system prune # 删除所有未使用的镜像、容器、网络 docker volume prune # 删除未使用的卷
-
如何查看容器日志?
docker logs my_container