镜像是容器的模板,容器是镜像运行的实例,可以类比为模具和实物的关系或者编程语言里面"类"和"实例"的关系,镜像是静态的定义,容器是动态运行的实体
一、镜像的构成
hello-world
Hello-world是docker官方提供的一个很小的镜像,用来测试docker是否正确运行
$ docker run hello-world
$ docker images
这个镜像才1.04kb,我们看下他的Dockerfile描述
FROM scratch
COPY hello /
CMD ["/hello"]
(1) FROM scratch 说明镜像是白手起家,从0开始构建
(2) COPY hello / 将文件"hello"复制到镜像的目录
(3) CMD ["/hello"] 容器启动时执行 /hello
二、Dockerfile的构建
概念:Dockerfile 是一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据 Dockerfile 的内容构建我们自己需要的镜像
base镜像:
a、不依赖其他镜像,从scratch开始
b、以其他镜像为基础扩展
Dockerfile常用指令,主要分为配置指令和操作指令,一图展示各种命令
配置指令
2.1、ARG(定义镜像创建过程中的变量)
用法:ARG <name>[<default value>]
2.2、FROM
用法:FROM <image>
- FROM指定构建镜像的基础源镜像,如果本地没有该镜像,默认会从 DockerHub上拉取镜像
- FROM scratch 说明镜像是从0开始构建,不依赖其他镜像
- FROM可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像
2.3、LABEL
用法:LABEL <key>=<value> <key>=<value> <key>=<value>
例如:LABEL version="l.0.0-rc3"
LABEL author="yeasy@github" date="2020-01-01"
2.4、EXPOSE(声明镜像内服务监听的端口)
用法:EXPOSE <port>
例如:EXPOSE 22 80 8443
2.5、ENV
用法:ENV <key> <value>或 ENV <key>=<value>
例如:
ENV APP_VERSION=1.0.0
ENV APP_HOME=/usr/local/bin
ENV PATH $PATH:/usr/local/bin
2.6、ENTRYPOINT
支持两种格式:
□ ENTRYPOINT ["executable", "paraml ", "param2"]:exec 调用执行;
□ ENTRYPOINT command param 1 param2: shell 中执行;
每个Dockerfile 中只能有一个ENTRYPOINT, 当指定多个时,只有最后一个起效。
2.7、WORKDIR
指定工作目录
用法:WORKDIR <PATH>
WORKDIR /root/test
操作指令
2.8、RUN
用法:RUN <command>
例如:
RUN apt-get update \
&& apt-get install -y libsnappy-dev zliblg-dev libbz2-dev \
&& rm -rf /var/cache/apt
2.9、CMD(启动容器时指定默认执行的命令)
用法:CMD command paraml param2 :在默认的Shell 中执行
每个Dockerfile 只能有一条CMD 命令。如果指定了多条命令,只有最后一条会被执行
2.10、ADD
格式为ADD <src> <dest>
COPY的作用和ADD类似,这里不再赘述
三、通过示例练习Dockerfile
# This my first nginx Dockerfile
# Version 1.0
# Base images 基础镜像
FROM centos
#MAINTAINER 维护者信息
MAINTAINER pythontaotao
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
#RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["nginx"]