Dockerfile
docker镜像分层
docker的最小镜像
[root@docker01 ~]# docker pull hello-world
Dockerfile的组成:
- FROM : scratch(抓、挠)
2)COPY: hello /
- CMD: ["/hello"]
base镜像
Centos:7 镜像的dockerfile
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20200504" \
org.opencontainers.image.title="CentOS Base Image" \ org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \ org.opencontainers.image.created="2020-05-04 00:00:00+01:00"
CMD ["/bin/bash"]
镜像的分层
1)dockerfile的书写格式为:Dockerfile
- FROM: 构建镜像有两种方式,一种是scratch(从零构建),另一种可以基于某个镜像开始构建。
3)镜像所运行的操作(用户所期望的)。
//根据Dockerfile文件制作镜像。
[root@docker01 ~]# docker build -t centos7-vim-net-tools:12-11 .
Dockerfile镜像分层总结:
镜像时容器的基石,容器是镜像运行后的实例。当镜像运行为容器之
后,对镜像的所有数据仅有只读权限,如果需要对镜像源文件进行修改或
删除操作,此时是在容器层(可写层)进行的,用到了COW(copy on
write)写时复制机制。
Docker镜像的缓存特性
创建一个新的dockerfile文件
[root@docker01 ~]# docker build -t new-centos .
1) 如果在相同的层,有用到相同的镜像,可以不必再去下载,直接使用缓
存。
创建一个新的Dockerfile
2) 即使镜像层里的操作一样,也必须是在同一层才可以使用dockerfile的
缓存特性
如果制作镜像过程中,不想使用缓存,可以加–no-cache选项。
3) 如果前边的层发生改变,即使后边的层操作和顺序一样,也不能使用缓
存特性
Dockerfile常用指令
*1) FROM: 构建镜像基于哪个镜像
例如: FROM centos:7
2) MAINTAINER: 镜像维护者姓名或邮箱地址
例如: MAINTAINER adam
*3) RUN: 构建镜像时运行的shell命令
例如:
RUN [“yum”,“install”,“httpd”]
RUN yum -y install httpd
~]# docker build -t new-centos .
*4) CMD: 运行容器时执行的shell命令
例如:
CMD ["/bin/bash"]
*5) EXPOSE声明容器的服务端口
例如: EXPOSE 80 443
*6) ENV: 设置容器环境变量
例如:
ENV MYSQL_ROOT_PASSWORD 123.com
*7) ADD: 拷贝文件或目录到镜像,如果是URL或压缩包会自动下载或自动
解压
ADD <源文件>… <目标目录>
ADD [“源文件”…“目标目录”]
*8) COPY: 拷贝文件或目录到镜像容器内,跟ADD类似,但不具备自动下载或解压功能
9) ENTRYPOINT: 运行容器时执行的shell命令
例如:
ENTRYPOINT ["/bin/bash","-c",“command”]
ENTRYPOINT /bin/bash -c ‘command’
*10) VOLUME: 指定容器挂载点到宿主机自动生成的目录或其他容器
例如:
VOLUME ["/var/lib/mysql"]
11) USER: 为RUN、CMD、和ENTRYPOINT执行命令指定运行用户
*12)WORKDIR: 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录,意思为切换目录
例如:
WORKDIR: /var/lib/mysql
13)HEALTHCHECK: 健康检查
14) ARG: 构建时指定的一些参数
例如:
FROM centos:7
ARG user
USER $user
注意:
1、RUN在building时运行,可以写多条。其实RUN是有条件限制的()。
2、CMD和ENTRYPOINT在运行container时运行,只能写一条,如果写多条,最后一条生效
3、CMD在run时可以被COMMAND覆盖,ENTRYPOINT不会被COMMAND覆盖,但可以指定–entrypoint覆盖。
4、如果在Dockerfile里需要往镜像内导入文件,则,此文件必须在dockerfile所在目录或子目录下。
5、一个目录下,只能有一个Dockerfile文件,并且名称的大小写严格按照要求: Dockerfile.
小实验
写一个dockerfile,基于centos:7 镜像,部署安装NGINX服务。
FROM centos:7
RUN yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
COPY nginx-1.6.0.tar.gz /
RUN tar -zxf nginx-1.6.0.tar.gz -C /usr/src
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/src/nginx-1.6.0 RUN ./configure --prefix=/usr/local/nginx --user=nginx -- group=nginx
RUN make && make install
RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
RUN nginx -t
RUN nginx
EXPOSE 80
// 可以通过docker build 命令将上述Dockerfile文件制作成镜像
[root@docker01 ~]# docker build -t webapp .
注意,此工作目录和dockerfile是在同一个目录中。
//如果想要保证容器运行之后,nginx服务就直接开启,不必手动开启,我们可以在命令最后加上: nginx -g "daemon off;"选项
[root@docker01 ~]# docker run -itd --name testweb webapp:latest nginx -g "daemon off;"