Skip to content
60.Docker»60.CNB下的Docker应用»LV001-hello-world.md

LV001-hello-world

一、启动云原生开发

在cnb的云原生开发的基础镜像中已经为我们安装了docker。

1. 创建仓库

W3C/sumu/docker-demo · Cloud Native Build

image-20251011072726674

我们直接点击云原生开发进入网页版vscode开发页面。

2. docker版本

我们可以直接执行下面的命令查看基础开发环境中docker的版本:

shell
  /workspace git:(main) docker --version
Docker version 26.1.3, build b72abbb

3. docker info

我们可以通过下面的命令查看docker运行时的一些信息:

shell
docker info

【例】

shell
  /workspace git:(main) docker info     #查看运行时信息
Client:
 Version:    26.1.3
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.14.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.27.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 #...

WARNING: Running in rootless-mode without cgroups. To enable cgroups in rootless-mode, you need to boot the system in cgroup v2 mode.

可以简单了解一下,这个client和server都是运行的进程,它们之间通过socket交互,就是下面这个文件:

shell
  /workspace git:(main) ls /var/run/docker.sock 
/var/run/docker.sock

二、开始Hello World

1. docker pull —— 拉取镜像

1.1 命令说明

docker pull 命令用于从 Docker 注册表(例如 Docker Hub)中拉取(下载)镜像到本地。允许用户获取所需的镜像以便在本地运行容器。

shell
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
  • NAME: 镜像名称,通常包含注册表地址,<repo>/<images-name>:<tag>,没有repo的话默认是docker的官方仓库(如 docker.io/library/ubuntu)。
  • TAG(可选): 镜像标签,默认为 latest,一般是像1.1.0这种版本号之类的。
  • DIGEST(可选): 镜像的 SHA256 摘要。

常用选项:

  • --all-tags, -a: 下载指定镜像的所有标签。
  • --disable-content-trust: 跳过镜像签名验证。

1.2 使用示例

这里有一个hello world的镜像:hello-world - Official Image | Docker Hub

  • (1)拉取默认标签(latest)的镜像
shell
docker pull library/hello-world

【例】

shell
  /workspace git:(main) docker pull library/hello-world
Using default tag: latest
latest: Pulling from library/hello-world
17eec7bbc9d7: Pull complete
Digest: sha256:54e66cc1dd1fcb1c3c58bd8017914dbed8701e2d8c74d9262e26bd9cc1642d31
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

这会从 Docker Hub 拉取名为 library 组织下的 hello-world 的镜像,标签默认为 latest。

2. docker images —— 列出本地的镜像

2.1 命令说明

通过 docker images 命令,用户可以查看所有已下载或构建的 Docker 镜像的详细信息,如仓库名称、标签、镜像 ID、创建时间和大小。

shell
docker images [OPTIONS] [REPOSITORY[:TAG]]

OPTIONS 说明:

  • -a, --all: 显示所有镜像(包括中间层镜像)。
  • --digests: 显示镜像的摘要信息。
  • -f, --filter: 过滤输出,基于提供的条件。
  • --format: 使用 Go 模板格式化输出。
  • --no-trunc: 显示完整的镜像 ID。
  • -q, --quiet: 只显示镜像 ID。

2.2 使用示例

我们执行下面的命令:

shell
docker images -a

【例】

shell
  /workspace git:(main) docker images -a
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    1b44b5a3e06a   2 months ago   10.1kB

3. docker run —— 创建并启动一个新的容器

3.1 命令说明

docker run 命令用于创建并启动一个新的容器。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

常用参数说明:

  • -d: 后台运行容器并返回容器 ID。
  • -it: 交互式运行容器,分配一个伪终端。
  • --name: 给容器指定一个名称。
  • -p: 端口映射,格式为 host_port:container_port
  • -v: 挂载卷,格式为 host_dir:container_dir
  • --rm: 容器停止后自动删除容器。
  • --env-e: 设置环境变量。
  • --network: 指定容器的网络模式。
  • --restart: 容器的重启策略(如 noon-failurealwaysunless-stopped)。
  • -u: 指定用户。

3.2 镜像的格式?

