一.Dockerfile
1.镜像的简介
在使用DockerFile定制镜像之前,我们先来了解一下镜像的构成:镜像是容器的基础,每次执行docker run命令的时候都会指定哪个镜像作为容器运行的基础。在之前的例字中,我们使用的镜像都是来自Docker Hub的镜像。直接使用这些镜像为基础运行容器可以一定程度上满足我们的需求,可是当这些镜像都无法直接满足需求时,我们就需要定制镜像!
2.Dockerfile的简介
使用Dockerfile可以允许用户创建自定义的镜像
Dockerfile一般由一条条语句组成,并支持以 # 开头的注释行
一般来说Dockerfile分为四部分
基础镜像信息:以哪个镜像作为基础进行制作,用法是FROM基础镜像名称
维护者信息:需要写下该Dockerfile编写人的姓名或邮箱,用法是MANITAINER 名称/邮箱
镜像操作指令:对基础镜像要进行的改造命令,比如安装新的软件,进行哪些特殊配置等,常见的是RUN命令
容器启动时执行指令:当基于该镜像的容器启动时需要执行哪些命令,常见的是CMD命令或ENTRYPOINT
二…创建支持nginx服务的docker镜像
1、编写支持nginx的Dockerfile
[root@server1 ~]# mkdir /mnt/docker
[root@server1 ~]# cd /mnt/docker/
[root@server1 docker]# mkdir nginx
[root@server1 docker]# cd nginx
[root@server1 nginx]# vim Dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make
ADD nginx-1.15.8.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.8
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
2、编写dvd.repo文件
[root@server1 nginx]# vim dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.28.250/rhel7.3
gpgcheck=0
enabled=1
3、构建镜像
下载压缩包:nginx-1.15.8.tar.gz,并将其放在下面建好的目录/mnt/docker/nginx目录下,以便将其放在容器内。
[root@server1 nginx]# docker build -t rhel7:nginx5 . #注意后面的点
查看构建的nginx镜像
4、测试nginx
[root@server1 nginx]# docker run -d --name vm1 -p 80:80 rhel7:nginx5 #创建并运行vm6容器
[root@server1 nginx]# cd /var/lib/docker/volumes/d1ba12b2c7906a07afd73438c6049df1721787f44866cd1564ed73d5823bb784/_data #该数据卷的目录来源于下面的图片(查看vm6容器的关于volume的详情)
[root@server1 _data]# ls #值的注意的是:在默认的数据卷中,会有相应的数据。(这是由nginx基础镜像决定的)。
50x.html index.html
[root@server1 _data]# vim index.html
<h1>news.xin.com</h1>
查看vm1容器的关于volume的详情
测试是否可用,访问172.25.28.1
下面,我们对镜像进行优化(对Dockerfile文件进行修改),以减小生成的镜像的大小
1、编写支持nginx的Dockerfile
[root@server1 nginx]# vim Dockerfile
FROM nginx as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG Asia/Shanghai
RUN mkdir -p /opt/var/cache/nginx && \
cp -a --parents /usr/lib/nginx /opt && \
cp -a --parents /usr/share/nginx /opt && \
cp -a --parents /var/log/nginx /opt && \
cp -aL --parents /var/run /opt && \
cp -a --parents /etc/nginx /opt && \
cp -a --parents /etc/passwd /opt && \
cp -a --parents /etc/group /opt && \
cp -a --parents /usr/sbin/nginx /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libc.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libdl.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpthread.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libcrypt.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime
FROM gcr.io/distroless/base
COPY --from=base /opt /
EXPOSE 80
ENTRYPOINT ["nginx","-g","daemon off;"]
2.下载distorless.tar文件,并将其导入到镜像中
[root@server1 ~]# docker load -i distroless.tar
3.构建镜像
[root@server1 nginx]# docker build -t rhel7:nginx . #不要忘记后面的点
查看构建的nginx镜像
4.测试是否可以使用
[root@server1 nginx]# docker run -d --name vm1 -p 80:80 rhel7:nginx #创建并运行vm1容器
[root@server1 nginx]# vim index.html
<h1>news.xin.com</h1>
[root@server1 nginx]# docker cp index.html vm1:/usr/share/nginx/html
浏览器访问172.25.28.1