Dockerfile构建镜像
Dockerfile 介绍
前面一直都是从Docker仓库中下载镜像然后使用。我们项目中可以通过Dockerfile构建自己的镜像。
Dockerfile是由一系列命令和参数构成的文本文件,Docker可以读取Dockerfile文件并根据Dockerfile文件的描述来构建镜像。Dockerfile文件内容一般分为4部分
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行的指令
Dockerfile构建镜像参考官网文档:https://docs.docker.com/build/building/packaging/
Dockerfile详细语法参考官网文档: https://docs.docker.com/engine/reference/builder
命令 |
作用 |
备注 |
FROM <image> |
指定父镜像 |
指定Dockerfile基于哪个Image镜像构建 |
RUN <command> |
执行命令 |
执行指定命令 默认是/bin/sh 格式: RUN command 或者 RUN ["command" , "param1","param2"] |
WORKDIR <directory> |
工作目录 |
指定容器内部的工作目录 如果没有创建则自动创建 / 表示绝对路径 没有/开头就使用上一条workdir的相对路径 |
CMD command param1 param2 |
容器启动命令 |
启动容器时候的默认命令 |
ADD <src>... <dest> |
添加文件 |
Build的时候将宿主机的文件复制到Image镜像中,如果是一个压缩文件会在复制后自动解压 |
COPY <src>... <dest> |
复制文件 |
和ADD相似,但是如果有压缩文件不会自动解压 |
ENV <key>=<value> ... |
环境变量 |
指定环境变量 |
EXPOSE <port> |
暴露端口 |
定义容器运行时监听的端口,给容器使用者看的 |
USER |
指定执行用户 |
指定RUN CMD ENTRYPONT执行命令的用户 |
MAINTAINER <name> |
作者信息 |
指定这个Dockerfile的作者信息,过时了 |
LABEL <key>=<value> |
标签 |
指定Image镜像的元信息 |
ENTRYPOINT command param1 param2 |
入口 |
设置镜像中应用的启动命令,在容器运行时调用 |
命令说明:
# 通过Dockerfile构建镜像 docker bulid -t 镜像名:版本 Dockerfile文件路径
Dockerfile 案例1
基于centos7镜像安装vim
且默认登录后的工作目录为/opt
。
- 编写Dockerfile文件,内容如下:
FROM centos:7 MAINTAINER cxypa<cxypa@163.com> RUN yum install -y vim WORKDIR /opt CMD /bin/bash
- 通过Dockerfile构建镜像
命令说明:
docker bulid -t 镜像名:版本 -f Dockerfile文件路径
操作示例:
[root@cxypa ~]# docker build -t centos7/vim . Sending build context to Docker daemon 57.34kB Step 1/5 : FROM centos:7 7: Pulling from library/centos 2d473b07cdd5: Pull complete Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 Status: Downloaded newer image for centos:7 ---> eeb6ee3f44bd Step 2/5 : MAINTAINER cxypa<cxypa@163.com> ---> Running in cff5b4d726e3 Removing intermediate container cff5b4d726e3 ---> fb5627bcac50 Step 3/5 : RUN yum install -y vim ---> Running in af69b2528db3 Loaded plugins: fastestmirror, ovl Determining fastest mirrors * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com # 省略其他 Complete! Removing intermediate container af69b2528db3 ---> fa5b474a1b67 Step 4/5 : WORKDIR /opt ---> Running in 7e991e659673 Removing intermediate container 7e991e659673 ---> 5bbfc8dfc670 Step 5/5 : CMD /bin/bash ---> Running in 78ae759a110c Removing intermediate container 78ae759a110c ---> 6e15814c13f9 Successfully built 6e15814c13f9 Successfully tagged centos7/vim:latest [root@cxypa ~]#
- 查看构建的镜像
操作示例:
REPOSITORY TAG IMAGE ID CREATED SIZE centos7/vim latest fb6c28325e4f 55 seconds ago 453MB centos 7 eeb6ee3f44bd 15 months ago 204MB
- 使用自己构建的镜像创建容器并运行测试
操作示例:
[root@localhost ~]# docker run -it --name ccv centos7/vim /bin/bash # 使用自己的镜像创建容器,进入容器时自动进入到了/opt目录 [root@ee33f16a4a33 opt]#
Dockerfile 案例2
基于java8构建Java项目
操作步骤:
- 编写HelloWorld程序
- 编写Dockerfile文件
- 基于java:8-alpine作为基础镜像
- 将HelloWorld程序复制到镜像中
- 编译HelloWorld程序
- 运行HelloWorld程序
- 使用docker build命令构建镜像
具体操作:
- 编写HelloWorld程序
[root@localhost ~]# vim HelloWorld.java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World Dockerfile!!!"); } }
- 编写Dockerfile文件
- 基于cytomine/java8作为基础镜像
- 将HelloWorld程序复制到镜像中
- 编译HelloWorld程序
- 运行HelloWorld程序
- 使用docker build命令构建镜像
[root@localhost ~]# vim Dockerfile FROM cytomine/java8 COPY HelloWorld.java /tmp/HelloWorld.java WORKDIR /tmp CMD /bin/bash RUN javac HelloWorld.java RUN java HelloWorld [root@localhost ~]# docker build -t myjava8 . Sending build context to Docker daemon 22.53kB Step 1/6 : FROM cytomine/java8 ---> ac6f8a23f18f Step 2/6 : COPY HelloWorld.java /tmp/HelloWorld.java ---> af3e0f7da7c6 Step 3/6 : WORKDIR /tmp ---> Running in 3fead0298672 Removing intermediate container 3fead0298672 ---> 0a6bd5e186df Step 4/6 : CMD /bin/bash ---> Running in 9270903959cf Removing intermediate container 9270903959cf ---> 608be7ce9c2b Step 5/6 : RUN javac HelloWorld.java ---> Running in 00c1a01cfcb5 Removing intermediate container 00c1a01cfcb5 ---> 23ac4b671ac2 Step 6/6 : RUN java HelloWorld ---> Running in 1d880355cf5f Hello World Dockerfile!!! # 输出了程序的运行结果 Removing intermediate container 1d880355cf5f ---> 76a8a02afef9 Successfully built 76a8a02afef9 Successfully tagged myjava8:latest