一、概念
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
(编写Dockerfile文件- → docker build命令构建镜像 → docker run依镜像运行容器实例)
二、DockerFile构建过程
2.1 Dockerfile内容基础知识
1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2:指令按照从上到下,顺序执行
3:#表示注释
4:每条指令都会创建一个新的镜像层并对镜像进行提交
2.2 Docker执行Dockerfile的大致流程
1 docker从基础镜像运行一个容器
2 执行一条指令并对容器作出修改
3 执行类似docker commit的操作提交一个新的镜像层
4 docker再基于刚提交的镜像运行一个新容器
5 执行dockerfile中的下一条指令直到所有指令都执行完成
三、DockerFile常用保留字指令
1、FROM: 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
2、MAINTAINER: 镜像维护者的姓名和邮箱地址
3、RUN:容器构建时需要运行的命令(RUN是在 docker build时运行)
【例】RUN yum -y install vim
4、EXPOSE:当前容器对外暴露出的端口
5、WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
6、USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root
7、ENV:用来在构建镜像过程中设置环境变量
8、ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
9、COPY:类似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
10、VOLUME:容器数据卷,用于数据保存和持久化工作
11、CMD:指定容器启动后的要干的事情。
(Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换)
12、ENTRYPOINT:类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,
而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
(如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。)
【例】
ENTRYPOINT ["echo","hello","i am"]
CMD ["docker"]
使用docker run -it image 输出“hello i am docker”
使用docker run -it image world 输出“hello i am world”
四、SpringBoot 项目使用DockerFile
4.1 IDEA工具里面搞定微服务jar包
docker_boot-0.0.1-SNAPSHOT.jar
4.2 编写 Dockerfile
mkdir /home/docker/ 在home目录创建文件夹docker
vim Dockerfile 创建文件Dockerfile
内容如下:
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER dzg
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为dzg_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar dzg_docker.jar
# 运行jar包
RUN bash -c 'touch /dzg_docker.jar'
ENTRYPOINT ["java","-jar","/dzg_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 6001
4.3 构建镜像
把 docker_boot-0.0.1-SNAPSHOT.jar 上传到 /home/docker/ 目录下面,
建议和Dockerfile文件放在一起,不在一起也没有关系,构建的时候,
指定刚刚的Dockerfile文件构建即可,本次放在一次。
构建命令: docker build -t 镜像 . (最后有一个点)
docker build -t dzg_docker:1.6 .
4.4 查看并运行镜像
docker images
docker run -d -p 6001:6001 dzg_docker:1.6
docker ps
4.5 访问测试
http://192.168.215.140:6001/order/docker