目录

创建Docker镜像方法

创建一个 Docker 镜像通常有以下几种方法: {:toc}

1. 通过 Dockerfile 创建镜像(推荐方式)

这是最常用和灵活的方法。 步骤:

  1. 创建一个 Dockerfile: Dockerfile 是一个文本文件,包含镜像构建的指令。 示例 Dockerfile:
# 使用基础镜像
FROM ubuntu:20.04
# 设置维护者信息
LABEL maintainer="your_email@example.com"
# 安装依赖
RUN apt-get update && apt-get install -y curl
# 设置工作目录
WORKDIR /app
# 复制文件到镜像
COPY . /app
# 设置启动命令
CMD ["bash"]
  1. 构建镜像: 在 Dockerfile 所在目录运行以下命令:
docker build -t <镜像名称>:<标签> .

例如:

docker build -t myimage:1.0 .
  1. 查看镜像: 构建完成后,可以用以下命令查看:
docker images

2. 从容器提交镜像

手动配置容器后,将其提交为镜像。 步骤:

  1. 运行一个基础镜像
docker run -it ubuntu:20.04
  1. 在容器中安装或配置内容: 例如:
apt-get update && apt-get install -y curl
  1. 提交容器为镜像: 在另一个终端中,找到容器 ID,然后提交:
docker ps -a
docker commit <容器ID> <镜像名称>:<标签>

例如:

docker commit 123abc myimage:1.0

3. 使用已有镜像修改后创建

  1. 启动一个现有镜像。
  2. 进入容器后,做出更改。
  3. 使用 docker commit 保存修改为新的镜像。

4. 导入和导出方式

如果有现成的文件系统快照,也可以通过 docker importdocker export

  • 导入镜像:
cat filesystem.tar | docker import - myimage:1.0
  • 导出镜像:
docker save -o myimage.tar myimage:1.0
docker load < myimage.tar

选择最适合你的方法,通常推荐使用 Dockerfile,因为它更方便维护和共享。

5. 打开运行一个容器镜像

运行一个交互式 Docker 容器镜像可以通过以下方法完成,通常需要使用 docker run-it 参数。

基本命令

docker run -it IMAGE_NAME /bin/bash
  • -i:表示交互模式,保持标准输入流(stdin)打开。
  • -t:分配一个伪终端,让你可以与容器交互。
  • IMAGE_NAME:镜像的名称,例如 ubuntualpine 等。
  • /bin/bash:启动容器后进入 bash shell。

示例 1:运行 Ubuntu 镜像

如果你要运行一个 Ubuntu 镜像并进入交互模式:

docker run -it ubuntu /bin/bash

这将下载 Ubuntu 镜像(如果本地没有),然后启动容器,并进入容器的 bash shell。

示例 2:使用交互模式并带参数运行

如果你的镜像需要传递参数,可以直接跟在命令后。例如:

docker run -it alpine sh

这里 Alpine 镜像使用的是 sh,因为它没有 bash

示例 3:为容器指定别名并进入交互模式

docker run -it --name my-container ubuntu /bin/bash
  • --name my-container:为容器命名为 my-container
  • 你可以使用 docker ps -a 查看它的名字,方便后续管理。

示例 4:运行并挂载目录

在运行交互式容器时,你也可以挂载主机目录到容器内:

docker run -it -v ~/my_data:/mnt/my_data ubuntu /bin/bash
  • -v ~/my_data:/mnt/my_data:将主机目录 ~/my_data 挂载到容器内的 /mnt/my_data

示例 5:进入已经运行的容器

如果你有一个正在运行的容器,可以通过以下命令进入交互模式:

docker exec -it CONTAINER_NAME /bin/bash

例如:

docker exec -it my-container /bin/bash

退出交互模式

在交互模式下,你可以通过以下方式退出:

  1. 输入 exit 命令。
  2. 使用快捷键 Ctrl+D

总结

  • 首次运行镜像并交互: 使用 docker run -it IMAGE_NAME /bin/bash
  • 进入已运行的容器: 使用 docker exec -it CONTAINER_NAME /bin/bash
  • 挂载目录时运行: 使用 -v 参数。 这可以让你轻松运行交互式镜像并管理容器内的环境。

6. 挂载工作目录

在 Docker 中,挂载主机目录到容器内部可以通过 -v--mount 参数完成。这允许容器直接访问主机文件系统的一部分,非常适合共享数据或在容器内进行文件修改。

挂载方法 1:使用 -v 参数

语法:

docker run -v <主机路径>:<容器路径> IMAGE_NAME

示例:

将主机的目录 ~/my_data 挂载到容器中的 /mnt/my_data

docker run -it -v ~/my_data:/mnt/my_data ubuntu /bin/bash

说明

  • ~/my_data 是主机上的目录。
  • /mnt/my_data 是容器中的路径。
  • 如果目录不存在:
  • 主机目录 ~/my_data 会被自动创建。
  • 容器中的 /mnt/my_data 路径始终会被自动创建。

挂载方法 2:使用 --mount 参数

--mount 提供了更多的选项和灵活性。 语法:

docker run --mount type=bind,source=<主机路径>,target=<容器路径> IMAGE_NAME

示例:

docker run -it --mount type=bind,source=$HOME/my_data,target=/mnt/my_data ubuntu /bin/bash

说明

  • type=bind:表示绑定主机目录。
  • source=$HOME/my_data:主机上的路径。
  • target=/mnt/my_data:容器内的路径。 --mount vs -v 的区别
  • --mount 是更显式的写法,推荐用于复杂挂载场景。
  • -v 是旧语法,简单快捷,适合基本场景。

挂载为只读

如果只需要读取文件,可以将挂载设置为只读模式。

使用 -v

docker run -it -v ~/my_data:/mnt/my_data:ro ubuntu /bin/bash

使用 --mount

docker run -it --mount type=bind,source=$HOME/my_data,target=/mnt/my_data,readonly ubuntu /bin/bash

检查挂载点

运行容器后,可以在容器内检查挂载是否成功:

ls /mnt/my_data

常见问题

  1. 路径无效
  • 确保主机目录路径是绝对路径。如果是相对路径,Docker 会报错。
  • 如果主机路径包含 ~,确保它被正确解析成绝对路径,可以用 $HOME
  1. 权限问题
  • 如果容器无法访问挂载的目录,可能是权限不足。可以用 chmod 修改主机目录的权限。
  • 或者以 root 权限运行容器:
sudo docker run ...
  1. 目录没有同步
  • 确保主机路径和容器路径正确匹配。
  • 如果需要实时同步,可以考虑挂载动态文件系统。

示例总结

以下是一个综合的挂载示例:

docker run -it --name my-container \
-v ~/my_data:/mnt/my_data:ro \
-v /tmp/logs:/mnt/logs \
ubuntu /bin/bash

挂载两个目录,其中:

  • ~/my_data 是只读模式。
  • /tmp/logs 是读写模式。