制作docker镜像

1. 什么是Docker镜像

Docker镜像是Docker容器的模板,是Docker容器运行的基础。

2. 制作docker镜像的方式与流程

2.1 基于Dockerfile制作镜像

2.1.1 Dockerfile的基本语法
# 指定基础镜像
FROM <image>
# 维护者信息
MAINTAINER
# 指定镜像标签
LABEL <key>=<value>
# 复制文件到镜像中
COPY <src> <dest>
# 定义一个用户
USER <user>
# 定义环境变量
ENV <key> <value>
# 添加文件到镜像中
ADD <src> <dest>
# 在容器中执行linux命令
RUN <command>
# 设置工作目录
WORKDIR <path>
# 挂载位置
VOLUME <path>
# 运行一个命令
CMD <command>
# 或者
ENTRYPOINT <command>
2.1.2 Dockerfile制作镜像的一些思考

如果我们使用dockerfile制作镜像,必须要有的就是指定一个基础镜像。当通过From指定了基础镜像后,
可以理解为你有了一个标准的linux环境,比如说,你要在镜像中包含一个java服务,那么你可以通过add命令,或者copy命令
将jar包添加到镜像中,当然可以指定文件的位置,如果文件不存在,就可以通过 RUN语法来创建一个目录: RUN mkdir -p /usr/local/
那如果你恰好还想在容器启动的时候就运行这个java服务,就可以通过 CMD命令 或者 ENTRYPOINT 命令实现。以下是一个简单的例子

FROM java:8

# 指定工作目录
WORKDIR /home/admin/holems-web-qiye

# 复制jar包
ADD core/target/java-web.jar ./

# 设置运行时暴露的端口
EXPOSE 9001

# 启动服务
CMD ["/bin/bash", "-c" ,"java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar java-web.jar --server.port=9001" ]
2.1.3 CMD 命令与 ENTRYPOINT 命令的区别
  1. CMD 可由 docker run 后的命令覆盖,同时覆盖参数
  2. ENTRYPOINT必然生效,docker run 后的命令追加到ENTRYPOINT 尾部
2.1.4 分层次构造镜像

假如说,我们有想给上面那个含有java-web服务的镜像中再加入nginx, 我们当然可以简单粗暴的将nginx安装的命令添加到镜像中

FROM java:8

# 指定工作目录
WORKDIR /home/admin/java-web

# 复制jar包
ADD core/target/java-web.jar ./

RUN apt-get update && apt-get install -y nginx
ADD nginx.conf /etc/nginx/nginx.conf

EXPOSE 8080

# 启动服务
CMD ["/bin/bash", "-c" ,"nginx & java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar java-web.jar --server.port=9001" ]

但是,看下面这种方式,我们先将java-web服务打成镜像,它的dockerfile中只有

FROM java:8

# 指定工作目录
WORKDIR /home/admin/java-web

# 复制jar包
ADD core/target/java-web.jar ./

然后我们运行

docker build -t 127.0.0.1:5000/java-web:v1.0 .

如上我们就得到了一个 127.0.0.1:5000/java-web:v1.0的镜像, 我们再以这个镜像为基础镜像,进行第二次构建

FROM 127.0.0.1:5000/java-web:v1.0

RUN apt-get update && apt-get install -y nginx
ADD nginx.conf /etc/nginx/nginx.conf

EXPOSE 8080

# 启动服务
CMD ["/bin/bash", "-c" ,"nginx & java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar java-web.jar --server.port=9001" ]

这样我们也得到了一个带有nginx和java-web的镜像。这样构造的好处是,假如下次项目变更需求,java-web不需要使用nginx代理了
但是需要将mysql也打成镜像,那我们只需要以127.0.0.1:5000/java-web:v1.0为基础镜像,再次进行镜像制作即可。

2.2 从运行中的容器制作镜像

2.2.1 导出容器
docker export <container_id> > <image_name>.tar
2.2.2 导入镜像
docker import <image_name>.tar <image_name>
2.2.3 镜像打包
docker save -o <image_name>.tar <image_name>

你可能感兴趣的:(docker,容器,运维)