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
指令用于设置镜像中的工作目录。后续的 RUN
、CMD
、ENTRYPOINT
等指令将使用这个目录作为当前目录。
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"]