Docker镜像是Docker容器的模板,是Docker容器运行的基础。
# 指定基础镜像
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>
如果我们使用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" ]
假如说,我们有想给上面那个含有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为基础镜像,再次进行镜像制作即可。
docker export <container_id> > <image_name>.tar
docker import <image_name>.tar <image_name>
docker save -o <image_name>.tar <image_name>