跟所有的技术学习起点一样,上述命令使用 docker 运行一个最简单的 hello-world 容器,它的功能仅仅是在屏幕上打印一些文字。docker run 首先会去本地寻找 hello-world 镜像,如果本地没有,则会从默认的 Docker 镜像仓库中拉去,也就是 Docker Hub

镜像的格式一般为:

markdown
<repository>/<image>:<tag>

如果 repository 为空,默认为 Docker Hub, tag 为空,则默认为 latest, 如下是一个 CNB 制品库中的镜像示例, 其中 repository 为 docker.cnb.cool, image 为 looc/git-cnb,tag 为 latest。

markdown
docker.cnb.cool/looc/git-cnb:latest

镜像分为 public 和 private 两种,对于 public 的镜像无需登录即可拉取,对于 private 的镜像则需要登录后才能拉取,登录命令如下

shell
docker login <repository>

具体的登录相关操作后面在60.Docker/60.CNB下的Docker应用/LV020-docker仓库.md中学习。

3.2 使用示例

3.2.1 hello-world

我们执行下面的命令:

shell
docker run library/hello-world

【例】

shell
  /workspace git:(main) docker run library/hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
17eec7bbc9d7: Pull complete
Digest: sha256:54e66cc1dd1fcb1c3c58bd8017914dbed8701e2d8c74d9262e26bd9cc1642d31
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

这个会优先在本地查找镜像并在前台启动一个容器,若是本地没有镜像的话就会自动从对应的仓库下载。这里是run的library/hello-world所以本地是没有的,所以有一个Unable to find image 'hello-world:latest' locally的提示,我们本地的镜像为hello-world,直接用这个名字的话就会使用本地的了。

3.2.2 交互式运行并分配终端

我们执行下面的命令:

shell
docker run -it ubuntu /bin/bash

【例】

shell
  /workspace git:(main) docker run -it ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
4b3ffd8ccb52: Pull complete
Digest: sha256:59a458b76b4e8896031cd559576eac7d6cb53a69b38ba819fb26518536368d86
Status: Downloaded newer image for ubuntu:latest

# 这里就进入了ubuntu容器的终端,可以看一下这个系统的一些信息
root@80a60343a1be:/# uname
Linux

root@80a60343a1be:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

root@80a60343a1be:/# free
               total        used        free      shared  buff/cache   available
Mem:        16777216        3972    16773244           0           0    16773244
Swap:              0           0           0

root@80a60343a1be:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         512G  119M  512G   1% /
tmpfs            64M     0   64M   0% /dev
tmpfs           557G     0  557G   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/md0         20T  9.2T   11T  47% /etc/hosts
overlay         512G  8.0K  512G   1% /usr/local/bin/nproc
tmpfs           557G     0  557G   0% /proc/acpi
tmpfs           557G     0  557G   0% /proc/scsi
tmpfs           557G     0  557G   0% /sys/firmware

root@80a60343a1be:/# cat /proc/version
Linux version 5.4.241-1-tlinux4-0023.2 (mockbuild@VM-81-152-TS3) (gcc version 8.5.0 20210514 (Tencent 8.5.0-26) (GCC)) #1 SMP Mon Jul 14 16:08:26 CST 2025

root@80a60343a1be:/# lsb_release -a
bash: lsb_release: command not found

root@80a60343a1be:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.3 LTS"

上面的命令以交互模式运行 ubuntu 容器,并启动一个 Bash shell。可以看到我们的容器是ubuntu24.04系统。那怎么退出呢?我们直接在这个终端执行exit就会退出当前容器的终端:

shell
root@80a60343a1be:/# exit
exit
  /workspace git:(main) docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
  /workspace git:(main) docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                          PORTS     NAMES
80a60343a1be   ubuntu         "/bin/bash"   6 minutes ago    Exited (0) About a minute ago             zen_gagarin
ed2a73b41087   1b44b5a3e06a   "/hello"      16 minutes ago   Exited (0) 16 minutes ago                 vigorous_agnesi
1a4ae385d925   1b44b5a3e06a   "/hello"      18 minutes ago   Exited (0) 18 minutes ago                 tender_archimedes

退出后这个容器就会停止运行。

3.2.3 后台运行容器

那能不能把容器放在后台?有一些只是服务,需要常驻后台,有的,当然有的,我们使用 -d命令就可以把容器放在后台运行了。我们执行下面的命令:

