docker容器和镜像的封装及优化,以及私有仓库的搭建

一、docker的简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

1.镜像

docker镜像是一个特殊的文件系统,能够提供容器运行时所需的资源。如果接触过dockerfile的同学应该知道,我们构建镜像时都会选择一个基础镜像(没接触过别担心下面会讲),这说明docker镜像是一层层进行构建的,一个镜像往往由多层文件系统组成。

2.容器

镜像是静态的,镜像运行起来的时候就变成了容器。容器相当于一个完整的操作系统,他可以有自己的文件系统,自己的网络配置。假如我们使用一个mysql容器进行存储数据,这时数据会存储在当前容器的存储层,存储层的生命周期和容器一样,容器消亡时,其存储层也不在了,所以我们在使用这种需要存储数据的容器时,往往都需要指定数据卷Volume(挂载一个宿主机的文件目录),这样即使容器删除,数据也不会消失。

3.仓库

顾名思义,docker仓库即为存储镜像的地方,我们可以将镜像上传至仓库,也可以从仓库下载镜像。这个比较简单,没什么好说的。

二、docker的安装

安装包都可以在相应的官网或者github上下载,还可以在联网情况下直接docker search 查找然后直接拉取下载获得

1.软件包可以直接再docker的官网上下载,点击下载会自动跳转到docker hub里,这里就不再下载了,本次使用的docker版本为
docker-ce.x86_64 3:18.09.7-3.el7和docker-ce-cli.x86_64 1:18.09.7-3.el7,需要注意的是它的依赖环境
在这里插入图片描述

2.启动docker并查看软件信息
systemctl	start	docker
systemctl enable docker			##开启服务并设为开机自启动
docker info 				##可以看到软件的详细信息,并且有错误的话也可以看到

在这里插入图片描述

三、容器的建立和使用

1.导入一个镜像并创建一个容器
本处使用一个2048游戏来演示,也可以使用别的镜像
在这里插入图片描述
在这里插入图片描述
2.在浏览器上进行测试
在这里插入图片描述
可以看到效率很高,只是创建了一个容器就能直接玩一个游戏

四、镜像的制作

1.在原镜像的基础上再修改添加成一层新的镜像

镜像的结构是分层结构,最多又127层,并且所有镜像层都是只读的,只有最上方的容器是可写的,当查看文件时,docker从上往下依次查找文件,并且修改的内容都是被容器层保存然后生成新的镜像记录下来

获取一个ubuntu.tar来进行操作

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

2.Dockerfile来制作简单的镜像

这种制作方法可以看到对镜像操作的详细信息,一般建议使用这种方法

首先介绍一下简单的操作指令
docker rm vm1 		##删除容器
docker rmi v1		##删除镜像,等同与docker image rm v1
mkdir docker		##建立一个目录来存放Dockerfile
vim Dockerfile		##编辑一个镜像制作文件

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

3.Dockerfile的参数简介

在这里插入图片描述
CMD:容器启动时需要执行的命令,如CMD /bin/bash,也可以使用exec语法,如CMD ["/bin/bash"]
而且CMD的命令会被 docker run 的命令覆盖而ENTRYPOINT不会

VOLUME:用来向基于镜像创建的容器添加卷。比如你可以将mongodb镜像中存储数据的data文件指定为主机的某个文件。(容器内部建议不要存储任何数据)

4.用Dockerfile封装一个能使用的nginx镜像

首先获取并导入一个rhel.tar的镜像,把原来的容器和镜像都删除掉

文件里的默认目录都是当前目录,所以需要给它一个yum源和一个nginx安装包

在这里插入图片描述
Dockerfile的内容如下:
在这里插入图片描述
创建镜像测试能否成功:
在这里插入图片描述
在这里插入图片描述

创建一个容器并在浏览器上进行测试
在这里插入图片描述
在这里插入图片描述

五、镜像的优化

首先下载并导入一个官方的nginx镜像用来对比大小,其实nginx本身很小,只是在安装编译环境附带了很多的依赖环境,
而且我们需要的只是编译完之后生成的那个nginx目录,所以我们可以让这个镜像变的更加的小些

docker stop vm1 		##停止正在运行的容器
docker rm -f vm1 		##强制删除容器,即使正在运行也会被删除

在这里插入图片描述

docker history rhel7:nginx		##通过对镜像历史的查看可以看到我们用了什么命令,而且在Dockerfile里,一个命令就是一层镜像

在这里插入图片描述

1.减少镜像层数
减少镜像的层数和编译完成后的不需要的编译环境,可以大大的减少我们的镜像大小,我们让一个容器中编译并安装nginx,然后把
编译安装后的目录导入到另一个容器中使用,而我们最后所要的就只是这个有目录的容器

在这里插入图片描述

vim Dockerfile
FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.17.0.tar.gz /mnt
EXPOSE 80
WORKDIR /mnt/nginx-1.17.0
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && rm -fr /var/cache/yum && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-*
##把所有的命令写在一层里

FROM gcr.io/distroless/base
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;"]

在这里插入图片描述
可以明显发现镜像变小,但是进入容器中发现,nginx调用的很多进程还保存在镜像中

docker run -it --name vm2 rhel7:v1  bash		##不写这个bash无法交互

在这里插入图片描述

2.最优之多阶段构建

可以直接在github里找到参考代码,并且最好在官方制作的nginx镜像基础上来做

vim Dockerfile
FROM nginx:1.16.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/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 443
ENTRYPOINT ["nginx", "-g", "daemon off;"]

可以看到镜像明显的缩小
在这里插入图片描述

六、私有仓库的搭建(只能本地使用)

1.首先获取一个registry2.tar镜像并导入

在这里插入图片描述

2.仓库的搭建以及镜像文件的上传和下载

registry默认使用的就是5000端口,-v是手动指定数据的挂载点,可以通过–help查看更多用法
在这里插入图片描述

本地镜像在命名时需要加上仓库的ip和端口

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

七、镜像加速器的搭建

在日常使用中如果我们直接使用docker pull 从官网下载数据,那样会比较慢,通过第三方的加速可以让我们更快的下载这些文件,比如说我们接下来使用的阿里云
只要注册了一个帐号后,点击容器镜像服务,再点击控制台,就可以看到阿里云提供的加速地址

在这里插入图片描述
再根据它的操作文档进行操作,加入加速地址并重启服务
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值