1、Docker基础
1.1、概念
Docker是基于Go语言实现的云开源项目,其运行环境能够做到一次镜像,处处运行 。Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
1.2、容器与虚拟机
Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离 。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置 。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
- 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
1.3、Docker的优势
更快速的应用交付和部署;更便捷的升级和扩缩容;更简单的系统运维;更高效的计算资源利用。
1.4、Docker的基本组成
- 镜像(image):Docker 镜像(Image)就是一个只读的模板,容器与镜像的关系就类似于Java面向编程中的类与对象的关系。
- 容器(container):从面向对象 角度理解 Docker:镜像如同类,容器是由镜像实例化出来的运行对象。镜像是静态模板,容器是镜像的运行实体,承载一个或一组应用。容器提供隔离的标准化运行环境,可启停、删除,各容器之间相互隔离。 从镜像容器角度:可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
- 仓库(repository):是集中存放镜像文件的场所。
镜像文件 :image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
容器实例 :一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行
实例,也就是我们的容器。
仓库 :就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可
以了。
2、常用的命令
c
# systemctl start docker #启动docker
# systemctl status docker #查看docker的运行状态
# systemctl restart docker #重启docker服务
# systemctl stop docker #停止docker服务
# docker --help #查看docker帮助文档
c
# docker images #列出本地主机上的镜像
-a :列出本地所有的镜像(含历史映像层)
-q :只显示镜像ID。
# docker search 某个XXX镜像名字 指定搜索某个镜像的名称
# docker pull 某个XXX镜像名字 拉取指定的镜像到本地(下载镜像)
# docker system df 查看镜像/容器/数据卷所占的空间
# docker rmi 某个XXX镜像名字ID 删除某个镜像,注意:不能删除正在运行容器的镜像!
c
# docker restart 容器ID或者容器名 #重启容器
# docker stop 容器ID或者容器名 #停止容器
# docker kill 容器ID或容器名 #强制停止容器
# docker rm 容器ID #删除已停止的容器
c
# docker run -it ubuntu /bin/bash #启动容器
# docker top 容器ID 查看容器内运行的进程
# docker inspect 容器ID 查看容器内部具体细节命令
c
从容器内拷贝文件到主机上
# docker cp 容器ID:容器内路径 目的主机路径
导入和导出容器
# docker export 容器ID > 文件名.tar
通过ubuntu.tar.gz来导入一个新镜像
# cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
3、Docker镜像的底层原理
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(类似于JAVA中的Object类),可以制作各种具体的应用镜像。
Docker镜像的加载原理 :

- bootfs(引导文件系统)包含 bootloader 与内核,bootloader 负责引导内核。Linux 启动时加载 bootfs,它位于 Docker 镜像最底层,和常规 Linux 系统一致。内核加载完成后,内存控制权交给内核,bootfs 随即卸载。
- rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标
准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
设计分层的镜像就是为了复用,做到资源共享。所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
4、Docker容器数据卷
4.1、基本概念
容器卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷 。
数据卷是Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。为了能
保存数据在docker中我们使用卷。
4.2、数据卷的基本案例
bash
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it --privileged=true -v /tmp/hostData:/tmp/dockerData1 ubuntu /bin/bash
docker inspect 容器id #查看据卷是否挂载成功
容器的数据卷还可以被继承和共享:
bash
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
docker run -it --privileged=true --volumes-from u1 --name=u2 ubuntu /bin/bash