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
    • 容器是镜像运行的实体,容器可以被创建,运行等。运行的时候是在镜像上创建一个存储层,容器 delete 的时候存储层上的数据会丢失,所以应该要无状态化存储层,文件存储操作在 数据卷绑定宿主目录 来存储
  • 仓库Repository
    • 一个 Docker Registry 中可以包含多个 仓库Repository);每个仓库可以包含多个 标签Tag);每个标签对应一个镜像。
    • 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
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 核心概念快速理解

  1. 镜像(Image)
    • 静态的模板,类似于操作系统的安装光盘。
    • 例如:ubuntu:22.04 是一个 Ubuntu 系统的镜像。
  2. 容器(Container)
    • 镜像的运行时实例,相当于一个轻量级的虚拟机。
    • 容器是临时且可销毁的,默认情况下数据不持久化。
  3. 卷(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 连接

  1. 在 VSCode 安装 Remote - SSH 扩展。
  2. F1,选择 Remote-SSH: Connect to Host
  3. 输入 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 和设置的密码

七、常见问题解答

  1. 关闭后的容器数据在哪?

    • 数据仍在容器的可写层,但容器被删除后数据会丢失。务必使用卷或绑定挂载持久化重要数据。
  2. 如何清理无用资源?

    docker system prune  # 删除所有未使用的镜像、容器、网络
    docker volume prune  # 删除未使用的卷
  3. 如何查看容器日志?

    docker logs my_container