联合文件系统|容器数据卷|DockerFile

一、Docker安装Nginx

1、搜索镜像

docker search nginx

建议去docker hub搜索镜像,可以查看对应详细的帮助文档。

2、下载镜像

docker pull nginx

3、运行测试

[root@iZ2ze436suxwekgjxx28iaZ /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              0901fa9da894        7 hours ago         132MB
centos              latest              831691599b88        3 weeks ago 
[root@iZ2ze436suxwekgjxx28iaZ /]# docker run -d --name nginx01 -p 3344:80 nginx
#说明: 
#-d 后台运行;
#-name 给容器命名;
#-p 主机端口:容器内部端口

[root@iZ2ze436suxwekgjxx28iaZ /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS                  NAMES
95291ebbed54        nginx               "/docker-entrypoint.…"   10 seconds ago      Up 9 seconds            0.0.0.0:3344->80/tcp   nginx01

[root@iZ2ze436suxwekgjxx28iaZ /]# curl localhost:3344
#显示 Welcome to nginx! 页面
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>


二、可视化工具portainer

docker search portainer

docker pull portainer/portainer

docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

上述命令执行完毕后,远程访问Portainer容器:http://IP:9000(注意,需要提前打开9000对应地安全组)


三、联合文件系统

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

3.1 UnionFS(联合文件系统)

Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

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

3.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等等。

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

3.3 分层理解

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上创建新的镜像层。在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。

以常用的操作 pull 操作为例,在下载的过程中可以看到 docker 的镜像是在一层一层地下载。

分层结构最大的一个好处就是:可以共享资源。

举个例子:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份 base 镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务。而且镜像的每一层都可以被共享

特点:Docker 镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层即为通常说的容器曾,容器之下的都叫做镜像层。

3.4 commit 镜像
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名称:[TAG]

四、容器数据卷

4.1 概述

Docker 的理念:

  • 将应用与运行的环境打包形成容器运行。如果数据都在容器中,那么容器删除后数据也就被删除,但我们对数据的要求希望是持久化的
  • 容器之间希望有可能共享数据

为了实现数据持久化,在 docker 中我们使用容器数据卷技术,讲容器中产生的数据,同步到本地。(目录的挂载,将容器内的目录,挂载到linux上)

总结一句话:容器的持久化和同步操作,同时允许容器间共享数据。

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

特点:

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止
4.2 使用数据卷

有两种方式。

方式一:直接使用命令来挂载

即 -v 命令。

docker run -it -v -p 主机目录:容器内目录

[root@iZ2ze436suxwekgjxx28iaZ /]# docker run -it -v /home/ceshi:/home centos /bin/bash

# 查看其挂载信息
[root@iZ2ze436suxwekgjxx28iaZ ceshi]# docker inspect 8bcdefaa0ef1

        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/ceshi", #主机内地址
                "Destination": "/home",  #容器地址
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

至此,指定的主机目录和容器内目录成功绑定在一起,每当在容器内部修改 /home 目录下的文件时,会自动同步到主机的 /home/ceshi 目录。(在主机操作同样也会同步到容器,即反向操作也成立)

实例:MySQL 同步数据:

# 第一步:下载mysql镜像
[root@iZ2ze436suxwekgjxx28iaZ /]# docker pull mysql:5.7

# 第二步,启动mysql容器,利用-v命令进行挂载
[root@iZ2ze436suxwekgjxx28iaZ /]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=931318132 --name mysql01 mysql:5.7

#第三步,利用navicat等软件远程访问3310,并且创建一个test数据库进行测试,发现容器和主机实现了同步
方式二:Dockerfile

Dockerfile 是用来构建 docker 镜像的构建文件。是一个命令脚本。通过这个脚本可以生成镜像,镜像是一层一层的,对应于脚本的一个一个命令。

1、编写 dockerfile1

vim dockerfile1

#文件内容:
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "---end---"
CMD /bin/bash

2、构建自己的镜像

docker build -f dockerfile1 -t xingyu/centos .

其中 “volume01”,“volume02” 即为挂载的数据卷(匿名挂载)。

4.3 具名挂载和匿名挂载

1、匿名挂载:-v 容器内路径

[root@iZ2ze436suxwekgjxx28iaZ /]# docker run -d -v /home/ceshi centos /bin/bash

docker volume ls :可以查看所有的卷的情况。

[root@iZ2ze436suxwekgjxx28iaZ /]# docker volume ls
DRIVER              VOLUME NAME
local               9e2d3ea987fffcfd56ff29cb2a9d6d607493c0ebf483dfd5e8e2149c4ea60f51
local               9766f3fd0efda74fa2bdcac6fe09cb2e90846aa33e6208d62d3e7eec6ab8fd07

#如上情况即为匿名挂载,因为-v时只写了容器内路径,未指定容器外路径

2、具名挂载:-v 卷名:容器内路径

[root@iZ2ze436suxwekgjxx28iaZ /]# docker run -d -v haha:/home/ceshi centos /bin/bash
[root@iZ2ze436suxwekgjxx28iaZ /]# docker volume ls
DRIVER              VOLUME NAME
local               9e2d3ea987fffcfd56ff29cb2a9d6d607493c0ebf483dfd5e8e2149c4ea60f51
local               haha
#查看容器外挂载位置
[root@iZ2ze436suxwekgjxx28iaZ /]#docker volume inspect haha 

所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/卷名/_data 目录下。

通过具名挂载,可以方便的找到对应的卷,所以建议使用具名挂载。

扩展:可以通过 -v 容器内路径:ro / rw 改变读写权限。其中,ro只读/rw可读可写。一旦设置容器权限,容器对挂载出的内容就有了限制。(只要看到ro,说明这个路径只能通过主机来操作,容器内无法操作)

总结:

-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v 主机路径:容器内路径 #指定路径挂载

五、数据卷容器

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享(拷贝的概念),挂载数据卷的容器,称之为数据卷容器。

–volumes-from 命令。

docker run -it --name dc02 --volumes-from dc01 zzyy/centos

容器之间可以配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用它为止。但是一旦持久化到本地,这时本地的数据是不会删除的。

应用:多个 MySQL 实现数据共享。


六、DockerFile

6.1 介绍

dockerfile 是用来构建 docker 镜像的文件,命令参数脚本。

构建步骤:

1、编写一个 dockerfile 文件;

2、docker build 构建成为一个镜像;

3、docker run 运行镜像;

4、docker push 发布镜像(dockerhub、阿里云镜像仓库等)。

很多官方镜像都是基础包,很多基础功能都没有,所以通常需要自己来根据需求搭建。

6.2 构建过程

基础知识:

1、每个保留关键字(指令)都必须是大写字母;

2、指令从上到下顺序执行;

3、# 表示注释;

4、每个指令都会创建提交一个新的镜像层。

联合文件系统|容器数据卷|DockerFile_第1张图片

dockerfile 是面向开发的,以后要发布项目或者做镜像都需要编写 dockerfile 文件。docker 镜像逐渐成为了企业工作交付的标准!

  • dockerfile:构建文件,定义了一切的步骤,是源代码;
  • dockerimages:通过dockerfile构建生成的镜像,是最终发布和运行的产品,容器技术出现之前是jar或war;
  • docker容器:容器用于在镜像运行起来后提供服务;
6.3 基础指令
  • FROM:指定基础镜像,一切从这里开始构建
  • MAINTAINER:指定维护者信息(镜像是谁写的…)
  • RUN:镜像运行时需要执行的命令
  • ADD:天加内容,例如,运行tomcat镜像,需要tomcat压缩包
  • WORKDIR:镜像的工作目录
  • VOLUME:设置卷,指定挂载的目录
  • EXPOSE:指定对外的端口
  • CMD:指定这个容器启动时需要运行的命令,只有最后一个生效,可被替代
  • ENTRYPOINT:作用同CMD,但是可以追加命令
  • ONBUILD:当构建一个被继承 dockerfile 时,就会执行 ONBUILD 指令,属于触发指令
  • COPY:类似ADD,将文件拷贝到镜像中
  • ENV:构建时设置环境变量

你可能感兴趣的:(Docker)