离线镜像和镜像仓库
除了使用dockerhub的镜像,离线镜像和自建镜像仓库也是常见的需求
离线镜像的转移
导出镜像:使用 docker save
命令将指定的镜像保存为一个tar文件
# 导出指定镜像
docker save -o myimage.tar myimage:tag
# 导出所有镜像
docker save -o allimages.tar $(docker images --format "{{.Repository}}:{{.Tag}}")
导入镜像:使用 docker load
命令加载这个tar文件
docker load -i myimage.tar # 或 docker load -i allimages.tar
从容器创建镜像
- 使用
docker commit
生成一个新的镜像(虽然docker commit
提供了一种快捷的方式将当前容器状态保存为镜像,但它并不是普遍推荐的做法):
# 启动容器并修改
docker run -it ubuntu bash
# 在容器中安装软件
apt-get update && apt-get install -y curl
# 提交容器为新镜像
docker commit <container_id> my_ubuntu_with_curl:latest
生成的镜像包含容器的文件系统变更和当前状态(容器的可写层),镜像的元数据(如标签、作者、启动命令等),镜像的历史记录和层信息
docker export
和docker import
(主要用于容器文件系统的备份和迁移)
# 导出容器文件系统
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 容器的方式进行快速安装:
-
确保已经安装了 Docker:首先需要在你的服务器上安装 Docker。
-
拉取 Docker Registry 镜像:
bashdocker pull registry:2
-
运行 Docker Registry 容器:
bashdocker run -d -p 5000:5000 --restart=always --name registry registry:2
这将在后台启动一个 Docker Registry 实例,并将其绑定到端口 5000 上。
-
配置(可选):可以根据需要修改配置文件(如
/etc/docker/registry/config.yml
),然后挂载到容器中:bashdocker 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 镜像,保证环境一致性。
- 标记镜像:假设你有一个名为
my-app
的镜像想要上传到本地的 Docker Registry:bashdocker tag my-app localhost:5000/my-app
- 推送镜像:将标记好的镜像推送到 Docker Registry:
bash
docker push localhost:5000/my-app
- 从 Registry 拉取镜像:可以在任何一台能够访问该 Docker Registry 的机器上执行以下命令来拉取镜像:
bash
docker pull localhost:5000/my-app
Harbor
Harbor 是一个开源的容器镜像仓库,提供了企业级的镜像管理功能,包括镜像管理、安全控制(如用户认证和访问控制)、漏洞扫描以及镜像复制等。它构建在 Docker Registry 之上,添加了更多的企业级特性。
-
下载 Harbor 安装包:从 Harbor Releases 页面下载适合你环境的安装包。通常选择在线安装器(
harbor-online-installer-<version>.tgz
)。 -
解压文件:
bashtar xvf harbor-online-installer-<version>.tgz cd harbor
-
配置 Harbor:编辑
harbor.yml
文件以设置必要的参数,例如主机名、HTTP/HTTPS 端口、数据卷路径、管理员初始密码等。如果你打算启用 HTTPS,还需要指定 SSL 证书和私钥的位置。 -
准备 Harbor CA 证书(可选):如果你启用了 HTTPS 并使用自签名证书,需要将生成的 CA 证书拷贝到
/etc/docker/certs.d/<your_harbor_host>/
目录下,并确保所有客户端机器都信任该 CA。 -
安装并启动 Harbor:
bashsudo ./install.sh
或者,如果你想使用特定选项(如启用 Notary、Clair 等),可以使用:
bashsudo ./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 由一系列指令组成,每个指令通常占据一行,常用指令示例:
-
FROM:指定基础镜像。
textFROM ubuntu:20.04
这条指令指定了你所要使用的父镜像(这里是 Ubuntu 20.04)。所有后续指令都是基于这个基础镜像进行操作的。
-
LABEL:为镜像添加元数据标签。
textLABEL maintainer="[email protected]"
可以用来记录镜像维护者的信息等。
-
RUN:执行命令并在新层中保存结果。
textRUN apt-get update && apt-get install -y curl
用于安装软件包或执行其他命令,每条
RUN
指令都会在镜像上创建一个新的层。 -
CMD:提供容器启动时默认执行的命令。
textCMD ["curl", "-s", "http://ip.cn"]
当容器启动时会执行这条命令。注意,Dockerfile 中只能有一条
CMD
指令,如果有多个,则只有最后一个生效。 -
ENTRYPOINT:配置容器启动时运行的命令。
textENTRYPOINT ["curl", "-s", "http://ip.cn"]
与
CMD
不同的是,ENTRYPOINT
更适合定义容器的入口点,它不会被 docker run 后面的命令覆盖。 -
COPY 和 ADD:将本地文件拷贝到镜像中。
textCOPY . /app/ ADD https://example.com/file.tar.gz /usr/local/
COPY
仅支持从主机复制文件到容器内,而ADD
还可以自动解压.tar
文件并从 URL 下载文件。 -
WORKDIR:设置工作目录。
textWORKDIR /app
设置了容器内的工作目录,后续的
RUN
,CMD
,ENTRYPOINT
等指令都会在这个目录下执行。 -
EXPOSE:声明容器运行时监听的端口。
textEXPOSE 80
这只是声明性的,实际发布端口需要在运行容器时使用
-p
参数。 -
ENV:设置环境变量。
textENV MY_NAME="xxx yy"
-
VOLUME:创建挂载点,用于共享数据卷。
textVOLUME ["/data"]
Dockerfile应用示例
示例:构建一个简单的 Nginx 镜像:
# 使用官方 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 镜像。