shell
docker run -it -d ubuntu
docker ps

【例】

shell
  /workspace git:(main) docker run -it -d ubuntu
a81596c36f3a907f188b5412b6515592b082b3d9d4c0627496706bd8563244a4

  /workspace git:(main) docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
a81596c36f3a   ubuntu    "/bin/bash"   7 seconds ago   Up 6 seconds             interesting_dewdney

这个时候就会在后台运行 ubuntu 容器并返回容器 ID。那怎么进入这个容器?执行下面的命令:

shell
docker ps
docker exec -it <CONTAINER ID> /bin/bash

【例】

shell
  /workspace git:(main) docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
a81596c36f3a   ubuntu    "/bin/bash"   4 minutes ago   Up 4 minutes             interesting_dewdney

  /workspace git:(main) docker exec -it a81596c36f3a /bin/bash
root@a81596c36f3a:/#

这样就可以重新进入容器的终端了。这个时候输入 exit ,依然可以退出当前容器,但是还是会在后台运行。

3.3.4 指定容器名称

可以通过 --name 来为容器定义一个名称:

shell
docker run -it --name my_container ubuntu:20.04
docker ps

【例】

shell
  /workspace git:(main) docker run -it --name my_container ubuntu:20.04
root@aabc25e1aaa7:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.6 LTS"
root@aabc25e1aaa7:/#
root@aabc25e1aaa7:/# exit
exit

  /workspace git:(main)
  /workspace git:(main) docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS         PORTS     NAMES
a81596c36f3a   ubuntu    "/bin/bash"   24 minutes ago   Up 7 minutes             interesting_dewdney

  /workspace git:(main) docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                      PORTS     NAMES
aabc25e1aaa7   ubuntu:20.04   "/bin/bash"   51 seconds ago   Exited (0) 14 seconds ago             my_container
a81596c36f3a   ubuntu         "/bin/bash"   24 minutes ago   Up 7 minutes                          interesting_dewdney

运行一个 ubuntu 容器,并将其命名为 my_container,可以看到 aabc25e1aaa7 这个容器的NAME被设置为了 my_container 。

3.3.5 端口映射
shell
docker run -p 8080:80 nginx

将本地主机的 8080 端口映射到容器内的 80 端口,运行 nginx 容器。

3.3.6 挂载卷
shell
docker run -v /host/data:/container/data ubuntu

将主机的 /host/data 目录挂载到容器内的 /container/data 目录。

3.3.7 设置环境变量
shell
docker run -e MY_ENV_VAR=my_value ubuntu

设置环境变量 MY_ENV_VAR 的值为 my_value,运行 ubuntu 容器。

4. docker ps —— 列出容器

4.1 命令说明

默认情况下,docker ps 命令只显示运行中的容器,但也可以通过指定选项来显示所有容器,包括停止的容器。

shell
docker ps [OPTIONS]

OPTIONS说明:

  • -a, --all: 显示所有容器,包括停止的容器。
  • -q, --quiet: 只显示容器 ID。
  • -l, --latest: 显示最近创建的一个容器,包括所有状态。
  • -n: 显示最近创建的 n 个容器,包括所有状态。
  • --no-trunc: 不截断输出。
  • -s, --size: 显示容器的大小。
  • --filter, -f: 根据条件过滤显示的容器。
  • --format: 格式化输出。

4.2 使用示例

4.2.1 列出所有在运行的容器信息

默认情况下,docker ps 只显示正在运行的容器。

shell
docker ps

【例】

shell
CONTAINER ID   IMAGE          COMMAND                ...  PORTS                    NAMES
09b93464c2f7   nginx:latest   "nginx -g 'daemon off" ...  80/tcp, 443/tcp          myrunoob
96f7f14e99ab   mysql:5.6      "docker-entrypoint.sh" ...  0.0.0.0:3306->3306/tcp   mymysql
  • CONTAINER ID: 容器 ID。

  • IMAGE: 使用的镜像。

  • COMMAND: 启动容器时运行的命令。

  • CREATED: 容器的创建时间。

  • STATUS: 容器状态。状态有7种:created(已创建)、restarting(重启中)、running(运行中)、removing(迁移中)、paused(暂停)、exited(停止)、dead(死亡)

  • PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。

  • NAMES: 自动分配的容器名称。

