9.dockerfile 定制镜像基础

一.Dockerfile 定制镜像

说明:用来构建docker 镜像的文件,命令参数脚本。
构建说明:
1.编写dockerfile文件
2.docker build 构建成一个镜像
3.docker run 运行镜像生成容器
4.docker push 发布镜像到仓库

创建镜像三种方法
Docker镜像创建方法有三种,分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。

Dockerfile是由一组指令组成的文件,其中每条指令对应Linux中的一条命令,Docker程序将读取Dockerfile中的指令生成指定镜像。

Dockerfile结构大致分为四个部分:基础镜像信息维护者信息镜像操作指令容器启动时执行指令。Dockerfile每行支持一条指令,每条指令可带多个参数,支持使用以#号开头的注释。

以下通过Dockerfile来创建httpd镜像
官方命名:Dockerfile ,此命名后,就不需要-f指定了
1.创建镜像工作目录并进入 ,创建Dockerfile文件

mkdir apache

cd apache/

vim Dockerfile

2.编写dockerfile文件
基础知识:
1.dockerFile每一个保留关键字必须是全大写,
2.指令是从上到下顺序执行的
3.#代表注释
4.每一个指令代表一个镜像层
在这里插入图片描述
在这里插入图片描述

2.1 FROM
说明:指定所创建镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像。格式:

   FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>

任何Dockerfile中的第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创造多个镜像,可以使用多个FROM指令,每个镜像一个。

2.2 MAINTAINER
说明:指定维护者信息 格式:

MAINTAINER <name>

该信息会写入生成镜像的Author属性域中。

2.3 RUN
说明:运行指定命令 格式:

RUN <command>
RUN ["executable","param1","param2"]

(RUN [“可执行文本”,“参数1”,“参数2”]) 指令会被解析为Json数组,因此必须用双引号。
实例:

RUN echo hello
RUN ["/bin/bash","-c","echo hello"]

RUN默认会在shell终端中运行命令,即/bin/sh -c
RUN ["","",""] 使用exec执行,不会启动shell环境 每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。
当命令较长时,可以使用\来换行。

2.4 CMD
说明:指定启动容器时默认执行的命令。格式:

    CMD ["executable","param1","param2"]使用exec执行,推荐使用的方式
  CMD command param1 param2 在/bin/sh中执行,提供给需要交互的应用
  CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数

每个Dockerfile只能有一条CMD命令,如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时,手动指定了运行的命令(作为run的参数),则会覆盖掉CMD指定的命令。

2.4.1 ENTRYPOINT
指定这个容器运行时 要运行的命令,可以追加命令

2.5 EXPOSE
说明:声明镜像内服务所监听的端口 格式:

EXPOSE [ …]

实例:

EXPORT 22 80 443

注意,该指令只是起到声明作用,并不会自动完成端口映射。如果你要完成映射还是要在创建的时候使用-p/-P参数。

2.6 ENV
说明:指定环境变量,在镜像的生成过程中会被后续RUN指令调用,在启动的容器中也会存在。格式:

   ENV <key> <value>
  ENV <key>=<value>

实例:
  ENV PG_MAJOR 9.8.3
指令指定的环境变量在运行时可以被覆盖。
2.7 ADD
说明:复制指定的路径下的内容到容器中的路径下。格式:

ADD <src> <dest>

实例:
  ADD *.c /code/
其中可以是Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个URL, 还可以是一个tar文件(如果是tar文件会自动解压到路径下)。可以是镜像内的绝对路径,或者相对于工作目录(WORKDIR)的相对路径。

2.8 ARG
说明:指定一些镜像内使用的参数(例如版本号信息),这些参数在执行docker build命令时才以–build-arg=格式传入。格式:

ARG <name> [=<default value>]

#基于centos镜像 :指明构建的新镜像是来自于哪个基础镜像
FROM centos

#维护人的信息(一般是邮箱地址)
MAINTAINER The CentOS Project 464945880@qq.com
#不过,MAINTAINER并不推荐使用,更推荐使用LABEL来指定镜像作者,例如:
#LABEL maintainer=“edisonzhou.cn”

#运行指定命令:安装httpd软件包

RUN yum -y update
RUN yum -y install httpd

#开启80端口:声明容器运行的服务端口

EXPOSE 80

#复制网站首页文件至镜像中web站点下: add 拷贝文件或目录到镜像中

ADD index.html /var/www/html/index.html

#复制该脚本至镜像中,并修改其权限

ADD run.sh /run.sh
RUN chmod 775 /run.sh

#当启动容器时执行的脚本文件

CMD ["/run.sh"]

由上可知,Dockerfile结构大致分为四个部分:
  (1)基础镜像信息
  (2)维护者信息
  (3)镜像操作指令
  (4)容器启动时执行指令。
  Dockerfile每行支持一条指令,每条指令可带多个参数,支持使用以#号开头的注释。下面会对上面使用到的一些常用指令做一些介绍。
3.创建脚本文件
vim run.sh
#!/bin/bash
#清空httpd缓存文件
rm -rf /run/httpd/*
#启动httpd服务
exec /usr/sbin/apachectl -D FOREGROUND
4.创建网站首页文件
echo “Thiss is Nginx webapp.” > index.html
5.查看当前目录文件列表
ls
6.通过Dockerfile文件生成镜像
docker build -t httpd:centos .
7.镜像文件加载到容器中运行
docker run -d -p 80:80 --name=httpd httpd:centos
8.查看运行中的容器
docker ps
9.运行浏览器测试httpd服务
http://192.168.96.44:80

============================================================================

下面是一个Java Web应用的镜像Dockerfile,综合使用到了上述介绍中最常用的几个命令:

FROM centos:7
MAINTANIER www.hc.com

ADD jdk-8u45-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_45

ADD apache-tomcat-8.0.46.tar.gz /usr/local
COPY server.xml /usr/local/apache-tomcat-8.0.46/conf

RUN rm -f /usr/local/*.tar.gz

WORKDIR /usr/local/apache-tomcat-8.0.46
EXPOSE 8080
ENTRYPOINT ["./bin/catalina.sh", "run"]

有了Dockerfile,就可以创建镜像了:

docker build -t tomcat:v1 .

最后,可以通过以下命令创建容器:

docker run -itd --name=tomcate -p 8080:8080 \
    -v /app/webapps/:/usr/local/apache-tomcat-8.0.46/webapps/ \
    tomcat:v1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值