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
. :专业说法:指的是构建镜像时的上下文环境,简单理解:指的当前目录环境中的文件
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
网页访问:
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