4.2.2 列出所有容器,包括停止的容器
shell
docker ps -a

显示所有容器,包括停止的容器。

5. docker exec —— 执行命令

当我们执行docker run -d -it命令后,会启动一个容器并放置在后台,而我们依然会处于宿主机,那么怎么进入容器的终端呢?

5.1 命令说明

ocker exec 命令用于在运行中的容器内执行一个新的命令。这对于调试、运行附加的进程或在容器内部进行管理操作非常有用。

shell
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

CONTAINER是容器名,也可以是容器的ID。COMMAND就是要执行的命令。

常用参数

  • -d, --detach: 在后台运行命令。
  • --detach-keys: 覆盖分离容器的键序列。
  • -e, --env: 设置环境变量。
  • --env-file: 从文件中读取环境变量。
  • -i, --interactive: 保持标准输入打开。
  • --privileged: 给这个命令额外的权限。
  • --user, -u: 以指定用户的身份运行命令。
  • --workdir, -w: 指定命令的工作目录。
  • -t, --tty: 分配一个伪终端。

5.2 使用示例

5.2.1 在容器内运行命令

可以通过exex直接在容器内运行命令:

shell
docker exec <CONTAINER ID> ls -l

【例】

shell
  /workspace git:(main) docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
a81596c36f3a   ubuntu    "/bin/bash"   4 minutes ago   Up 4 minutes             interesting_dewdney

  /workspace git:(main) docker exec a81596c36f3a ls -l
total 0
lrwxrwxrwx    1 root root   7 Apr 22  2024 bin -> usr/bin
drwxr-xr-x    2 root root  10 Apr 22  2024 boot
drwxr-xr-x    5 root root 360 Oct 12 02:07 dev
drwxr-xr-x    1 root root  86 Oct 12 02:07 etc
drwxr-xr-x    3 root root  28 Oct  1 02:10 home
lrwxrwxrwx    1 root root   7 Apr 22  2024 lib -> usr/lib
lrwxrwxrwx    1 root root   9 Apr 22  2024 lib64 -> usr/lib64
drwxr-xr-x    2 root root  10 Oct  1 02:03 media
drwxr-xr-x    2 root root  10 Oct  1 02:03 mnt
drwxr-xr-x    2 root root  10 Oct  1 02:03 opt
dr-xr-xr-x 7440 root root   0 Oct 12 02:07 proc
drwx------    2 root root  49 Oct  1 02:09 root
drwxr-xr-x    4 root root  45 Oct  1 02:10 run
lrwxrwxrwx    1 root root   8 Apr 22  2024 sbin -> usr/sbin
drwxr-xr-x    2 root root  10 Oct  1 02:03 srv
dr-xr-xr-x   12 root root   0 Sep 24 05:37 sys
drwxrwxrwt    2 root root  10 Oct  1 02:09 tmp
drwxr-xr-x    1 root root  27 Oct  1 02:03 usr
drwxr-xr-x   11 root root 187 Oct  1 02:09 var
5.2.2 以交互模式运行命令

可以用下面的命令进入后台运行的容器的终端:

shell
docker exec -it <CONTAINER ID> /bin/bash

【例】

shell
  /workspace git:(main) docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
a81596c36f3a   ubuntu    "/bin/bash"   4 minutes ago   Up 4 minutes             interesting_dewdney

  /workspace git:(main) docker exec -it a81596c36f3a /bin/bash
root@a81596c36f3a:/#
root@a81596c36f3a:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

6. docker start/stop/restart

6.1 命令说明

6.1.1 docker start

docker start 命令用于启动一个或多个已经创建的容器。

shell
docker start [OPTIONS] CONTAINER [CONTAINER...]

参数

  • -a: 附加到容器的标准输入输出流。
  • -i: 附加并保持标准输入打开。
6.1.2 docker stop

docker stop 命令用于停止一个或多个已经创建的容器。

shell
docker stop [OPTIONS] CONTAINER [CONTAINER...]

参数

  • -t, --time: 停止容器之前等待的秒数,默认是 10 秒。
6.1.3 docker restart

docker restart 命令用于重启一个或多个已经创建的容器。

shell
docker restart [OPTIONS] CONTAINER [CONTAINER...]

