1,什么是Dockerfile
Dockerfile 相当于是一个脚本,不过是可以在这个脚本文件里使用一些特定的命令(关键字)完成一些自动化任务的脚本。
如果不用Dockerfile创建一个自定义的镜像,大概步骤是:
* 找一个基础镜像
* docker yun 生成一个容器container
* 进入container
* 做各种操作和配置
* docker tag, docker push 提交成一个新的docker container
如果把以上步骤都写进一个文件里,然后让docker自己去实现就显得方便很多,所以就有了dockerfile.
2,准则和命令
* Dockerfile"Dockerfile"这个文件名是固定的,大小写敏感,首字母大写
* 尽量把Dockerfile放在一个空目录中,以防干扰
* 每个container尽量只实现一个功能,不适合集成太多
* Dockerfile里的命令越少越好
常用命令
* **FROM** 指定基础镜像文件
* **MAINTAINER** 维护者的信息
* **RUN** 执行命令
* **EXPOSE** 对外暴露的端口
* **ADD** 复制文件到容器中,若是压缩文件会自动解压
* **COPY** 复制文件到容器中,若是压缩文件不会自动解压
* **WORKDIR** 改变工作目录
* **ENTRYPOINT** 运行容器时执行的命令(default 自启动)
3,举个栗子🌰
3.1 准备文件
在/Users/forrestzhang/Documents/data/路径下创建一个空文件夹base,把项目需要用到的其他文件都复制到此目录下
3.2 编写Dcokerfile
在base文件夹里新建一个Dockerfile文件,编写内容如下
Dockerfile
#选择基础镜像
FROM ubuntu:18.04
#author作者
MAINTAINER Forrest
RUN apt-get update -y
RUN apt-get install nginx -y --allow-unauthenticated
RUN apt-get install python3-pip -y
#把工程文件上传容器
ADD front_end_pc.tar.gz /data/
ADD forrest_devops.tar.gz /data/
ADD forrest_ci_cd.tar.gz /data/
#切换到/Users/forrestzhang/Download/LearnDocker/工程目录,并安装依赖
WORKDIR /Users/forrestzhang/Download/LearnDocker/
RUN pip3 install -r requirements.txt
#复制配置文件到容器中
COPY 8080.conf /etc/nginx/conf.d/
COPY 8081.conf /etc/nginx/conf.d/
COPY 8000.conf /etc/nginx/conf.d/
#设置环境变量;作用:指定系统语言为UTF-8;如果不设置,uwsgi运行无法处理中文语言
ENV LC_ALL="zh_CN.utf8"
#容器开放端口为8080和8081
EXPOSE 8080 8081
#导入容器启动脚本
COPY command.sh /data
#切换容器目录
WORKDIR /data
#指定容器运行的启动指令
ENTRYPOINT ["/bin/bash","command.sh"]
因为ENTRYPOINT命令只能执行一条指令,所以我们可以把想要执行的多条指令写进一个脚本文件里一起执行
command.sh
cd /Users/forrestzhang/Download/LearnDocker/
uwsgi --ini uwsgi.ini
nginx -g "daemon off;"
3.3 使用Dockerfile生成镜像
当所有文件都准备好了,并且写好Dockerfile了,我们就可以使用它生成一个镜像
docker image build -t FirstDockerImage ./
3.4 运行镜像
docker container run -d --name FirstDockerImage --network=host FirstDockerImage:latest
3.5 使用浏览器访问
4,Dockerfile 参考模板
FROM base_image:tag #引用基础镜像 必要
ARG arg_key[=default_value] #声明变量
ENV env_key=value2 #声明环境变量
构建几乎不变的部分,例如整体的目录结构,build时依赖的文件和工具包等
COPY src dst
RUN command1 && command2 ...
WORKDIR /path/to/work/dir # 设置工作目录
构建较少变动的部分,例如应用的依赖的文件、依赖的包等
COPY src dst
RUN command3 && command4 ...
构建经常变动的部分,例如应用的编译生成
COPY src dst
RUN command5 && command6 ...
容器入口 必要
ENTRYPOINT ["/entry.app"] # 指定容器启动时默认执行的命令
CMD ["--options"] # 指定容器启动时默认命令的默认参数
CMD与ENTRYPOINT
又是一对很类似的指令,使用时需要注意:
CMD 单独使用时,用来指定容器启动时默认执行的命令
ENTRYPOINT 单独使用时,可以完全取代 CMD
ENTRYPOINT 和 CMD 一起使用时,CMD 变成 ENTRYPOINT 的默认参数
推荐使用 ENTRYPOINT/CMD 的 exec 书写形式:即ENTRYPOINT ["entry.app", "arg"],因为 shell 书写形式(ENTRYPOINT entry.app arg)会额外启动 shell 进程;