Dockerfile和镜像仓库

离线镜像和镜像仓库

除了使用dockerhub的镜像,离线镜像和自建镜像仓库也是常见的需求

离线镜像的转移

导出镜像:使用 docker save 命令将指定的镜像保存为一个tar文件

bash
# 导出指定镜像
docker save -o myimage.tar myimage:tag

# 导出所有镜像
docker save -o allimages.tar $(docker images --format "{{.Repository}}:{{.Tag}}")

导入镜像:使用 docker load 命令加载这个tar文件

bash
docker load -i myimage.tar  # 或 docker load -i allimages.tar

从容器创建镜像

  1. 使用 docker commit 生成一个新的镜像(虽然 docker commit 提供了一种快捷的方式将当前容器状态保存为镜像,但它并不是普遍推荐的做法):
bash
# 启动容器并修改
docker run -it ubuntu bash
# 在容器中安装软件
apt-get update && apt-get install -y curl

# 提交容器为新镜像
docker commit <container_id> my_ubuntu_with_curl:latest

生成的镜像包含容器的文件系统变更和当前状态(容器的可写层),镜像的元数据(如标签、作者、启动命令等),镜像的历史记录和层信息


  1. docker exportdocker import (主要用于容器文件系统的备份和迁移)
bash
# 导出容器文件系统
docker export -o my_container.tar <container_id>

# 从 tar 文件创建新镜像
docker import my_container.tar my_new_image:tag

通过 docker import 创建的新镜像 仅包含文件系统内容,没有原镜像的构建历史或层信息。


Docker Registry

Docker Registry 是存储和分发 Docker 镜像的服务。支持用户搭建私有的 Docker Registry 来满足内部开发和部署的需求。

安装 Docker Registry 可以通过多种方式进行,这里提供一种使用 Docker 容器的方式进行快速安装:

  1. 确保已经安装了 Docker:首先需要在你的服务器上安装 Docker。

  2. 拉取 Docker Registry 镜像

    bash
    docker pull registry:2
  3. 运行 Docker Registry 容器

    bash
    docker run -d -p 5000:5000 --restart=always --name registry registry:2

    这将在后台启动一个 Docker Registry 实例,并将其绑定到端口 5000 上。

  4. 配置(可选):可以根据需要修改配置文件(如 /etc/docker/registry/config.yml),然后挂载到容器中:

    bash
    docker run -d -p 5000:5000 --restart=always --name registry -v /path/to/local/config.yml:/etc/docker/registry/config.yml registry:2

常见使用场景

  • 内部开发和测试:对于企业来说,建立私有 Docker Registry 可以方便地管理和分享内部使用的镜像,加速开发和测试流程。
  • CI/CD 流水线:在持续集成和持续交付过程中,使用 Docker Registry 存储构建好的镜像,便于后续部署。
  • 多环境部署:不同环境(如开发、测试、生产)可以使用同一个 Registry 来获取相应的 Docker 镜像,保证环境一致性。
  1. 标记镜像:假设你有一个名为 my-app 的镜像想要上传到本地的 Docker Registry:
    bash
    docker tag my-app localhost:5000/my-app
  2. 推送镜像:将标记好的镜像推送到 Docker Registry:
    bash
    docker push localhost:5000/my-app
  3. 从 Registry 拉取镜像:可以在任何一台能够访问该 Docker Registry 的机器上执行以下命令来拉取镜像:
    bash
    docker pull localhost:5000/my-app

Harbor

