0%

Docker记录(1)

  • 本文仅用作自己在学习路上遇到问题、解决问题方面的记录。如被提供给同样在此方面遇到问题的同学参考,不胜荣幸。若文中有出现纰漏不够严谨之处,望海涵。意见之处,不吝赐教。

一、Docker的介绍及安装

1、什么是Docker

Docker是基于Go语言实现的云开源项目

Docker的主要目标是一次封装、到处运行

Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置,到处使用。

2、Docker能干吗

以前的虚拟机:

  • 缺点:
  • 资源占用多
  • 冗余步骤多
  • 启动慢

Docker与传统虚拟机的区别:

  • 传统虚拟机技术是虚拟化一套硬件后,在其上运行一个完整的操作系统,在该系统上再运行所需应用进程
  • 容器内的应用进程直接运行于宿主的内核。容器内没有自己的内核,而且也没有进行硬件虚拟,因此容器要比传统虚拟机更为轻便。
  • 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源

3、实际的运行

  • 更高效、更可预测
  • 运维层面的产品,更简单的系统运维
  • 应用更快速的部署

4、Docker的基本组成

4.1、镜像(image)

Docker镜像就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器

4.2、容器(container)

Docker利用容器独立运行的一个或者一组应用。容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做一个简易版的Linux环境(包括Root权限、进程空间、用户空间等)和运行在其中的应用程序。容器的定义和镜像几乎一摸一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是刻度、可写的。

4.3、仓库(repository)

仓库是集中存放镜像文件的场所。仓库分为公开和私有。仓库和仓库注册服务器是有所区别的。仓库注册服务器上存放多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。

二、Docker镜像介绍

1、镜像是什么

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

1.1、UnionFS

UnionFS(联合文件系统):一种分层,轻量级并且高性能的文件系统。它支持对文件的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

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

1.2、镜像加载原理

  • 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等等。

1.3、分层的镜像

pull的文件是一层一层拉取。

1.4、分层结构的特点

  • 共享资源

2、镜像的特点

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

3、镜像的操作

目的是将已改变的环境制作成一个新的镜像,在其他电脑使用的时候,可以直接拉取制作好的镜像即可完成环境的共享。

1
docker commit -m ="要提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

3.1、下载tomcat镜像

1
docker pull tomcat:8.5.64-jdk16-openjdk

3.2、创建容器并启动

1
docker run -it -p 8888:8080 tomcat
参数 说明
-p 主机端口:docker容器端口
-P 随机分配端口
-i 交互
-t 终端
1
2
访问
http://虚拟机IP:8888

命令补充

进入方式 说明
exec 在容器中打开新的终端并且可以启动新的进程
attach 直接进入容器启动命令的终端,不会启动新的进程

3.3、修改容器

发现启动的容器中没有要访问的资源,自己创建即可

1
2
3
4
5
6
docker exec -it 容器ID /bin/bash
mkdir root
vi index.html
echo hello >>index.html
cat index.html
在root文件夹中的index.html文件中存入hello内容

3.4、创建镜像

现在的容器和现在的有区别了,可以在此基础上创建新的镜像

1
docker commit -a='author' -m ='description message' 容器ID 名称/tomcat:版本

3.5、启动新的镜像

1
docker run -it -p 8888:8080 名称/tomcat:版本

三、Docker数据卷

1、数据卷

当容器停止获取删除后,容器中部分数据出现丢失现象,为了实现容器的数据持久化引入数据卷来解决这个问题。

1.1、数据卷的定义

为了保存数据在docker中,我们使用卷的概念。容器卷就相当于Redis中持久化方式的RDB和AOF。

1.2、解决的问题

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

特点:

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

持久化:容器间集成和共享数据

1.3、数据卷的使用

1.3.1、直接添加
1
2
3
4
5
6
7
8
docker pull centos:7
//运行一个centos容器
docker run -it centos:7
//挂载数据到指定目录,执行完成会在宿主机和容器根目录下多出对应的文件
docker run -it -v /宿主机路径:/容器内目录 镜像名
eg:docker run -iy -v /mydatavolumecontainer/datavolumecontainer centos:7
//通过inspect命令可以查看容器的详细信息
docker inspect 容器ID

数据共享的操作验证

  • 在宿主机里添加相应的文件内容,打开容器可以看到对应的内容

  • 反之亦然

  • 停掉容器重新启动发现数据依然存在

权限控制:不允许在容器中进行修改

修改权限:

1
2
3
docker run -it -v /宿主机绝对路径:/容器目录:ro 镜像名
//ro --read only
eg:docker run -iy -v /mydatavolumecontainer1/datavolumecontainer1 centos:7
1.3.2、DockerFiler添加

宿主机根目录下创建一个mydocker

1
2
3
mkdir mydocker
//创建一个dockerfile1文件
vim dockerfile1

修改Volume信息

1
2
3
4
5
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,-----------success1"
CMD /bin/bash

根据这个DockerFile构建我们的镜像文件

1
2
3
4
docker build -f dockerFile1 -t 名称 .(加一个点)
//-f是DockerFile文件的路径
//是标签
// .是当前的路径

根据新创建的镜像文件创建容器,启动后可以看到容器中创建的对应的目录

1
docker run -it 名称

这对应的目录和宿主机映射的路径的查找可以通过inspect命令查找

1
docker inspect 容器ID

验证和1.3.1验证方式相同

2、数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据的容器,称之为数据卷容器。

2.1、启动一个父容器

1
2
3
docker run -it --name dc01 名称/centos
cd dataVolumeContainer1
echo hello>>a.txt

2.2、创建两个子容器

1
2
docker run -it --name dc02 --volumes-from dc01 名称/centos
docker run -it --name dc03 --volumes-from dc01 名称/centos
  • 子容器共享父容器资源
  • 修改任意子容器资源在另一个子容器中更新内容也是可见的

注意:删除dc01后,dc02和dc03之间的数据同样共享

容器之间配置信息的传递,数据卷的生命周期一直持续到没有数据使用为止

3、DockerFile

DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

  • 编写DockerFile文件
  • docker build
  • docker run

3.1、构建过程

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像提交

3.2、执行流程

docker执行一个DockerFile脚本的流程大致如下:

  • docker从基础镜像运行一个容器
  • 执行一条指令并对容器做出修改
  • 执行类似docker commit的操作提交一个新的镜像层
  • docker再基于刚提交的镜像运行一个新的容器
  • 执行docker中的下一条指令直到所有指令都执行完成

从软件的角度看,DockerFile、Docker镜像和Docker容器分别代表软件的三个不太阶段。

DockerFile:定义进程所需一切的文件

Docker镜像:编译后产生的镜像文件,当运行Docker镜像时,会真正开始提供服务

Docker容器:容器是直接提供服务的

3.3、DockerFIle案例

从官方pull下来的centos没有vim命令,将其强化

  • 编写DockerFile文件
1
2
3
4
5
6
7
8
9
10
11
FROM centos
MAINTAINER bobo<dengpbs.163.com>

ENV MYPATH /usr/local

RUN yum -y install vim

EXPOSE 80
CMD echo $MYPATH
CMD echo "success------666666"
CMD /bin/bash
  • 构建镜像文件
1
2
//docker build -f  DockerFile文件路径 -t 镜像名称:tag
docker build -f dockerFile2 -t 名称/centos7:1.7 .
  • 运行
1
docker run -it  名称/centos7:1.7
-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道