文章目录
一、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 从官网下载数据,那样会比较慢,通过第三方的加速可以让我们更快的下载这些文件,比如说我们接下来使用的阿里云
只要注册了一个帐号后,点击容器镜像服务,再点击控制台,就可以看到阿里云提供的加速地址
再根据它的操作文档进行操作,加入加速地址并重启服务