Harbor 是一个开源的容器镜像仓库,提供了企业级的镜像管理功能,包括镜像管理、安全控制(如用户认证和访问控制)、漏洞扫描以及镜像复制等。它构建在 Docker Registry 之上,添加了更多的企业级特性。

  1. 下载 Harbor 安装包:从 Harbor Releases 页面下载适合你环境的安装包。通常选择在线安装器(harbor-online-installer-<version>.tgz)。

  2. 解压文件

    bash
    tar xvf harbor-online-installer-<version>.tgz
    cd harbor
  3. 配置 Harbor:编辑 harbor.yml 文件以设置必要的参数,例如主机名、HTTP/HTTPS 端口、数据卷路径、管理员初始密码等。如果你打算启用 HTTPS,还需要指定 SSL 证书和私钥的位置。

  4. 准备 Harbor CA 证书(可选):如果你启用了 HTTPS 并使用自签名证书,需要将生成的 CA 证书拷贝到 /etc/docker/certs.d/<your_harbor_host>/ 目录下,并确保所有客户端机器都信任该 CA。

  5. 安装并启动 Harbor

    bash
    sudo ./install.sh

    或者,如果你想使用特定选项(如启用 Notary、Clair 等),可以使用:

    bash
    sudo ./install.sh --with-notary --with-clair

Dockerfile构建镜像

dockerfile:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#dockerfile-instructions

菜鸟教程:https://www.runoob.com/docker/docker-dockerfile.html

Dockerfile 是一个文本文件,包含了一系列的指令和参数,用于定义如何构建一个 Docker 镜像。


Dockerfile常用指令

Dockerfile 由一系列指令组成,每个指令通常占据一行,常用指令示例:

  1. FROM:指定基础镜像。

    text
    FROM ubuntu:20.04

    这条指令指定了你所要使用的父镜像(这里是 Ubuntu 20.04)。所有后续指令都是基于这个基础镜像进行操作的。

  2. LABEL:为镜像添加元数据标签。

    text
    LABEL maintainer="[email protected]"

    可以用来记录镜像维护者的信息等。

  3. RUN:执行命令并在新层中保存结果。

    text
    RUN apt-get update && apt-get install -y curl

    用于安装软件包或执行其他命令,每条 RUN 指令都会在镜像上创建一个新的层。

  4. CMD:提供容器启动时默认执行的命令。

    text
    CMD ["curl", "-s", "http://ip.cn"]

    当容器启动时会执行这条命令。注意,Dockerfile 中只能有一条 CMD 指令,如果有多个,则只有最后一个生效。

  5. ENTRYPOINT:配置容器启动时运行的命令。

    text
    ENTRYPOINT ["curl", "-s", "http://ip.cn"]

    CMD 不同的是,ENTRYPOINT 更适合定义容器的入口点,它不会被 docker run 后面的命令覆盖。

  6. COPYADD:将本地文件拷贝到镜像中。

    text
    COPY . /app/
    ADD https://example.com/file.tar.gz /usr/local/

    COPY 仅支持从主机复制文件到容器内,而 ADD 还可以自动解压 .tar 文件并从 URL 下载文件。

  7. WORKDIR:设置工作目录。

    text
    WORKDIR /app

    设置了容器内的工作目录,后续的 RUN, CMD, ENTRYPOINT 等指令都会在这个目录下执行。

  8. EXPOSE:声明容器运行时监听的端口。

    text
    EXPOSE 80

    这只是声明性的,实际发布端口需要在运行容器时使用 -p 参数。

  9. ENV:设置环境变量。

    text
    ENV MY_NAME="xxx yy"
  10. VOLUME:创建挂载点,用于共享数据卷。

    text
    VOLUME ["/data"]

Dockerfile应用示例

示例:构建一个简单的 Nginx 镜像:

Dockerfile
# 使用官方 Nginx 镜像作为基础镜像
FROM nginx:latest

# 将本地的配置文件拷贝到 Nginx 的配置目录
COPY ./nginx.conf /etc/nginx/nginx.conf

# 暴露 80 端口
EXPOSE 80

# 默认启动 Nginx
CMD ["nginx", "-g", "daemon off;"]

然后,在包含此 Dockerfile 的目录下运行 docker build -t my-nginx . 即可构建出自定义的 Nginx 镜像。