参数

  • -t, --time: 重启容器之前等待的秒数,默认是 10 秒。

6.2 使用示例

shell
docker restart <CONTAINER ID> # 重启一个容器
docker stop <CONTAINER ID>    # 停止一个容器
docker start <CONTAINER ID>   # 启动一个容器

【例】

有如下在后台运行的容器:

shell
  /workspace git:(main) docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
a81596c36f3a   ubuntu    "/bin/bash"   7 minutes ago   Up 7 minutes             interesting_dewdney

我们尝试下这三个命令,它们都会返回这个容器的id:

shell
  /workspace git:(main) docker restart a81596c36f3a # 重启一个容器
a81596c36f3a

  /workspace git:(main) docker stop a81596c36f3a    # 停止一个容器
a81596c36f3a
  /workspace git:(main) docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
  /workspace git:(main)

  /workspace git:(main) docker start a81596c36f3a
a81596c36f3a
  /workspace git:(main) docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS         PORTS     NAMES
a81596c36f3a   ubuntu    "/bin/bash"   16 minutes ago   Up 3 seconds             interesting_dewdney

7. docker rm/rmi

7.1 命令说明

7.1.1 docker rm

docker rm 命令用于删除一个或多个已经停止的容器。它不会删除正在运行的容器,如果需要先停止容器,可以使用 docker stop 命令。

shell
docker rm [OPTIONS] CONTAINER [CONTAINER...]

参数说明

  • CONTAINER [CONTAINER...]: 一个或多个要删除的容器的名称或 ID。

OPTIONS

  • -f, --force: 强制删除正在运行的容器(使用 SIGKILL 信号)。
  • -l, --link: 删除指定的连接,而不是容器本身。
  • -v, --volumes: 删除容器挂载的卷。
7.1.2 docker rmi

docker rmi 命令对于管理本地存储的镜像非常有用,帮助用户清理不再需要的镜像,释放存储空间。

shell
docker rmi [OPTIONS] IMAGE [IMAGE...]

参数说明

  • IMAGE: 要删除的镜像的名称或 ID。可以是镜像名、镜像 ID 或镜像摘要
  • OPTIONS: 可选参数,用来控制命令的行为。

OPTIONS

  • -a, --all-tags: 指定仓库名称时,删除该仓库下的所有镜像。
  • -f, --force: 强制删除镜像,即使该镜像被容器使用。
  • --help: 打印帮助信息并退出。
  • --no-prune: 不删除悬空的父镜像。
  • -q, --quiet: 安静模式,不显示删除镜像的详细信息。

7.2 使用示例

7.2.1 删除镜像

通过下面的命令删除镜像:

shell
docker images -a        # 查看当前宿主机中所有镜像
docker rmi <IMAGE ID> # 删除指定的镜像

【例】

shell
  /workspace git:(main) docker images -a
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    1b44b5a3e06a   2 months ago   10.1kB

  /workspace git:(main) docker rmi 1b44b5a3e06a
Untagged: hello-world:latest
Untagged: hello-world@sha256:54e66cc1dd1fcb1c3c58bd8017914dbed8701e2d8c74d9262e26bd9cc1642d31
Deleted: sha256:1b44b5a3e06a9aae883e7bf25e45c100be0bb81a0e01b32de604f3ac44711634
Deleted: sha256:53d204b3dc5ddbc129df4ce71996b8168711e211274c785de5e0d4eb68ec3851

  /workspace git:(main) docker images -a
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

像这种情况就是镜像被容器使用了,虽然容器不在运行,但是还是没法删掉:

shell
  /workspace git:(main) docker rmi hello-world
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container 1a4ae385d925 is using its referenced image 1b44b5a3e06a

这个时候加上 -f参数就可以了,直接强制删除即可。

7.2.2 删除已停止的容器

在我们执行了exit后,容器会变成Exited (退出状态),对应的进程会变成僵尸进程 (Zombie) ,并不会释放资源,我们可以通过rm命令删除容器,进而释放进程资源。

shell
docker rm <CONTAINER ID1> <CONTAINER ID2> ...

【例】

shell
  /workspace git:(main) docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                      PORTS     NAMES
