docker系列(5)-Docker的镜像和私有仓库的搭建

docker系列(5)-Docker的镜像和私有仓库的搭建

1. Docker镜像

1.1 Docker镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

1.1.1 UnionFS(联合文件系统)

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。

Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

1.1.2 Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

  • bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
  • rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?

docker系列(5)-Docker的镜像和私有仓库的搭建_第1张图片

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

1.1.3 分层的镜像

以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载

docker系列(5)-Docker的镜像和私有仓库的搭建_第2张图片

1.1.4 为什么 Docker 镜像要采用这种分层结构

最大的一个好处就是 - 共享资源
比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

1.2 Docker镜像的特点
  • Docker镜像都是只读的
  • 当容器启动时,一个新的可写层被加载到镜像的顶部
  • 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”

2. Dockerfile

2.1 什么是Dockerfile

2.1.1 介绍

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像

  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境
  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作
  • 对于运维人员:在部署时,可以实现应用的无缝移植
2.1.2 Dockerfile构建步骤
  • 编写Dockerfile文件
  • docker build
  • docker run
2.1.3 Dockerfile文件内容

以熟悉的centos为例:

docker系列(5)-Docker的镜像和私有仓库的搭建_第3张图片

docker系列(5)-Docker的镜像和私有仓库的搭建_第4张图片

2.2 DockerFile构建过程解析

2.2.1 Dockerfile内容基础知识
  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交
2.2.2 Docker执行Dockerfile的大致流程
  • docker从基础镜像运行一个容器
  • 执行一条指令并对容器作出修改
  • 执行类似docker commit的操作提交一个新的镜像层
  • docker再基于刚提交的镜像运行一个新容器
  • 执行dockerfile中的下一条指令直到所有指令都执行完成
2.2.3 总结

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

  • Dockerfile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件的运行状态。

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

docker系列(5)-Docker的镜像和私有仓库的搭建_第5张图片

  • Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
  • Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
  • Docker容器,容器是直接提供服务的。

2.3 常用命令

docker系列(5)-Docker的镜像和私有仓库的搭建_第6张图片

命令 作用
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者,创建者的用户名和邮箱地址
ENV key value 设置环境变量(可以写多条)
RUN command 是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录
  • FROM

    指明构建的新镜像是来自于哪个基础镜像,例如:

    FROM centos: latest

  • MAINTAINER

    指明镜像维护着及其联系方式(一般是邮箱地址),例如:

    MAINTAINER JC Zhang [email protected]

    不过,MAINTAINER并不推荐使用,更推荐使用LABEL来指定镜像作者,例如:

    LABEL maintainer=“zhangsan.cn”

  • RUN

    构建镜像时运行的Shell命令,例如:

    RUN [“yum”, “install”, “httpd”]
    RUN yum install httpd

  • CMD

    启动容器时执行的Shell命令,例如:

    CMD ["-C", “/start.sh”]
    CMD ["/usr/sbin/sshd", “-D”]
    CMD /usr/sbin/sshd -D

  • EXPOSE

    声明容器运行的服务端口,例如:

    EXPOSE 80 443

  • ENV

    设置环境内环境变量,例如:

    ENV MYSQL_ROOT_PASSWORD 123456
    ENV JAVA_HOME /usr/local/jdk1.8.0_45

  • ADD

    拷贝文件或目录到镜像中,例如:

    ADD …
    ADD html.tar.gz /var/www/html
    ADD https://xxx.com/html.tar.gz /var/www/html
    PS:如果是URL或压缩包,会自动下载或自动解压。

  • COPY

  • 拷贝文件或目录到镜像中,用法同ADD,只是不支持自动下载和解压,例如:

    COPY ./start.sh /start.sh

  • ENTRYPOINT

    启动容器时执行的Shell命令,同CMD类似,只是由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定指定的程序,例如:

    ENTRYPOINT ["/bin/bash", “-C”, “/start.sh”]
    ENTRYPOINT /bin/bash -C ‘/start.sh’

    PS:Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效。

  • VOLUME

    指定容器挂载点到宿主机自动生成的目录或其他容器,例如:

    VOLUME ["/var/lib/mysql"]

    PS:一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。

  • WORKDIR

    为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录,例如:

    WORKDIR /data

2.4 使用脚本创建镜像

