一、Dockerfile
1. 简介
Dockerfile是用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本
Dockerfile从FROM命令开始,紧接着各种命令、参数等,最终会生成一个新的镜像
使用Dockerfile构建镜像的步骤:
- 编写Dockerfile文件
- 使用docker build构建镜像
- 使用docker run运行容器
2. 用法
2.1 语法规则
- 指令必须要大写,且后面必须跟参数
- 第一条指令必须是FROM,指定Base Image 基础镜像
- 指令按从上往下的顺序,依次执行
- 每条指定都会创建一个新的镜像层并提交
#表示注释
2.3 docker执行dockerfile的流程
- docekr从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commint的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有指令都执行完
2.3 常用指令
| 指令 | 解释 | |
|---|---|---|
| FROM | 指定基础镜像,即当前新镜像是基于哪个镜像的 |
格式: FROM <image> FROM <image>:<tag> FROM <image>@<digest> 描述: tag和digest可选,不指定时,则使用latest版本基础镜像,digest表示V2版本及以上版本镜像的内容可寻址标识符。 示例: FROM centos:7 |
| MAINTAINER | 指定镜像作者命名和邮箱地址 |
格式: MAINTAINER <name> 描述: name即为维护者信息,可自定义为姓名、邮箱地址等 示例: MAINTAINER andya MAINTAINER andya@163.com MAINTAINER andya <andya@163.com> |
| RUN | 指定构建过程中要运行的命令 | |
| ENV | 用来在构建镜像过程中设置环境变量 | |
| WORKDIR | 指定默认的工作目录,即进入容器后默认进入的目录,一个落脚点 | |
| VOLUME | 创建挂载点,也称容器数据卷,用于数据共享和持久化 | |
| CMD |
指定容器启动时要运行的命令,与RUN不同的是,这些命令不是在镜像构建过程中执行的 Dockerfile中可以又多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换 |
|
| ENTRYPOINT |
指定一个容器启动时要运行的命令 ENTRYPOINT和CMD一样,都是指定容器启动程序和参数 |
|
| COPY |
类似ADD 拷贝文件和目录到镜像中, 将从构建上下文目录中<源文件>的文件/目录复制到新的一层镜像内的<目标路径>位置 COPY src dest 或COPY [“src”,“dest”] |
|
| ADD | 将宿主机目录下的文件拷贝文件到镜像中,且ADD命令会自动处理URL和自动解压tar压缩包 | |
| EXPOSE | 指定对外暴露的端口 | |
| ONBUILD | 当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发 |
构建新镜像语法
语法:docker build -f Dockerfile文件的路径 -t 镜像名:tag 命令执行的上下文
3. 案例
3.1 自定义centos镜像
# 1.编写Dockerfile文件
vi Dockerfile2
FROM centos
MAINTAINER tangxiaoyang@itany.com
ENV MYPATH /usr/local/centos
RUN mkdir -p $MYPATH
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install wget
# 创建挂载点,无法指定宿主机上对应的目录,是自动生成的
VOLUME ["/data1","/data2"]
CMD ["/bin/bash"]
# 2.使用docker build构建镜像
docker build -f Dockerfile2 -t itany/centos:v1 .
# 3.使用docker run运行容器
docker run -it b25b1dad795c
# 查看镜像的变更历史
docker history b25b1dad795c
# 验证挂载点:
/var/lib/docker/volumes/0b001b4cc8db1ebbbb4c537c17a5c44adb700fb0e1b941bc82cc717c4ae196f6/_data
/var/lib/docker/volumes/f020f5a5664bf68312be9f49a640f27ecfb49990b231aaf3d0eb7cb723fa0ddd/_data
3.2 自定义tomcat镜像
# 准备工作
# 1.编写Dockerfile文件
vi Dockerfile
FROM centos
MAINTAINER tangxiaoyang@itany.com
# 把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
# 拷贝文件,文件必须与Dockerfile在同一目录下
COPY teacher.txt /usr/local
#把java与tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local
ADD apache-tomcat-8.5.30.tar.gz /usr/local
# 配置java和tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH .:$JAVA_HOME/lib
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.30
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
##设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#WORKDIR $CATALINA_HOME
RUN yum -y install vim
#容器运行时监听的端口
EXPOSE 8080
CMD ["catalina.sh", "run"]
# 2.使用docker build构建镜像
docker build -t itany/tomcat:1.0 .
# 3.使用docker run运行容器
docker run \
--name mytomcat \
-p 8080:8080 \
-v /my/tomcat/webapps/spring-web.war:/usr/local/apache-tomcat-8.5.30/webapps/spring-web.war \
-d itany/tomcat:1.0
3.3 CMD和ENTRYPOINT的区别
-
CMD
在Dockerfile中可以有多个CMD指令,但只有最后一条指令生效,所以一般只有一条CMD指令
CMD指令在被docker run之后的参数覆盖
vi aaa FROM centos CMD ["/bin/ls"] CMD ["/bin/bash"] docker build -f aaa -t itany/aaa . docker run -it itany/aaa docker run -it itany/aaa /bin/pwd -
ENTRYPOINT
docker run之后的参数会被作为ENTRYPOINT指令的参数,组合形成新的命令
vi bbb FROM centos ENTRYPOINT ["/bin/ls","/usr/local"] docker build -f bbb -t itany/bbb . docker run -it itany/bbb docker run -it itany/bbb -l # ls /usr/local -l
案例:
FROM cenos
RUN yum install -y curl
CMD [ "curl", "-s", "http://ip.cn" ]
命令:docker build -f Dockerfile -t myip .

FROM cenos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
命令:docker build -f Dockerfile -t myip .

3.4 ONBUILD应用
