Dockerfile命令和实践
来源:互联网 发布:曙光虚拟化软件 编辑:程序博客网 时间:2024/05/29 17:46
制作docker镜像有两种方式:build Dockerfile和Images->container->images
1, 通过先下载镜像,基于这个镜像启动容器,在容器中添加自己的部分再构造成镜像的方式我们上篇已经介绍过了,操作还是比较复杂的,而且不方便传播。
2, 通过命令docker build的方式可以预先准备一个dockerfile的脚本,脚本里可以干很多事情,更灵活,文件方式也更方便共享和传播。
本文主要学习下Dockerfile的规范,还是先罗列语法和基本命令,再应用于实战。
准则:
1, 镜像要尽可能的小。
2, 一个镜像里只运行一个进程(指定一个CMD或Entrypoint)
3, 第一条命令必须是FROM
基础命令:
FROM:指定基础镜像文件
FROM <image>
FROM <image>:<version>
MAINTAINER:维护者信息
MAINTAINER <String> //String随便发挥
ADD、COPY:这俩放在一起因为都是复制命令,用法基本一样
COPY <src> <dest>
ADD <src> <dest>
使用时尽量用COPY,因为ADD有些越界,除开复制文件还可以复制URL、自动解压缩等。
RUN:build的过程中执行的命令,镜像创建完之后run命令会结束
RUN <command>
RUN [“executable”, “param1”, “param2”]
CMD、Entrypoint:容器运行起来之后执行的命令,与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提供默认参数。
从字面意思来看区别:
CMD:The main purpose ofa CMD is to provide defaults for an executing container
ENTRYPOINT:An ENTRYPOINT allowsyou to configure a container that will run as an executable
可以看出前者倾向于构造一个带有默认启动程序的容器,而后者倾向于构造一个可执行命令。
USER:RUN和ENTRYPOINT将使用哪个用户运行
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
验证:
- Dockerfile命令和实践
- Dockerfile实践
- Dockerfile 命令
- Dockerfile 最佳实践
- Dockerfile最佳实践(一)
- Dockerfile最佳实践(二)
- Dockerfile 最佳实践
- Dockerfile 最佳实践
- Dockerfile 最佳实践
- 【转】Dockerfile 最佳实践
- Dockerfile 最佳实践
- Dockerfile最佳实践总结
- Dockerfile 的编写实践
- Docker的基本命令和Dockerfile的指令
- Dockerfile命令介绍
- Dockerfile命令大全
- DockerFile命令大全
- Docker commands和Dockerfile
- 2017.09.13工作日记
- NYOJ 单词拼接
- java基本数据类型
- android App一段时间无操作返回上一界面或其他界面
- 正则表达式为什么如此重要?
- Dockerfile命令和实践
- 几种框架的Ajax实现方法
- ubuntu16.04下面关闭y460的触摸板
- html元素分类
- S版小学语文
- 剑指Offer--7.斐波那契数列
- Linux跨文本命令执行
- 【C#】每日知识点-正则表达式
- Java OOP