DockerFile
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
TIPS:https://docs.docker.com/engine/reference/builder/
DockerFile 构建
内容基础
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
#
表示注释- 每条指令都会创建一个新的镜像层并对镜像进行提交
构建流程
- 编写
Dockerfile
文件 docker build
命令构建镜像docker run
根据镜像运行容器实例
常用保留字指令
常用指令 | 说明 | 举例 |
---|---|---|
FROM | 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板 | FROM : |
MAINTAINER | 镜像维护者的姓名和邮箱地址 | MAINTAINER xxxxxx@xxx.com |
WORKDIR | 指定在创建容器后,默认目录 | |
USER | 指定该镜像以什么样的用户去执行,默认root | |
ENV | 为镜像创建出来的容器声明环境变量,还可以被dockerfile后面的指令使用 | ENV <key> <value> ENV <key=value> |
COPY | 复制文件或目录添加到新镜像中 可以有多个,但必须是上下文根目录的相对路径,可以使用通配符 可以是文件或目录( / 结尾),但必须是目标镜像中的绝对路径或者相对于WORKDIR的相对路径 | COPY <src> <dest> |
ADD | 和COPY 一致可以指向网络地址URL 可以指向本地压缩归档文件,复制到容器中会被自动解压提取 | ADD <src> <dest> |
VOLUME | 容器数据卷,用于数据保存和持久化工作 | |
EXPOSE | 容器对外暴露出的端口 | EXPOSE 8080 |
RUN | 【构建时】在前一条命令创建的镜像基础上创建一个容器,并在容器中运行命令,命令结束后commit 容器为新镜像,该镜像被Dockerfile 中的下一条指令使用 | RUN <command> (shell格式) RUN [“executable”,“param1”,“param2”] (exec格式,推荐) |
CMD | 【运行时】提供容器运行时的默认值,默认值可以是一条指令,可以是一些参数 一个Dockerfile中可以有多条CMD指令,但只有最后一条有效,会被 docker run 之后的参数命令覆盖 | CMD <command> (shell格式) CMD [“executable”,“param1”,“param2”] (exec格式,推荐) CMD [“param1”,“param2”] (为 ENTRYPOINT 指令提供参数) |
ENTRYPOINT | 【运行时】和CMD 一致,提供容器运行时的默认值一个Dockerfile中可以有多条ENTRYPOINT指令,但只有最后一条有效,不会被 docker run 之后的参数命令覆盖 | ENTRYPOINT <command> (shell格式) ENTRYPOINT [“executable”,“param1”,“param2”] (exec格式,推荐) |
测试
准备一个SpringBoot的简易程序jar包,进行Dockerfile构建镜像及运行容器测试
制作镜像:docker build -t <image>:<tag> dir
详细说明可参照下方链接官方文档:https://docs.docker.com/engine/reference/commandline/build/#options
FROM openjdk:11
MAINTAINER abc <abc@126.com>
WORKDIR /data/server
RUN mkdir -p /data/server
ADD ./jar/demo-0.0.1-SNAPSHOT.jar /data/server/demo.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "-Duser.timezone=GMT+08", "/data/server/demo.jar"]
[root@localhost jiangyanfei]# ls -ll
总用量 4
-rw-r--r--. 1 root root 259 6月 1 11:35 Dockerfile
drwxr-xr-x. 2 root root 37 6月 1 11:47 jar
#################### 制作镜像 ############################
[root@localhost jiangyanfei]# docker build -t demo:1.0 .
Sending build context to Docker daemon 17.61MB
Step 1/7 : FROM openjdk:11
---> 5505a9a39df1
Step 2/7 : MAINTAINER jiangyf5 <jiangyf5@lenovo.com>
---> Running in 7acb7186e9cf
Removing intermediate container 7acb7186e9cf
---> 8e5c4e538ffa
Step 3/7 : WORKDIR /data/server
---> Running in 741dedb2a302
Removing intermediate container 741dedb2a302
---> 9febb9cdffcf
Step 4/7 : RUN mkdir -p /data/server
---> Running in ae72ec8168e0
Removing intermediate container ae72ec8168e0
---> b987ca3b943c
Step 5/7 : ADD ./jar/demo-0.0.1-SNAPSHOT.jar /data/server/demo.jar
---> 9327045e7723
Step 6/7 : EXPOSE 8080
---> Running in bd1fae590795
Removing intermediate container bd1fae590795
---> f0689a6cb772
Step 7/7 : ENTRYPOINT ["java", "-jar", "-Duser.timezone=GMT+08", "/data/server/demo.jar"]
---> Running in e2d5e3bb083c
Removing intermediate container e2d5e3bb083c
---> 740191a10d8b
Successfully built 740191a10d8b
Successfully tagged demo:1.0
#################### 查看制作镜像 ############################
[root@localhost jiangyanfei]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo 1.5 ebd1f3d97dd4 6 seconds ago 677MB
demo 1.0 740191a10d8b 4 seconds ago 677MB
#################### 启动容器 ############################
[root@localhost jiangyanfei]# docker run -it -d -p 7777:8080 ebd1f3d97dd4
1df16198d19e8a36c465aa6b632a35c8fc87906cb11eeca9b4cf81a99e8de100
[root@localhost jiangyanfei]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1df16198d19e ebd1f3d97dd4 "java -jar -Duser.ti…" 2 seconds ago Up 1 second 0.0.0.0:7777->8080/tcp, :::7777->8080/tcp agitated_franklin
#################### 访问容器 ############################
[root@localhost jiangyanfei]# curl 192.168.2.99:7777/test
{"name":"liming","age":18}
[root@localhost jiangyanfei]# docker exec -it 1df16198d19e bash
root@1df16198d19e:/data/server# ls
demo.jar
虚悬镜像
在构建和运行过程中,仓库名、标签名均为none
的镜像,此类镜像称为虚悬镜像
一般来说,虚悬镜像失去了存在和使用价值,因此可以直接删除处理
[root@localhost jiangyanfei]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> f0689a6cb772 4 hours ago 677MB
<none> <none> 9327045e7723 4 hours ago 677MB
<none> <none> 9febb9cdffcf 4 hours ago 659MB
常用操作
- 查看虚悬镜像:
docker images ls -f dangling=true
- 删除虚悬镜像:
docker image prune