Docker--基于Dockerfile制作镜像

  • Dockerfile
  • Dockerfile概念
  • Docker镜像的创建方法
  • Dockerfile操作指令
  • 基于Dockerfile制作镜像实验
  • 构建Nginx镜像
  • 1.建立工作目录
  • 2.创建并编写Dockerfile文件
  • 3.生成镜像
  • 4.查看镜像
  • 5.启动容器进行测试
  • nginx镜像优化
  • 优化方式
  • 1.不需要输出的指令丢入/dev/null(需要确定执行命令是正确的)
  • 2. 减少RUN构建
  • 3. 多阶段构建(使用FROM命令生成多个镜像,将制定的镜像作为其他镜像的基础镜像环境来构建)
  • 4. 使用更轻量级的linux发行版本


Dockerfile

Dockerfile概念

Docker镜像的创建方法

创建镜像有三种方法,分别是:
基于已有镜像创建基于本地模板创建基于Dockerfile创建

其中Dockerfile创建的方法最为灵活,Dockerfile可以看作是被Docker程序所解释翻译的脚本,是由一组命令集合而成,每条命令都对应一条操作指令,由Docker翻译为Linux下的具体命令。用户可以通过自定义其内容来快速创建镜像。

Dockerfile操作指令

Dockerfile文件有自己严格的格式需要遵循,每行只支持一条指令。

下面为Dockerfile操作指令:

指令

含义

FROM镜像

指定镜像所基于的镜像,第一条命令必须是FROM指令,没创建一个镜像就要一条FROM指令

MAINTAINER名字

说明镜像信息

RUN 命令

在所基于镜像上执行命令,并提交到新的镜像中

CMD[“要运行的程序”,“参数1”,“参数2”]

容器启动时默认允许的命令或者脚本,该指令只能有一条,如果有多条则只有最后一条被执行

EXPOSE端口号

指定镜像加载到docker是要开启的端口

ENV 环境变量 变量值

设置环境变量

ADD 源文件/目录 目标文件/目录

将源文件复制到目标文件,如果是压缩包则可以直接解压,可以复制跨界点数据

COPY 源文件/目录 目标文件/目录

将宿主机指定的文件复制到image层

VOLUME[“目录”]

在容器中创建一个挂载点

USER用户名/UID

指定允许容器时的用户

WORKDIR 路径

相当于cd命令,路径跳转

ONBUILD 命令

指定所生成的镜像为基础镜像时要运行的命令

HEALTHCHECK

健康检查

基于Dockerfile制作镜像实验

构建Nginx镜像

1.建立工作目录

[root@localhost ~]# mkdir nginx && cd nginx

2.创建并编写Dockerfile文件

[root@localhost nginx]# vim Dockerfile
FROM centos:7							//基于基础环境,没有会自动下载
MAINTAINER this is nginx image			//维护镜像的用户像信息
RUN yum -y update && yum -y install pcre-devel zlib-devel gcc gcc-c++ make	&> /dev/nulll 	//安装依赖环境
RUN useradd -M -s /sbin/nologin nginx			//创建nginx用户
ADD nginx-1.12.2.tar.gz /usr/local/src			//解压包
WORKDIR /usr/local/src
WORKDIR nginx-1.12.2	
RUN ./configure --prefix=/usr/local/nginx \		//指定工作目录
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install &> /dev/null
ENV PATH /usr/local/nginx/sbin:$PATH			//设置环境变量
EXPOSE 80										//暴露端口
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
CMD nginx										//执行默认命令开启nginx

3.生成镜像

[root@localhost nginx]# ls
Dockerfile  nginx-1.12.2.tar.gz
[root@localhost nginx]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[root@localhost nginx]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost nginx]# docker build -f Dockerfile -t nginx:new .
	docker build:基于dockerfile 构建镜像
	-f :指定dockerfile 文件(默认不写的话指的是当前目录)
	-t : (tag) 打标签---------》nginx : new
	.  :专业说法:指的是构建镜像时的上下文环境,简单理解:指的当前目录环境中的文件

操作系统制作docker image 制作dockerfile_运维

