Dockerfile命令和实践

来源:互联网 发布:曙光虚拟化软件 编辑:程序博客网 时间:2024/05/29 17:46

制作docker镜像有两种方式:build DockerfileImages->container->images

1, 通过先下载镜像,基于这个镜像启动容器,在容器中添加自己的部分再构造成镜像的方式我们上篇已经介绍过了,操作还是比较复杂的,而且不方便传播。

2, 通过命令docker build的方式可以预先准备一个dockerfile的脚本,脚本里可以干很多事情,更灵活,文件方式也更方便共享和传播。

 

本文主要学习下Dockerfile的规范,还是先罗列语法和基本命令,再应用于实战。

 

准则:

1, 镜像要尽可能的小。

2, 一个镜像里只运行一个进程(指定一个CMDEntrypoint

3, 第一条命令必须是FROM

 

 

 

基础命令:

FROM指定基础镜像文件

FROM <image>

FROM <image>:<version>

 

MAINTAINER维护者信息

MAINTAINER <String> //String随便发挥

 

ADDCOPY:这俩放在一起因为都是复制命令,用法基本一样

COPY <src> <dest>

ADD <src> <dest>

使用时尽量用COPY,因为ADD有些越界,除开复制文件还可以复制URL、自动解压缩等。

 

RUNbuild的过程中执行的命令,镜像创建完之后run命令会结束

RUN <command>

RUN [“executable”, “param1”, “param2”]

 

CMDEntrypoint容器运行起来之后执行的命令,与RUN的执行周期不同

这俩放在一起,是因为功能和用法上基本一致:

CMD ["executable","param1","param2"] 

CMD command param1 param2

ENTRYPOINT ["executable", "param1", "param2"]

ENTRYPOINT command param1 param2

这俩都是在Dockerfile中只能有一个,如果存在多个CMD只有最后一个有效,如果存在多个ENTRYPOINT也是只有最后一个有效。

这俩的区别有两点:第一docker run /bin/bash(指定命令)时会覆盖掉CMD的命令使其失效,但不会覆盖ENTRYPOINT;第二CMD多一个CMD ["param1","param2"] 命令为ENTRYPOINT提供默认参数。

从字面意思来看区别:

CMDThe main purpose ofa CMD is to provide defaults for an executing container

ENTRYPOINTAn ENTRYPOINT allowsyou to configure a container that will run as an executable

可以看出前者倾向于构造一个带有默认启动程序的容器,而后者倾向于构造一个可执行命令。

 

USERRUNENTRYPOINT将使用哪个用户运行

USER username

 

VOLUME因为容器的重启会清空自己的存储,像mysql之类的需要保留存储的场景就需要有重启后也要保留的功能。Volume从宿主机上挂在一个目录到容器中。

VOLUME <> <>

 

ARG指定定义一个变量,变量的值从宿主机dockerbuild命令和其参数--build-arg后键值对中获得

ARG <name>[=<default value>]

配合docker命令:docker build –build-arg name=value

 

EXPOSE指定容器的监听端口,个人的理解此处只是说明作用,真正是否监听这个端口取决于宿主机的docker run时的-p

EXPOSE <port> [<port>...]

 

ENV键值对形式设置环境变量

ENV <key> <value>

ENV <key>=<value>

 

WORKDIR容器启动后做目录的跳转,也就是cd,为后续CMD做准备

WORKDIR <dir>

 

 

 

实战:

我们上一篇用image->container->image的的方式构造了一个eureka注册中心的镜像,我们这一次想通过docker build来制作,而且容器启动后要求容器内自动启动jar包。

 

#指定镜像FROM docker.io/jlwestbps/centos7.1-jdk1.8.0_73#作者信息MAINTAINER Yejingtao <250234464@qq.com>#构建时日志打印RUN echo "Copy eureka.jar into container"#将eureka jar包复制到镜像中COPY ./eureka-register-0.0.1-SNAPSHOT.jar /usr/lib/#构建时日志打印RUN echo "auto start eureka-server in container"#容器启动后执行命令,启动eurekaCMD ["java","-jar","/usr/lib/eureka-register-0.0.1-SNAPSHOT.jar"]#容器需要监听端口EXPOSE 1111EXPOSE 1112


构建镜像

命令:docker build -t eureka:v1 .

 

启动容器

命令

docker run -p 1111:1111 -e spring.profiles.active=peer1 --name=eureka1 eureka:v1

docker run -p 1112:1112 -e spring.profiles.active=peer2 --name=eureka2 eureka:v1

验证: