Docker镜像的构成

一个Docker镜像通常由多个层组成,每一层都基于前一层构建。镜像的层次结构可以分为以下几种情况:

  • 基于完整Linux发行版的镜像: 这类镜像包含一个完整的Linux操作系统,例如Ubuntu、Debian、Alpine等。这些镜像通常用于需要完整系统环境的应用程序。
    • 示例:ubuntu:latest, debian:latest
  • 精简版Linux镜像: 这类镜像仅包含运行应用程序所需的最小环境,没有包含完整的操作系统。这些镜像通常体积较小,启动速度快。
    • 示例:alpine:latest(Alpine Linux是一个非常精简的Linux发行版,体积只有几MB)
  • 基础镜像(Bare Minimum): 这些镜像包含的内容更少,可能仅仅包含应用程序运行所需的二进制文件和库,完全剥离掉了不必要的系统组件。
    • 示例:scratch(这是一个空白镜像,用户可以从头开始构建自己的镜像)

Docker 镜像使用指南

列出镜像列表

使用 docker images 命令列出本地主机上的所有镜像:

$ docker images

输出示例:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               90d5884b1ee0        5 days ago          188 MB

各个选项说明:

  • REPOSITORY:镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

获取新镜像

当在本地主机上使用一个不存在的镜像时,Docker 会自动下载该镜像。为了预先下载镜像,可以使用 docker pull 命令。例如,下载 ollama 镜像:

$ docker pull ollama/ollama

下载完成后,可以直接使用该镜像运行容器。

查找镜像

可以通过 Docker Hub 网站或 docker search 命令来搜索镜像。例如,搜索 httpd 镜像:

$ docker search httpd

删除镜像

使用 docker rmi 命令删除本地镜像。例如,删除 hello-world 镜像:

$ docker rmi hello-world

使用镜像运行容器

可以使用指定版本的镜像来运行容器。例如,运行 Ubuntu 15.10 镜像:

$ docker run -t -i ubuntu:15.10 /bin/bash

参数说明:

  • -i:交互式操作
  • -t:终端
  • ubuntu:15.10:使用 Ubuntu 15.10 版本镜像
  • /bin/bash:启动交互式 Shell

设置镜像标签

使用 docker tag 命令为镜像添加一个新的标签。例如:

$ docker tag 镜像ID new-image-name:new-tag

查看带有新标签的镜像:

$ docker images

打包容器为镜像

查看容器ID

使用docker ps -a命令列出所有容器,包括正在运行的和已停止的。通过容器名或状态等信息找到需要打包的容器ID。

docker commit 命令用于将一个已存在的容器提交为新的 Docker 镜像。您可以通过一些选项来定制这个新镜像的特性。

命令格式

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

参数说明

  • [OPTIONS]:可选参数,以下是一些常用选项:
    • -a, --author string:指定镜像的作者信息。例如:-a "Your Name <you@example.com>"。这将会在镜像的元数据中记录该作者信息。
    • -m, --message string:为这次提交提供描述信息。这个信息也会被保存到镜像的元数据中。例如:-m "Initial commit"
    • -c, --change string:对镜像的构建进行修改,可以通过这个选项来修改 Dockerfile 中的指令。格式为CMD <command>ENV <key>=<value>等。例如:-c "CMD [\"python\", \"app.py\"]"
    • --pause:在提交容器时,暂停容器的运行,默认为 true。可以通过--pause=false来禁用这个选项。
  • CONTAINER:指定要提交的容器的 ID 或名称。
  • [REPOSITORY[:TAG]]:指定新镜像的仓库名和标签(版本)。仓库名是你想为新镜像命名的名称,而标签是一个可选的版本标识符。如果不提供标签,默认为 latest。例如:myusername/myapp:1.0

示例

以下是一个示例,将容器 ID 为 abc123 的容器提交为新镜像,并指定作者和提交信息:

docker commit -a "Your Name <you@example.com>" -m "Initial commit" abc123 myapp:1.0

在这个示例中:

  • abc123 是容器的 ID。
  • myapp 是新镜像的仓库名。
  • 1.0 是镜像的标签。
  • -a 指定了作者信息。
  • -m 提供了提交信息。

此外,您还可以使用 -c 来修改镜像的构建,例如:

docker commit -c "CMD [\"python\", \"app.py\"]" abc123 myapp:1.0

这将设置新镜像的默认命令为 python app.py

Dockerfile 创建镜像

创建 Dockerfile

  • 选择基础镜像:每个 Dockerfile 都以一个基础镜像开始。基础镜像可以是任何现有的 Docker 镜像,例如 Ubuntu、Alpine、CentOS 等。

  • 编写 Dockerfile:使用文本编辑器创建一个名为 Dockerfile 的文件,并在文件中编写指令。

以下是一个示例 Dockerfile 文件:

# 使用官方的 Ubuntu 作为基础镜像
FROM ubuntu:20.04

# 设置维护者信息
MAINTAINER Your Name "your.email@example.com"

# 更新软件包列表并安装必要的软件包
RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip

# 复制应用程序代码到容器中
COPY . /app

# 设置工作目录
WORKDIR /app

# 安装 Python 依赖
RUN pip3 install -r requirements.txt

# 暴露容器的端口
EXPOSE 5000

# 设置容器启动时运行的命令
CMD ["python3", "app.py"]

构建 Docker 镜像

  • 在 Dockerfile 文件所在目录中打开终端

  • 运行 docker build 命令

    docker build -t your-image-name:tag .
    
  • 例如:

    docker build -t my-python-app:latest .
    

    参数说明:

    • -t:指定要创建的目标镜像名和标签。
    • .:指定 Dockerfile 文件所在的当前目录。