2.4.1 编写Dockerfile
  • 创建目录

    mkdir -p /export/docker/jdk8

  • 将jdk-8u241-linux-x64.tar.gz上传到服务器(虚拟机)中的/export/docker/jdk8目录

  • 创建文件Dockerfile

    cd /export/docker/jdk8/
    vi Dockerfile
    #依赖镜像名称和id
    FROM centos:latest
    #指定镜像创建者信息
    MAINTAINER ITCAST
    #切换工作目录
    WORKDIR /usr
    RUN mkdir /usr/local/java
    #ADD 是相对路径jar,把java添加到容器中
    ADD jdk-8u241-linux-x64.tar.gz /usr/local/java

    #配置java环境变量
    ENV JAVA_HOME /usr/local/java/jdk1.8.0_241
    ENV JAR_HOME $JAVA_HOME/jre
    ENV CLASSPATH J A V A H O M E / l i b / d t . j a r : JAVA_HOME/lib/dt.jar: JAVAHOME/lib/dt.jar:JAVA_HOME/lib/tools.jar: J R E H O M E / l i b : JRE_HOME/lib: JREHOME/lib:CLASSPATH
    ENV PATH J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH

    docker系列(5)-Docker的镜像和私有仓库的搭建_第7张图片

2.4.2 构建镜像

docker build -t=‘jdk1.8’ .
注意后面的空格和点,不要省略,点表示当前目录

docker系列(5)-Docker的镜像和私有仓库的搭建_第8张图片

2.4.3 查看镜像是否构建完成

docker系列(5)-Docker的镜像和私有仓库的搭建_第9张图片

2.5 自定义镜像mycentos2

2.5.1 编写Dockerfile
  • Hub默认centos镜像

docker系列(5)-Docker的镜像和私有仓库的搭建_第10张图片

  • 准备编写DockerFile文件

    vim Dockerfile
    FROM centos:latest
    MAINTAINER [email protected]

    ENV MYPATH /usr/local
    WORKDIR $MYPATH

    RUN yum -y install vim
    RUN yum -y install net-tools

    EXPOSE 80

    CMD echo $MYPATH
    CMD echo “success--------------ok”
    CMD /bin/bash

2.5.2 构建镜像

docker build -t mycentos:1.1 .

2.5.3 运行镜像

docker run -it mycentos:1.1

3. Docker私有仓库

在 Docker 中,当我们执行 docker pull xxx 的时候 ,它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库。

在工作中,我们不可能把企业项目push到公有仓库进行管理。所以为了更好的管理镜像,Docker不仅提供了一个中央仓库,同时也允许我们搭建本地私有仓库。这一篇介绍registry、harbor两种私有仓库搭建。

3.1registry 的搭建

3.1.1 搭建
  • Docker 官方提供了一个搭建私有仓库的镜像 registry ,只需把镜像下载下来,运行容器并暴露5000端口,就可以使用了。

docker pull registry:2

docker系列(5)-Docker的镜像和私有仓库的搭建_第11张图片

docker run -di -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2

image-20201029141839954

Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录了。

  • 浏览器访问http://node1.itcast.cn:5000/v2/_catalog,出现下面情况说明registry运行正常。

docker系列(5)-Docker的镜像和私有仓库的搭建_第12张图片

3.1.2 验证

现在通过push镜像到registry来验证一下。

  • 查看本地镜像:

    docker images

    docker系列(5)-Docker的镜像和私有仓库的搭建_第13张图片

  • 要通过docker tag将该镜像标志为要推送到私有仓库:

    docker tag nginx:latest localhost:5000/nginx:latest

    image-20201029142149438

  • 通过 docker push 命令将 nginx 镜像 push到私有仓库中:

    docker push localhost:5000/nginx:latest

    image-20201029142211680

  • 访问 http://node1.itcast.cn:5000/v2/_catalog 查看私有仓库目录,可以看到刚上传的镜像了:
    docker系列(5)-Docker的镜像和私有仓库的搭建_第14张图片

  • 下载私有仓库的镜像,使用如下命令:

docker pull localhost:5000/镜像名:版本号

#例如

docker pull localhost:5000/nginx:latest

3.2 docker镜像推送到阿里云镜像仓库

首先需要有一个阿里云的账号

镜像仓库申请地址:https://cr.console.aliyun.com/cn-hangzhou/instances/repositories

docker系列(5)-Docker的镜像和私有仓库的搭建_第15张图片

3.2.1 容器镜像服务控制台概览

docker系列(5)-Docker的镜像和私有仓库的搭建_第16张图片

3.2.2 创建镜像仓库

docker系列(5)-Docker的镜像和私有仓库的搭建_第17张图片

3.2.3 选择本地仓库

docker系列(5)-Docker的镜像和私有仓库的搭建_第18张图片

3.2.4 点击管理

docker系列(5)-Docker的镜像和私有仓库的搭建_第19张图片

docker系列(5)-Docker的镜像和私有仓库的搭建_第20张图片

3.2.5 Docker登录阿里云容器镜像仓库
$ sudo docker login --username=[email protected] registry.cn-hangzhou.aliyuncs.com

docker系列(5)-Docker的镜像和私有仓库的搭建_第21张图片

3.2.6 推送创建的oracle11g_centos7镜像到阿里云镜像仓库

参考如下的命令

docker系列(5)-Docker的镜像和私有仓库的搭建_第22张图片

你可能感兴趣的:(docker,docker)