Good in study, attitude and health

Docker-Mac(M1)上运行Ubuntu-AMD64

QEMU


Docker 需要 QEMU 来在 ARM 架构上运行 AMD64 镜像。我们可以通过运行 multiarch/qemu-user-static 镜像来配置 QEMU:

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

这条命令会在 Docker 中配置多架构支持。

  • 重启 Docker

下载并运行 AMD64 架构的 Ubuntu 镜像


  • 拉取 AMD64 版本的 Ubuntu 镜像:
docker pull --platform linux/amd64 ubuntu:20.04
  • 创建并运行容器:
docker run --platform linux/amd64 -it ubuntu:20.04
  • 验证架构

在容器中运行以下命令以验证正在使用 AMD 架构的 Ubuntu:

uname -m

输出应为 x86_64,表明当前运行在 AMD64 模拟环境中。

目录挂载


要将本地文件或目录挂载到 Docker 容器中,可以使用 -v 或 –mount 参数。

  • 使用 -v 选项挂载目录
docker run -v /path/to/local/file_or_directory:/path/in/container -it ubuntu

其中:

  • /path/to/local/file_or_directory 是你本地文件或目录的路径。
  • /path/in/container 是你希望在容器中挂载的位置。

例如,如果你想将本地的 /Users/leeson/Downloads 目录挂载到容器中的 /app 目录,可以运行:

docker run -v /Users/leeson/Downloads:/app -it ubuntu:20.04
  • 使用 –mount 选项(推荐)

–mount 提供更直观的语法,适合更复杂的挂载情况。基本语法如下:

docker run --mount type=bind,source=/path/to/local/file_or_directory,target=/path/in/container -it ubuntu
  • type=bind 指定挂载类型为绑定挂载。
  • source 指定本地文件或目录路径。
  • target 指定在容器中的挂载位置。

打开之前的容器


上述方案每次都会创建一个新的容器,想要使用之前的容器,则需要下面的操作:

  • 查看现有的容器列表

首先,找到之前的容器。

查看所有容器(包括已停止的):

docker ps -a

输出示例:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ae70bfe5e9a8 ubuntu "/bin/bash" 2 minutes ago Exited (0) 1 minute ago compassionate_brown

从中找到目标容器的 CONTAINER ID 或 NAMES。

  • 重新启动容器

如果容器已停止,可以重新启动它:

docker start <CONTAINER_ID_or_NAME>
  • 进入容器的终端

使用 docker exec 或 docker attach 进入目标容器。

方法 1:docker exec(推荐)

启动一个新的交互式终端,不会影响容器内原有的进程。

docker exec -it <CONTAINER_ID_or_NAME> /bin/bash

方法 2:docker attach

重新附加到容器的终端,会直接连接到容器的主进程。

docker attach <CONTAINER_ID_or_NAME>

注意:

  • 如果你使用 docker attach,按 Ctrl+C 退出时可能会停止容器。
  • 为避免上述情况,可以使用 docker exec 启动一个新的 Bash 会话。