【Linux38-1】Docker镜像构建、Dockerfile详解、镜像优化

本文详细介绍了Docker的基本概念、安装配置、Dockerfile的编写以及镜像的优化方法,包括选择精简基础镜像、减少镜像层数、清理构建中间产物等策略。此外,还提供了阿里云加速器的配置方法,以提升Docker的使用效率。
摘要由CSDN通过智能技术生成

1. Docker简介


  • Docker是管理容器的引擎

  • Docker为应用打包、部署平台,而非单纯的虚拟化技术

  • 传统虚拟化与容器技术对比

在这里插入图片描述

  • 镜像的分层结构

在这里插入图片描述
在这里插入图片描述

  • 镜像构建

在这里插入图片描述


2. 安装配置容器


  • 配置软件仓库

vim /etc/yum.repos.d/docker.repo

[docker]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
gpgcheck=0
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

vim /etc/yum.repos.d/CentOS-Base.repo:执行 :%s/$releasever/7/g"

  • 安装

yum install -y docker-ce

  • 开启服务

systemctl enable --now docker.service

  • 配置

vim /etc/sysctl.d/docker.conf

net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

sysctl --system

  • 查看信息检测是否成功

docker info

在这里插入图片描述

3. Dockerfile详解


mkdir docker

cd docker/

  • 镜像构建:
  • 1.创建Dockerfile
  • 2.构建镜像

FROM

  • 指定base镜像,如果本地不存在会从远程仓库下载。

MAINTAINER

  • 设置镜像的作者,比如用户邮箱等。

WORKDIR

  • 为RUN、CMD、ENTRYPOINT、 ADD和COPY指令设置镜像中的当
    前工作目录,如果目录不存在会自动创建(相当于cd)

COPY

  • 把文件从build context复制到镜像
  • 支持两种形式: COPY src dest和COPY [“srC”, “dest”]
  • src必须指定build context中的文件或目录

RUN

  • 运行命令
  • 创建新的镜像层,常用于安装软件包

vim Dockerfile

FROM busybox
RUN touch file1
RUN mkdir westos
COPY index.html /

docker build -t demo:v1 .:构建镜像读取当前目录下的Dockerfile

docker history demo:v1

docker run -it --rm demo:v1:进入查看信息(–rm不缓存)

在这里插入图片描述

ADD

  • 用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到
    dest,也可以自动下载URL并拷贝到镜像
  • ADD html.tar /var/www
  • ADD http://ip/html.tar /var/www

cd /docker

tar zcf test.tar.gz /etc

vim Dockerfile

FROM busybox
RUN touch file1
RUN mkdir westos
COPY index.html /
ADD test.tar.gz /mnt##构建进入/mnt/后会自动解压

docker build -t demo:v2 .

ENV

  • 设置环境变量,变量可以被后续的指令使用:
  • ENV HOSTNAME sevrer1.example.com

vim Dockerfile

FROM busybox
ENV HOSTNAME server1

docker build -t demo:v2 .

docker run -it --rm demo:v3

在这里插入图片描述

EXPOSE

  • 如果容器中运行应用服务,可以把服务端口暴露出去
#以nginx为例,导入nginx镜像
docker load -i nginx.tar

docker run -d --name demo nginx#不会映射端口号
docker run -d --name demo -P nginx#自动映射端口号
docker run -d --name demo -p 80:80 nginx

VOLUME

  • 申明数据卷,通常指定的是应用的数据挂在点:
  • VOLUME ["/var/www/html"]

vim Dockerfile

FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
EXPOSE 80
VOLUME ["/data"]

docker build -t demo:v4 .

docker run -it --rm demo:v4

在这里插入图片描述

docker run -it --name demo demo:v4

在这里插入图片描述
在这里插入图片描述

docker start demo

docker attach demo

在这里插入图片描述

docker rm demo

docker volume ls

docker volume prune

在这里插入图片描述

ENTRYPOINT

CMD

  • 这两个指令都是用于设置容器启动后执行的命令,但CMD会被docker run后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。

  • docker run后面的参数可以传递给ENTRYPOINT指令当作参数。

  • Dockerfile中只能指定一个ENTRYPOINT, 如果指定了很多,只有最后一个有效。

  • vim Dockerfile

FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENTRYPOINT ["echo", "hello"]

docker build -t demo:v5 .

在这里插入图片描述

  • vim Dockerfile
FROM busybox
ENV HOSTNAME server1
CMD echo "hello $HOSTNAME"
#CMD ["echo","hello $HOSTNAME"]则是把变量值当成字符串输出hello $HOSTNAME
#CMD ["/bin/sh","-c","echo","hello $HOSTNAME"]才是变量

在这里插入图片描述

  • vim Dockerfile
FROM busybox
ENTRYPOINT ["echo","hello"]
CMD ["world"]

docker build -t demo:v7 .

在这里插入图片描述

4. 加速器


vim /etc/docker/daemon.json:写入aliyun加速器

systemctl daemon-reload

systemctl restart docker

5. 镜像优化


  • 随着我们对docker镜像的持续使用,在此过程中如果不加以注意并且优化,镜像的体积会越来越多。很多时候我们在使用docker部署应用时,会发现镜像的体积至少有1G以上。镜像体积的增大,不单单会增加磁盘资源与网络资源的开销,也会影响应用的部署效率,使得应用的部署时间会越来越长。因此我们需要减少部署镜像的体积以加快部署效率,降低资源的开销。而对于镜像的优化,可以通过对dockerfile的优化来实现。

1. 选择最精简的基础镜像
2. 减少镜像层数(RUN命令的使用尽量少,因为一个RUN命令就会建立一层自定义镜像层)
3. 清理景象构建的中间产物
4. 注意优化网络请求
5. 尽量用构建缓存
6. 使用多阶段构建镜像


5.1 base镜像为官方nginx-1.18.0


docker load -i rhel7.tar:导入rhel7镜像

cd docker/

[root@server1 docker]# ls
Dockerfile  nginx-1.18.0.tar.gz

vim dvd.repo

[dvd]
name=rhel7.6 BaseOS
baseurl=http://192.168.17.1/rhel7.6/
gpgcheck=0

vim Dockerfile

FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.18.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.18.0
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel &> /dev/null && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.18.0 && yum remove -y gcc make &&  yum clean all

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

docker build -t nginx:v1 .:构建镜像

在这里插入图片描述

5.2 base镜像为nginx精简版(google)


docker pull gsmlg/distroless-base:下载镜像

docker load -i base-debian10.tar

在这里插入图片描述

mkdir nginx
cd nginx

vim Dockerfile

FROM nginx:1.18.0 as base

# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG TIME_ZONE

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 /usr/sbin/nginx-debug /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/ld-* /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* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /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-debian10

COPY --from=base /opt /

EXPOSE 80 443

ENTRYPOINT ["nginx", "-g", "daemon off;"]

docker build -t webserver:v1 .:构建镜像

docker pull nginx:1.18.0:下载官网的nginx镜像对比

在这里插入图片描述

  • 测试

docker run -d --name webserver webserver:v1

docker inspect webserver:查看IP为172.17.0.2

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值