Dockerfile镜像描述文件
- Dockerfile是一个包含用于组合镜像的命令的文本文档
- Docker通过读取Dockerfile中的指令按步自动生成镜像
- docker build -t 机构/镜像名<:tags> Dockerfile目录
Dockerfile自动部署Tomcat应用
制作Dockerfile
# 基础镜像
FROM tomcat:latest
# 维护作者
MAINTAINER stepin.cn
# 类似cd /usr/local/tomcat/webapps的效果,不存在则自动创建
WORKDIR /usr/local/tomcat/webapps
# 复制docker-web到./mywebapp
ADD docker-web ./mywebapp
生成docker-web内容
mkdir docker-web
tee docker-web/index.html <<-'EOF'
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<h1>Docker Web应用首页</h1>
</html>
EOF
构建镜像
docker build -t stepin.cn/mywebapp:1.0 .
启动容器
# 启动容器,挂后台运行+端口映射
docker run -d -p 8001:8080 stepin.cn/mywebapp:1.0
# 验证内容
curl 127.0.0.1:8001/mywebapp/index.html
镜像分层(layer)概念
每执行一步都生成了一个临时容器,并分配一个id,作为快照/存档
- 按层进行堆叠
- 系统快照(docker临时容器)
临时容器在构建过程中是可以复用的(Using cache)
Dockerfile基础指令
FROM - 基于基准镜像
# 制作基准镜像(基于centos:lastest)
FROM centos
# 不依赖任何基准镜像base image
FROM scratch
FROM tomcat: 9.0.22-jdk8-openjdk
尽量使用官方提供的Base Image
LABEL & MAINTAINER - 说明信息
MAINTAINER stepin.cn
LABEL version = "1.0"
LABEL description = "myapp"
WORKDIR - 设置工作目录
WORKDIR /usr/local
# 自动创建
WORKDIR /usr/local/newdir
尽量使用绝对路径
ADD & COPY - 复制文件
# 复制到根路径
ADD hello /
# 添加根目录并解压
ADD test.tar.gz /
# 添加远程文件
ADD http://stepin.cn/test.tar.gz /
ADD 除了复制,还具备添加远程文件功能(curl/wget)
ENV - 设置环境常量
ENV JAVA_HOME /usr/local/openjdk8
RUN ${JAVA_HOME}/bin/java -jar test.jar
尽量使用环境常量,可提高程序维护性
EXPOSE - 暴露容器端口
# 将容器内部端口暴露给物理机
EXPOSE 8080
docker run -p 8000:8080 tomcat
Dockerfile执行指令
不同的执行时机
创建镜像-docker build
RUN 执行,在构建镜像时执行
创建容器-docker run
CMD|ENTRYPOINT,在容器创建时执行
Build-构建时运行
# Shell 命令格式
RUN yum install -y vim
# Exec命令格式
RUN ["yum","install","-y","vim"]
Shell运行方式-创建子进程
- 使用Shell执行时,当前shell是父进程,生成一个子shell进程
- 在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell
Exec运行方式-不创建子进程
- 使用Exec方式,会用Exec进程替换当前进程,并且保持PID不变
- 执行完毕,直接退出,并不会退回之前的进程环境
大多数情况下推荐使用Exec方式
Run-启动容器时运行
ENTRYPOINT启动命令
- ENTRYPOINT(入口点)用于在容器启动时执行命令
- Dockerfile中只有最后一个ENTRYPOINT会被执行
- ENTRYPOINT [“ps”] #推荐使用Exec格式
CMD默认命令
- CMD用于设置默认执行的命令
- 如Dockerfile中出现多个CMD,则只有最后一个被执行
- 如容器启动时附加指令,则CMD被忽略
- CMD [“ps” , “-ef”] #推荐使用Exec格式
ENTRYPOINT一定会被运行,CMD不一定被执行
实例
Dockerfile
FROM centos
# 镜像构建时输出
RUN ["echo", "image building!!!"]
# 镜像运行时输出
CMD ["echo", "container starting..."]
Build
docker build stepin.cn/docker_run .
Run
docker run stepin.cn/docker_run
执行默认CMD命令
docker run stepin.cn/docker_run ls
覆盖CMD命令,执行ls
扩展
ENTRYPOINT组合CMD,ENTRYPOINT固定执行的命令,CMD可以灵活变化,实现可自由指定的容器启动参数
FROM centos
RUN ["echo", "image building!!!"]
ENTRYPOINT ["ps"]
CMD ["-ef"]
版权说明
本文章内容为马士兵教育《架构师必备技能docker入门到专精》课程的学习笔记