在Docker中,镜像是用于创建和运行容器的独立软件包。它包含了运行应用程序所需的所有文件系统、代码、运行时环境、库和依赖项。镜像可以被视为容器的静态快照或模板。
镜像的来源:
- 公共镜像仓库(Public Image Registry):Docker Hub是最常用的公共镜像仓库,其中包含了大量的官方和社区维护的镜像。你可以通过
docker pull命令从公共镜像仓库中拉取镜像到本地使用。你可以先使用docker search命令搜索你需要的镜像,然后再根据需要拉取。 - 私有镜像仓库(Private Image Registry):除了公共镜像仓库,你还可以搭建自己的私有镜像仓库来存储和管理镜像。私有镜像仓库可以在内部网络中使用,或者在云平台上搭建。
- 基于已有镜像的构建: 你可以基于已有的镜像进行构建,并在构建过程中添加、修改或删除文件、环境变量等。通过编写Dockerfile,定义构建过程和依赖关系,使用
docker build命令来生成新的镜像,本文介绍。 - 导入本地文件系统:你可以使用
docker import命令将本地文件系统中的文件导入为镜像。这种方式适用于已经存在于本地的文件系统或者已经打包好的文件系统。可以用docker export导出进行的文件系统。 - 从其他镜像导出: 使用
docker save命令可以将现有的镜像保存为tar归档文件,然后进行分享。然后可以通过docker load命令将该归档文件导入为镜像。
本文主要与镜像构建和导出与导入相关:commit,build,save,load。
其中build命令提供构建java程序的镜像的Dockerfile的例子。
镜像构建
从容器创建镜像:commit
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit 命令用于根据容器的更改创建一个新的镜像。它捕捉容器的文件系统和元数据以创建新的镜像。
以下是一些常用选项:
-a, --author:为新镜像指定作者名称。-c, --change:将 Dockerfile 指令应用于新创建的镜像。-m, --message:为新镜像添加提交消息。-p, --pause:在提交过程中暂停容器(默认为 true)。
示例用法:
docker commit -a "John Doe" -m "添加了新功能" mycontainer myrepo/myimage:tag
该命令基于容器 mycontainer 的更改创建一个新的镜像。然后,它将新镜像推送到仓库 myrepo/myimage 并使用指定的标签。
Dockerfile 构建镜像 :build
docker build [OPTIONS] PATH | URL | -
build的选项很多,以下是一些常用选项:
--add-host:添加自定义主机名到 IP 地址的映射。--build-arg:设置构建时的变量。--cache-from:指定其他镜像作为缓存来源。--file:指定 Dockerfile 的名称和路径。--label:为镜像设置元数据。--memory:设置内存限制。--network:设置构建过程中 RUN 指令的网络模式。--no-cache:在构建镜像时不使用缓存。-t, --tag:为镜像指定名称和标签。
我最常用就是-t
示例:
docker build -t myimage:tag .
该命令会在当前目录下查找 文件:Dockerfile,并基于该 Dockerfile 构建一个名为 myimage,标签为 tag 的镜像。
我最常用的就是构建springboot应用镜像。下面是整理的两个Dockerfile的内容(如果你需要选择一个修改即可):
# 使用java:8作为基础镜像
FROM java:8
# 作者信息
MAINTAINER ekko <189890049@qq.com>
# 将本地的Hystrix_Server06-0.0.1-SNAPSHOT.jar文件复制到容器的/temp/p1.jar路径下
COPY ./Hystrix_Server06-0.0.1-SNAPSHOT.jar /temp/p1.jar
# 暴露容器的端口号为8889,表示该容器将监听8889端口,最好和你jar启动后的端口一致
EXPOSE 8889
# 设置容器的时区为Asia/Shanghai
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
# 指定容器启动时的默认命令,以java -jar /temp/p1.jar启动应用程序
ENTRYPOINT java -jar /temp/p1.jar
# 拉取java:8-alpine作为基础镜像
FROM java:8-alpine
# 作者信息
MAINTAINER ekko <189890049@qq.com>
# 将本地的Hystrix_Server06-0.0.1-SNAPSHOT.jar文件复制到容器的/temp/p2.jar路径下
COPY ./Hystrix_Server06-0.0.1-SNAPSHOT.jar /temp/p2.jar
# 暴露容器的端口号为8889,表示该容器将监听8889端口
EXPOSE 8889
# 指定容器启动时的默认命令,以java -jar /temp/p2.jar启动应用程序
ENTRYPOINT java -jar /temp/p2.jar
java:8和java:8-alpine最明显的区别就是镜像大小,java:8-alpine更小,很多时候镜像内很多工具我们都用不到,更多时候,我们都希望容器内只运行我们程序。你觉得你的程序运行起来后,你要经常进入镜像内做很多特别复杂的操作,可以考虑基于java:8这个镜像,大多数情况下java:8-alpine就能满足要求。
java 8-alpine 3fd9dd82815c 6 years ago 145MB
java 8 d23bdf5b1b1b 6 years ago 643MB
需要注意的是基于java:8-alpine我们进入容器时要用这样的命令:
docker exec -it pp2 /bin/sh # 而用java:8制作的用/bin/sh 或 /bin/bash 都行,这也很好理解。
镜像的导入导出
导出:save
docker save [OPTIONS] IMAGE [IMAGE...]
将一个或多个镜像保存为tar文件
选项: -o, --output string 输出的位置,默认是当前位置。
如果不指定-o选项,则默认情况下,docker save命令会将镜像的内容流式传输到标准输出(STDOUT)。这意味着镜像内容将直接显示在终端上。 docker save命令不允许将镜像保存到终端(标准输出) ,会给出如下提示:
cowardly refusing to save to a terminal. Use the -o flag or redirect
示例:
这条命令将 ubuntu-hadoop:2.0保存为当前文件夹下的myhadoop:2.0.tar
docker save -o ./myhadoop:2.0.tar ubuntu-hadoop:2.0
导入:load
docker load [OPTIONS]
选项:
-i , --input string选项用于指定要加载的.tar文件路径,而不是从STDIN读取。你可以使用这个选项来指定要导入的镜像存储在哪个文件中。-q , --quiet选项用于禁止加载过程中的输出,即静默加载,不显示详细信息。
示例:
docker load -i my_image.tar