Docker入门到专精04-Dockerfile构建镜像

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入门到专精》课程的学习笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值