a81596c36f3a   ubuntu         "/bin/bash"   19 minutes ago   Up 3 minutes                          interesting_dewdney
80a60343a1be   ubuntu         "/bin/bash"   27 minutes ago   Exited (0) 23 minutes ago             zen_gagarin
ed2a73b41087   1b44b5a3e06a   "/hello"      37 minutes ago   Exited (0) 37 minutes ago             vigorous_agnesi
1a4ae385d925   1b44b5a3e06a   "/hello"      39 minutes ago   Exited (0) 39 minutes ago             tender_archimedes

  /workspace git:(main) docker rm 80a60343a1be ed2a73b41087 1a4ae385d925
80a60343a1be
ed2a73b41087
1a4ae385d925

  /workspace git:(main) docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS         PORTS     NAMES
a81596c36f3a   ubuntu    "/bin/bash"   20 minutes ago   Up 3 minutes             interesting_dewdney

8. docker inspect

8.1 命令说明

docker inspect 命令用于获取 Docker 对象(容器、镜像、卷、网络等)的详细信息。它将返回 JSON 格式的详细信息,可以帮助用户了解对象的配置和状态。

shell
docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS

  • -f, --format: 使用 Go 模板语法格式化输出。
  • --type: 返回指定类型的对象信息(可选类型:containerimagenetworkvolume)。

8.2 使用示例

后面学习过程中会慢慢接触的。

8.2.1 获取容器默认命令

docker run 命令默认使用镜像中的 Cmd 作为容器的启动命令,Cmd 可通过如下命令来查看。

shell
docker inspect images_name --format='{{.Config.Cmd}}'

我们用hello-world试一下:

shell
  /workspace git:(main) docker inspect hello-world --format='{{.Config.Cmd}}'
[/hello]

可以看到,这个镜像会使用/hello命令,所以其实下面的命令是等效的:

shell
docker run -it hello-world  # 等效于 docker run -it hello-world /hello, 使用 -it 参数启动容器进入交互式终端

三、Alpine Linux

1. Alpine Linux简介

Alpine Linux是一款开源社区开发的、基于musl libcBusyBox轻量级Linux发行版;适合用来做路由器、防火墙、VPNs、VoIP 盒子以及服务器的操作系统。

中文官网:索引 | Alpine Linux 操作系统

Alpine 的意思是“高山的”。它围绕 musl libc 和 busybox 构建。这使得它比传统的 GNU/Linux 发行版更小,更节省资源。通过它创建的一个容器只需不超过 8 MB 的空间。而在磁盘中的最小安装仅要大约 130 MB 的存储空间。

Alpine Linux 是一个非常简洁的发行版。它使用自己的包管理器 apk、OpenRC init 系统、脚本驱动的设置,仅此而已!这为我们提供了一个简洁、清晰的 Linux 环境,没有多余的干扰。然后,我们可以在此基础上添加项目所需的软件包,因此无论是构建家庭 PVR、iSCSI 存储控制器、超薄邮件服务器容器还是坚如磐石的嵌入式交换机,都不会有其他东西妨碍我们。

2. 运行Alpine

我们把这个镜像拉下来看一下:

shell
  /workspace git:(main) docker pull alpine                                     
Using default tag: latest
latest: Pulling from library/alpine
Digest: sha256:4b7ce07002c69e8f3d704a9c5d6fd3053be500b7f1c69fc0d80990c2ad8dd412
Status: Image is up to date for alpine:latest
docker.io/library/alpine:latest

  /workspace git:(main) docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
alpine        latest    706db57fb206   2 weeks ago    8.32MB
hello-world   latest    1b44b5a3e06a   2 months ago   10.1kB

会发现它的镜像只有8.32MB。我们进入交互式终端看一下:

shell
docker run -it alpine

image-20251028233451980

可以看到他也是支持了不少的命令的。我们可以看一下这个系统的一些信息:

shell
/ # uname -a
Linux 56b5a4c6b2ab 5.4.241-1-tlinux4-0023.1 #1 SMP Tue May 6 19:24:58 CST 2025 x86_64 Linux

/ # cat /etc/issue
Welcome to Alpine Linux 3.22
Kernel \r on \m (\l)

3. apk工具

在Alpine中,是使用apk作为包管理工具,我们可以用以下命令安装相关命令:

shell
apk add gcc make

莫道桑榆晚 为霞尚满天.