- 基础篇
- Docker简介
- Docker的来由
- Docker理念
- Docker平台架构 入门
- Docker平台架构 架构
- Docker安装
- Docker常用命令
- Docker镜像
- 本地镜像发布到阿里云
- 本地镜像发布到私有库
- Docker容器数据卷
- Docker常规安装简介
系统平滑移植,容器虚拟化技术
在docker出现之前,环境配置相当麻烦,换一台机器,就要重来一次,费时费力。Docker的诞生就是为了解决这个问题,安装的时候,把原始环境一摸一样地复制过来
在docker诞生前,开发团队需要清楚的告诉运维团队,用的全部配置文件+所有团建环境。不过,即便如此,仍然常常发生部署失败的情况。
Docker的出现使得Docker得以打破过去程序即应用的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上的打包,达到应用程式跨平台间的无缝接轨运作
一次镜像,处处运行
源码+运行环境+配置文件+第三方组件。。。 = 镜像
这样不同的电脑都安装一下docker下载上面说的镜像,就不会有各种环境问题导致不同的机器运行不了程序,docker的诞生最初的目的就是解决这个问题。只需要一次配置好环境,换到别的机器上就可以一键部署好,大大简化了操作
举个例子,就比如我在沈阳住在XX小区,现在我去了北京,我还想住在这个小区,于是我把小区原封不动的搬到了北京
docker是基于GO语言实现的云开源项目,docker的出现解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
Docker和传统虚拟化方式不同之处:
- 传统虚拟化技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在系统上再运行所需应用进程
- 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且页没有进行硬件虚拟。因此容器要比传统虚拟机更轻便
- 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源
Docker是内核级别虚拟化,其不像传统的虚拟化技术一样需要额外的系统支持,所以再一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率
Docker平台架构 入门镜像(image):
就是一个只读模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器
它也相当于是一个root文件系统,比如官方镜像centos:7就包含了一套完整的一套centos7最小系统的root文件系统
相当于容器的源代码,docker镜像文件类似于java的类模板,而docker容器实例类似于java中new出来的实例对象
容器(container):
1、从面向对象的角度
Docker利用容器独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器时用镜像创建的运行实例。就像是java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是互相隔离的、保证安全的平台
2、从镜像容器角度
可以把容器看作是一个简易版的linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序
仓库(repository):
仓库是集中存放镜像文件的场所
类似于
maven仓库,存放各种jar包的地方
github仓库,存放各种git项目的地方
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方
仓库分为公开仓库(Public)和私有仓库(Private)两种形式
最大的公开仓库是Docker Hub(https://hub.docker.com)
存放了数量庞大的镜像供用户下载,国内的公开仓库包括阿里云、网易云等
小总结:
Docker本身是一个容器运行载体或称之为管理引擎,我们把应用程序和配置依赖打包形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似java中new出来一个对象)
image文件可以看作是容器的模板。Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例
镜像文件:
image文件生成的容器实例,本身也是一个文件,称为镜像文件
容器实例:
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个应用的运行实例,也就是我们的容器
仓库:
就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库拉下来就可以了
docker的工作原理:
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket链接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。容器,是一个运行时环境,就是我们前面说到的集装箱
Docker是一个CS模式的架构,后端是一个松耦合架构,众多模块各司其职
Docker运行的基本流程为:
1、用户是使用Docker Client 与Docker Daemon建立通信,并发送请求给后者
2、Docker Daemon作为Docker架构中的主体部分,首先提供Docker Server的功能使其可以接受Docker Client的请求
3、Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个job的形式的存在
4、Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动Graph driver将下载镜像以Graph的形式存储
5、当需要Docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境
6、当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec driver来完成
7、Libcontainer是一项独立的容器管理包,network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作
官网上有,需要注意的是,在配置镜像仓库的时候,选择国内仓库,阿里或者网易
这里引出一个问题,为什么说docker运行比虚拟机快?
- docker有着比虚拟机更少的抽象层
- docker利用的是宿主机的内核,而不需要加载操作系统OS内核
三大类命令:
1、帮助启动类命令
// 启动
systemctl start docker
// 停止
systemctl stop docker
// 重启
systemctl restart docker
// 查看docker状态
systemctl status docker
// 开机启动
systemctl enable docker
// 查看docker概要信息
docker info
// 查看docker总体的帮助文档
docker --help
// 查看docker命令帮助文档
docker 具体命令 --help
2、镜像命令
// 列出本地主机上的镜像
// 参数:-a 列出本地所有的镜像;-q 只显示镜像ID
docker images
// 在远程仓库查找X镜像
// 参数:--limit
docker search X
// 从远程仓库拉取X镜像
docker pull X
// 查看镜像、容器、数据卷所占用的空间
docker system df
// 删除X镜像
// 参数:-f 删除多个镜像
// 组合命令,删除所有镜像 docker rmi -f ${docker images -qa}
docker rmi X
// 列出本地主机上的镜像
docker images
// 上传容器成为镜像
docker commit -m='信息' -a='作者' 容器ID 要创建的目标镜像名:[标签名]
docker push
3、容器命令
// 新建+启动容器x
// 参数(options):
// --name='容器的新名字' 为容器指定一个名称
// -d 后台运行容器并返回容器ID,也即启动守护式容器(后台运行)
// -i 以交互模式运行容器,通常与-t同时使用;也就是启动交互式容器
// -t 返回一个终端
// -P 随机端口映射,大写的P
// -p 指定端口映射,小写的p
docker run 参数 x
docker run -it ubuntu /bin/bash
// 查看正在运行的容器
// 参数:
// -l 显示最近创建的一个实例容器
// -n 显示最近n个创建的容器
// -q 静默模式,只显示容器编号
// -a 列出当前所有的正在运行的容器+历史上运行过的
docker ps
// 退出容器
exit run进去容器,exit退出,容器停止
ctrl+p+q run进去容器,ctrl+p+q退出,容器不停止
// 启动已经停止运行的容器
docker start 容器ID
// 重启容器
docker restart 容器ID
// 停止容器
docker stop 容器ID
// 强制停止容器
docker kill 容器ID
// 删除已停止容器
docker rm 容器ID
// 删除正在运行的容器
docker rm -f 容器ID
// 启动守护式容器(后台服务器)
docker run -d 容器ID
// 查看容器日志
docker logs 容器ID
// 查看容器内部细节
docker inspect 容器ID
// 进入正在运行的容器并以命令行交互
// attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止
// exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止
docker exec -it 容器ID /bin/bash
docker attach 容器ID
// 从容器内拷贝文件到主机
docker cp 容器ID:容器内路径 目的主机路径
// 导入和导出容器
docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
Docker镜像
镜像
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需要的所有内容,我们把应用程序和配置依赖打包形成一个可交付的运行时环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行时环境就是image镜像文件
只有通过这个镜像文件才能生成docker容器示实例
UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交,来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统时Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理:
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS
bootfs主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层时引导文件系统bootfs。这一层与我们典型的linux/unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权由bootfs转交给内核,此时系统也会卸载bootfs
rootfs,在bootfs之上,包含的就是典型linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如ubuntu,centos等
镜像分层最大的一个好处就是共享资源,方便负责迁移,就是为了复用
比如说有多个镜像都从相同的base镜像构建而来,那么Docker Host只需要在磁盘上保留一份base镜像;同时内存中也只需要加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享
Docker镜像层都是只读的,容器层是可写的
当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作‘容器层’,‘容器层’之下的都叫‘镜像层’
登录阿里云,设置命名空间后会生成三条命令,依次执行即可
1、先通过账号密码连接阿里云
2、把镜像上传到本地成为容器
3、将容器发布到阿里云服务器
Docker Registry 用于构建私有仓库
拉取registry用于搭建私服
docker pull registry
运行私有库registry,相当于本地有个私有Docker hub
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry – privaileged=true registry
创建一个新镜像,例如ubuntu安装ifconfig命令
docker pull ubuntu
docker run -it ubuntu /bin/bash
apt-get install net-tools
将容器提交成为本地的镜像
docker commit -m=‘’ -a=‘’ 容器ID 容器名字:tag
curl验证私服库上有什么镜像
curl -XGET http://ip:5000/v2/_catalog
将新镜像修改符合私服规范的tag
docker tag ubuntu:1.2 ip:5000/ubuntu:1.2
修改配置文件使之支持http
vim /etc/docker/daemon.json
{
“registry-mirrors”:[“http://aa25jngu.mirror.aliyuncs.com”],
“insecure-registries”:[“ip:5000”]
}
docker默认是不允许http方式推送镜像的,通过上述修改,重启docker
push推送到私服库
docker push ip:port/容器名字
curl验证私服库上有什么镜像
curl -XGET http://ip:5000/v2/_catalog
pull到本地并运行
docker pull ip:port/镜像名字:tag
启动容器添加权限扩容
–privileged=true
容器数据卷的方式完成数据的持久化
映射,容器内的数据备份+持久化到本地
命令
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了,为了能保存数据在docker中,我们使用数据卷的方式持久化,说白了就是将容器中的数据映射到指定位置保存
特点:
1、数据卷可以在容器之间共享或重用数据
2、卷中的更改可以直接实时生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止
宿主机和容器之间映射添加容器卷
docker run -it --privileged=true -v /宿主机绝对路径:/容器内目录 镜像名
查看数据卷是否挂载成功
docker inspect 容器ID
数据卷内容修改:
1、主机修改,docker同步获得
2、docker修改,主机同步获得
3、docker容器stop,主机修改,docker容器重启后自动同步
设置容器只读
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 (ro表示read only)
数据卷的继承和共享
docker run -it --privaileged=true --volumes-from 父类 --name u2 ubuntu
常规安装流程
- 搜索镜像
- 拉取镜像
- 查看镜像
- 启动镜像
- 停止容器
- 移除容器
在实际开发中的应用方式
mysql: 挂载数据卷(log,data,conf) docker run -d -p 3306:3306 --privileged=true -v /zzyyuse/mysql/log:/var/log/mysql -v /zzyyuse/mysql/data:/var/lib/mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7 修改mysql的配置文件,设置utf-8编码 vim /zzyyuse/mysql/conf/my.cnf character_set_server=utf-8 redis: docker run -p 6379:6379 --name myr3 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
至此,docker的基础知识,已经学习完成