CMD和ENTRYPOINT的区别
1、ENRYPOINT指开启容器前镜像就已经执行了括号内的命令
2、CMD是开启容器时,要执行的指令,设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换
3、基于Dockerfile内有CMD或者ENTRYPOINT创建镜像时,docker run 后面就不要加指令(/bin/bash)了,会覆盖掉Dockerfile中的指令或者语法报错

4.查看镜像

[root@localhost nginx]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        new       08b80aab07b0   4 minutes ago   539MB
centos       7         8652b9f0cb4c   9 months ago    204MB

5.启动容器进行测试

[root@localhost nginx]# docker run -itd -P nginx:new 	//-P:随机生成一个端口
287930b58911601d62ff7f88919249af3cc11f32f0a34c77b74577c853f4b1d3
[root@localhost nginx]# docker ps -a	//查看端口号
CONTAINER ID   IMAGE       COMMAND              CREATED         STATUS         PORTS                                     NAMES
287930b58911   nginx:new   "/bin/sh -c nginx"   5 seconds ago   Up 5 seconds   0.0.0.0:49153->80/tcp, :::49153->80/tcp   condescending_elbakyan

网页访问:

操作系统制作docker image 制作dockerfile_docker_02

nginx镜像优化

优化方式

  • 1.减少RUN 指令的使用
    RUN yum -y update
    RUN yum install -y gcc gcc-c++
    整合为yum install -y gcc gcc-c++ && yum -y update
  • 2.将执行后的缓存/不用的输出丢入黑洞 (减少缓存)
    yum install -y gcc gcc-c++ && yum -y update > /dev/null
  • 3.多阶段构建
  • 4.使用更小体积的linux发行版本
    更加轻量级的centos的版本

1.不需要输出的指令丢入/dev/null(需要确定执行命令是正确的)

[root@localhost nginx01]# vim Dockerfile
FROM centos:7
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && yum clean all
ADD nginx-1.12.2.tar.gz /mnt
WORKDIR /mnt/nginx-1.12.2
#关闭debug日志
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
RUN rm -rf /mnt/nginx-1.12.2
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx""-g","daemon off;"]
[root@localhost nginx01]# docker build -t nginx:test1 .
[root@localhost nginx01]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        test1     bcd992cafd8a   7 seconds ago    310MB
nginx        new       08b80aab07b0   18 minutes ago   539MB
centos       7         8652b9f0cb4c   9 months ago     204MB

2. 减少RUN构建

FROM centos:7
ADD nginx-1.12.2.tar.gz /mnt 
WORKDIR /mnt/nginx-1.12.2
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \
 yum clean all && \
 sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
 ./configure --prefix=/usr/local/nginx &> /dev/null && \
 make &> /dev/null && make install &> /dev/null &&\
 rm -rf /mnt/nginx-1.12.2
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]		##挂载;若是不指定挂载点,默认是/var/lib/docker/volumes/容器id/_data
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

[root@localhost nginx02]# docker build -f Dockerfile -t nginx:test02 .
[root@localhost nginx02]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        test02    7c4237800a32   7 seconds ago    308MB
nginx        test1     bcd992cafd8a   3 minutes ago    310MB
nginx        new       08b80aab07b0   22 minutes ago   539MB
centos       7         8652b9f0cb4c   9 months ago     204MB

3. 多阶段构建(使用FROM命令生成多个镜像,将制定的镜像作为其他镜像的基础镜像环境来构建)

FROM centos:7 as build 
ADD nginx-1.12.2.tar.gz /mnt 
WORKDIR /mnt/nginx-1.12.2
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \
 yum clean all &&\
 sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
 ./configure --prefix=/usr/local/nginx &> /dev/null && \
 make &>/dev/null && \
 make install &>/dev/null && \
 rm -rf /mnt/nginx-1.12.2 

FROM centos:7 
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

[root@localhost nginx03]# docker build -t nginx:test03 .
[root@localhost nginx03]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        test03    64118deb0438   15 seconds ago   205MB
nginx        test02    7c4237800a32   3 minutes ago    308MB
nginx        test1     bcd992cafd8a   7 minutes ago    310MB
nginx        new       08b80aab07b0   25 minutes ago   539MB
centos       7         8652b9f0cb4c   9 months ago     204MB

4. 使用更轻量级的linux发行版本

docker pull nginx 只有133MB