一个Docker镜像通常由多个层组成,每一层都基于前一层构建。镜像的层次结构可以分为以下几种情况:
ubuntu:latest, debian:latestalpine:latest(Alpine Linux是一个非常精简的Linux发行版,体积只有几MB)scratch(这是一个空白镜像,用户可以从头开始构建自己的镜像)使用 docker images 命令列出本地主机上的所有镜像:
$ docker images 输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB 各个选项说明:
当在本地主机上使用一个不存在的镜像时,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 使用docker ps -a命令列出所有容器,包括正在运行的和已停止的。通过容器名或状态等信息找到需要打包的容器ID。
docker commit 命令用于将一个已存在的容器提交为新的 Docker 镜像。您可以通过一些选项来定制这个新镜像的特性。
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] [OPTIONS]:可选参数,以下是一些常用选项: -a, --author string:指定镜像的作者信息。例如:-a "Your Name " 。这将会在镜像的元数据中记录该作者信息。-m, --message string:为这次提交提供描述信息。这个信息也会被保存到镜像的元数据中。例如:-m "Initial commit"。-c, --change string:对镜像的构建进行修改,可以通过这个选项来修改 Dockerfile 中的指令。格式为CMD 、ENV = 等。例如:-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 " -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 都以一个基础镜像开始。基础镜像可以是任何现有的 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"] 在 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包:使用docker save命令将镜像保存为一个tar文件。命令格式如下:
docker save -o [保存的文件名].tar [镜像名称]:[版本号] 或者
docker save [镜像名称]:[版本号] -o [保存的文件名].tar 例如:
docker save -o my-image.tar my-image:latest 使用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 是一个包含一系列指令的文本文件,这些指令定义了如何构建 Docker 镜像。下面是 Dockerfile 中常用指令及其详细说明:
FROM 指令指定了构建镜像时所使用的基础镜像。每一个 Dockerfile 必须以 FROM 指令开头。
FROM ubuntu:20.04 MAINTAINER 指令用于指定镜像的作者信息。虽然这个指令已被弃用,建议使用 LABEL 指令来替代。
MAINTAINER Your Name "your.email@example.com" 使用 LABEL 代替:
LABEL maintainer="Your Name " RUN 指令在镜像构建过程中执行命令。它可以用于安装软件包、运行脚本等。
RUN apt-get update && apt-get install -y python3 python3-pip COPY 指令将文件或目录从主机复制到镜像的文件系统中。相对于 ADD 指令,COPY 更加推荐用于简单的文件复制。
COPY . /app ADD 指令类似于 COPY,但它还支持解压 tar 文件和从 URL 下载文件。应谨慎使用 ADD,因为其功能复杂,可能引入意外行为。
ADD myfile.tar.gz /app/ WORKDIR 指令用于设置镜像中的工作目录。后续的 RUN、CMD、ENTRYPOINT 等指令将使用这个目录作为当前目录。
WORKDIR /app CMD 指令指定了容器启动时运行的命令。每个 Dockerfile 只能有一个 CMD,如果指定了多个,只有最后一个会生效。
CMD ["python3", "app.py"] ENTRYPOINT 指令配置容器启动时的主命令,通常与 CMD 联合使用,CMD 的参数会传递给 ENTRYPOINT。
ENTRYPOINT ["python3", "app.py"] ENV 指令用于设置环境变量。
ENV APP_ENV=production EXPOSE 指令告诉 Docker 该容器监听的端口。这个指令不会实际打开端口,需要在运行容器时使用 -p 参数映射端口。
EXPOSE 5000 VOLUME 指令创建一个挂载点,并将其挂载到主机或其他容器。
VOLUME ["/data"] USER 指令设置接下来指令执行时使用的用户。
USER appuser ARG 指令定义了构建时的变量,可以在 docker build 命令中使用 --build-arg 参数传递这些变量。
ARG APP_VERSION=1.0.0 LABEL 指令用于为镜像添加元数据。
LABEL version="1.0" LABEL description="This is an example image" LABEL maintainer="Your Name " SHELL 指令更改默认的 shell 解释器。
SHELL ["/bin/bash", "-c"] 下面是一个综合了以上指令的示例 Dockerfile:
# 使用官方的 Ubuntu 作为基础镜像 FROM ubuntu:20.04 # 设置镜像维护者信息 LABEL maintainer="Your Name " # 设置构建时的变量 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"]