查看构建的镜像

构建完成后,可以使用 docker images 命令查看新创建的镜像:

$ docker images

输出示例:

REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
my-python-app   latest    d9f1b5ca0d77   1 minute ago     345 MB

运行容器

使用新创建的镜像运行容器:

$ docker run -d -p 5000:5000 my-python-app:latest

参数说明:

  • -d:以守护进程模式运行容器。
  • -p:将主机的 5000 端口映射到容器的 5000 端口。
  • my-python-app:latest:要运行的镜像名和标签。

打包镜像

将镜像打包成tar文件

  • 保存镜像为tar包:使用docker save命令将镜像保存为一个tar文件。命令格式如下:

    docker save -o [保存的文件名].tar [镜像名称]:[版本号]
    

    或者

    docker save [镜像名称]:[版本号] -o [保存的文件名].tar
    

    例如:

    docker save -o my-image.tar my-image:latest
    

将tar包传输到其他服务器

  • 使用scp命令传输文件:

    如果你需要将打包好的文件传输到另一台服务器,可以使用scp命令。命令格式如下:

    scp [本地文件路径] [目标服务器用户名]@[目标服务器IP]:[目标服务器文件路径]
    

    例如:

    scp my-image.tar.gz user@192.168.1.100:/home/user/docker-images/
    

在目标服务器上导入镜像

  • 登录到目标服务器
    使用SSH或其他方式登录到目标服务器。

  • 导入镜像
    使用docker load命令从tar文件中加载镜像。命令格式如下:

    docker load -i [tar文件名].tar
    

    或者,如果文件是通过重定向方式传入的,可以使用:

    docker load < [tar文件名].tar
    

    例如:

    docker load -i my-image.tar
    
  • 启动容器
    使用docker run命令基于导入的镜像启动容器。命令格式和参数根据实际需求进行配置。

Dockerfile 参数

Dockerfile 是一个包含一系列指令的文本文件,这些指令定义了如何构建 Docker 镜像。下面是 Dockerfile 中常用指令及其详细说明:

FROM

FROM 指令指定了构建镜像时所使用的基础镜像。每一个 Dockerfile 必须以 FROM 指令开头。

FROM ubuntu:20.04

MAINTAINER

MAINTAINER 指令用于指定镜像的作者信息。虽然这个指令已被弃用,建议使用 LABEL 指令来替代。

MAINTAINER Your Name "your.email@example.com"

使用 LABEL 代替:

LABEL maintainer="Your Name <your.email@example.com>"

RUN

RUN 指令在镜像构建过程中执行命令。它可以用于安装软件包、运行脚本等。

RUN apt-get update && apt-get install -y python3 python3-pip

COPY

COPY 指令将文件或目录从主机复制到镜像的文件系统中。相对于 ADD 指令,COPY 更加推荐用于简单的文件复制。

COPY . /app

ADD

ADD 指令类似于 COPY,但它还支持解压 tar 文件和从 URL 下载文件。应谨慎使用 ADD,因为其功能复杂,可能引入意外行为。

ADD myfile.tar.gz /app/

WORKDIR

WORKDIR 指令用于设置镜像中的工作目录。后续的 RUNCMDENTRYPOINT 等指令将使用这个目录作为当前目录。

WORKDIR /app

CMD

CMD 指令指定了容器启动时运行的命令。每个 Dockerfile 只能有一个 CMD,如果指定了多个,只有最后一个会生效。

CMD ["python3", "app.py"]

ENTRYPOINT

ENTRYPOINT 指令配置容器启动时的主命令,通常与 CMD 联合使用,CMD 的参数会传递给 ENTRYPOINT

ENTRYPOINT ["python3", "app.py"]

ENV

ENV 指令用于设置环境变量。

ENV APP_ENV=production

EXPOSE

EXPOSE 指令告诉 Docker 该容器监听的端口。这个指令不会实际打开端口,需要在运行容器时使用 -p 参数映射端口。

EXPOSE 5000

VOLUME

VOLUME 指令创建一个挂载点,并将其挂载到主机或其他容器。

VOLUME ["/data"]

USER

USER 指令设置接下来指令执行时使用的用户。

USER appuser

ARG

ARG 指令定义了构建时的变量,可以在 docker build 命令中使用 --build-arg 参数传递这些变量。

ARG APP_VERSION=1.0.0

LABEL

LABEL 指令用于为镜像添加元数据。

LABEL version="1.0"
LABEL description="This is an example image"
LABEL maintainer="Your Name <your.email@example.com>"

SHELL

SHELL 指令更改默认的 shell 解释器。

SHELL ["/bin/bash", "-c"]

示例 Dockerfile

下面是一个综合了以上指令的示例 Dockerfile:

# 使用官方的 Ubuntu 作为基础镜像
FROM ubuntu:20.04

# 设置镜像维护者信息
LABEL maintainer="Your Name <your.email@example.com>"

# 设置构建时的变量
ARG APP_VERSION=1.0.0

# 设置环境变量
ENV APP_ENV=production

# 更新软件包列表并安装必要的软件包
RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip

# 复制应用程序代码到容器中
COPY . /app

# 设置工作目录
WORKDIR /app

# 安装 Python 依赖
RUN pip3 install -r requirements.txt

# 创建一个数据卷
VOLUME ["/data"]

# 暴露容器的端口
EXPOSE 5000

# 设置用户
USER root

# 设置容器启动时运行的命令
CMD ["python3", "app.py"]

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部