【Docker】镜像操作

Docker镜像的构成

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

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

Docker 镜像使用指南

列出镜像列表

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

sh 复制代码
$ docker images

输出示例:

sh 复制代码
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 镜像:

sh 复制代码
$ docker search httpd

删除镜像

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

sh 复制代码
$ docker rmi hello-world

使用镜像运行容器

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

sh 复制代码
$ 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

查看带有新标签的镜像:

sh 复制代码
$ docker images

打包容器为镜像

查看容器ID

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

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

命令格式

sh 复制代码
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 的容器提交为新镜像,并指定作者和提交信息:

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

在这个示例中:

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

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

sh 复制代码
docker commit -c "CMD [\"python\", \"app.py\"]" abc123 myapp:1.0

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

Dockerfile 创建镜像

创建 Dockerfile

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

  • 编写 Dockerfile :使用文本编辑器创建一个名为 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 命令

    sh 复制代码
    docker build -t your-image-name:tag .
  • 例如:

    sh 复制代码
    docker build -t my-python-app:latest .

    参数说明:

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

查看构建的镜像

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

sh 复制代码
$ docker images

输出示例:

perl 复制代码
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
my-python-app   latest    d9f1b5ca0d77   1 minute ago     345 MB

运行容器

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

sh 复制代码
$ docker run -d -p 5000:5000 my-python-app:latest

参数说明:

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

打包镜像

将镜像打包成tar文件

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

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

    或者

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

    例如:

    bash 复制代码
    docker save -o my-image.tar my-image:latest

将tar包传输到其他服务器

  • 使用scp命令传输文件:

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

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

    例如:

    bash 复制代码
    scp my-image.tar.gz user@192.168.1.100:/home/user/docker-images/

在目标服务器上导入镜像

  • 登录到目标服务器

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

  • 导入镜像

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

    bash 复制代码
    docker load -i [tar文件名].tar

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

    bash 复制代码
    docker load < [tar文件名].tar

    例如:

    bash 复制代码
    docker load -i my-image.tar
  • 启动容器

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

Dockerfile 参数

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

FROM

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

dockerfile 复制代码
FROM ubuntu:20.04

MAINTAINER

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

dockerfile 复制代码
MAINTAINER Your Name "your.email@example.com"

使用 LABEL 代替:

dockerfile 复制代码
LABEL maintainer="Your Name <your.email@example.com>"

RUN

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

dockerfile 复制代码
RUN apt-get update && apt-get install -y python3 python3-pip

COPY

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

dockerfile 复制代码
COPY . /app

ADD

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

dockerfile 复制代码
ADD myfile.tar.gz /app/

WORKDIR

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

dockerfile 复制代码
WORKDIR /app

CMD

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

dockerfile 复制代码
CMD ["python3", "app.py"]

ENTRYPOINT

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

dockerfile 复制代码
ENTRYPOINT ["python3", "app.py"]

ENV

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

dockerfile 复制代码
ENV APP_ENV=production

EXPOSE

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

dockerfile 复制代码
EXPOSE 5000

VOLUME

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

dockerfile 复制代码
VOLUME ["/data"]

USER

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

dockerfile 复制代码
USER appuser

ARG

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

dockerfile 复制代码
ARG APP_VERSION=1.0.0

LABEL

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

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

SHELL

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

dockerfile 复制代码
SHELL ["/bin/bash", "-c"]

示例 Dockerfile

下面是一个综合了以上指令的示例 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"]
相关推荐
全能全知者15 分钟前
docker快速安装与配置mongoDB
mongodb·docker·容器
阿尔帕兹2 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
ZHOU西口4 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
想进大厂的小王6 小时前
Spring-cloud 微服务 服务注册_服务发现-Eureka
微服务·eureka·服务发现
景天科技苑6 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge7 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇7 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试9 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!15 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
追风林16 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker