4、DockerFile
Dockerfile是一个包含用于组合镜像的命令的文本文档
Docker通过读取Dockerfile中的指令按步自动生成镜像
docker build -t 机构/镜像名<:tags> Dockerfile目录
案例1 自动部署Tomcat应用
FROM tomcat:latest
MAINTAINER mashibing.com
WORKDIR /usr/local/tomcat/webapps
ADD docker-web ./docker-web
1、镜像分层
上述DockerFile运行时,docker会将命令分成几步镜像化,这样做的好处是
- 同样的步骤不会再次构建,节省性能时间
- 中断命令后,重新构建,可从失败的地方直接开始,而不是从头开始
- 其他DockerFile运行时可以重用
分层结构如下图:
2、DockerFile 基础命令
1、FROM - 基于基准镜像
FROM centos #制作基准镜像(基于centos:lastest)
FROM scratch #不依赖任何基准镜像base image
FROM tomcat: 9.0.22-jdk8-openjdk
尽量使用官方提供的Base Image
2、切换工作目录
WORKDIR /usr/local
WORKDIR /usr/local/newdir #有目录就会打开,没有目录就会创建
尽量使用绝对路径
3、将文件添加到镜像中
ADD hello / #复制到根路径
ADD test.tar.gz / #添加根目录并解压
ADD 除了复制,还具备添加远程文件功能
4、设置环境变量
ENV JAVA_HOME /usr/local/openjdk8
RUN ${JAVA_HOME}/bin/java -jar test.jar
尽量使用环境常量,可提高程序维护性
EXPOSE - 暴露容器端口
EXPOSE 8080
docker run -p 8000:8080 tomcat
RUN & CMD & ENTRYPOINT
RUN : 在Build构建时执行命令
ENTRYPOINT : 容器启动时执行的命令
CMD : 容器启动后执行默认的命令或参数
RUN-构建时运行
RUN ["yum","install","-y","vim"] #Exec命令格式
ENTRYPOINT(入口点)用于在容器启动时执行命令
Dockerfile中只有最后一个ENTRYPOINT会被执行
ENTRYPOINT ["ps"] #推荐使用Exec格式
CMD用于设置默认执行的命令
如Dockerfile中出现多个CMD,则只有最后一个被执行
如容器启动时附加指令,则CMD被忽略
CMD ["ps" , "-ef"] #推荐使用Exec格式
完整案例
# ① 基础镜像
FROM python3:v0.1
# ② 作者信息
LABEL maintainer=smartli.smartli_it@163.com
# ③ 执行操作
RUN apt-get update
RUN apt-get install libmysqlclient-dev -y
ADD ./meiduo_mall/ /data/meiduo/meiduo_mall/
WORKDIR /data/meiduo/meiduo_mall/
RUN pip3 install -r requirements.txt
WORKDIR scripts/
RUN pip3 install fdfs_client-py-master.zip
WORKDIR ../
RUN rm -rf ~/.cache/pip/
EXPOSE 8001 8002
# ④ 入口指令
ENTRYPOINT uwsgi --ini uwsgi.ini