什么是docker
Docker 是一个开源的应用容器引擎,基于 LCX容器技术使用Go 语言开发 并遵从 Apache2.0 协议开源源码在Github上。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 包括三个基本概念:
-
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
-
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
-
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker就算一种快速解决生成问题的一种技术手段、运行和部署应用程序的开放管理平台。
开发人员能利用docker开发和运行应用程序
运维人员能利用docker部署和管理应用程序
为什么使用docker
对于开发和运维人员来说,最希望的效果就是一次创建或者配置后,可以在任意地方、任意时间让应用正常运行,对于算法研究人员来说,可能不同的算法需要不同版本的软件,那么在同一个环境中就会存在冲突,docker 的环境隔离就可以很方便的用于不同环境的配置。具体来说,docker优势主要有以下几个方面:
-
快速交付和部署
使用docker,开发人员可以使用镜像快速构建一套标准的开发环境;开发完成后,测试和运维人员可以使用完全相同的环境部署代码,只要是开发测试过的代码就可以确保在生产环境无缝运行。docker可以快速创建和删除容器,实现快速迭代。
-
高效的资源利用
运行docker容器不需要额外的虚拟化管理程序的支持,docker是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。
-
轻松的迁移和扩展
docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、服务器等,同时支持主流的操作系统发行版本,这种兼容性让用户可以在不同平台间轻松的迁移应用。
-
简单的更新管理
使用Dockerfile生成镜像的方式,只需要小小的配置修改,就可以替代以往大量的更新工作,所有的修改都以增量的方式进行分发和更新,从而实现自动化且高效的容器管理。
Docker主要解决的问题
1、解决了运行环境不一致所带来的问题,Docker会将配置文件进行统一管理;
2、解决耗内存问题,Docker会一开始就为每个程序指定内存分配;
3、让快速扩展,弹性伸缩变得简单
剖析Docker架构
通过前面启动Tomcat容器的过程,我们可以看到Docker三大组件的身影:
- 镜像(image)
- 容器(container)
- 仓库(repository)
让我们来看看Docker的架构图
Docker 采用 (C/S) 架构模式的应用程序
Client dockerCLI:客户端docker命令行
RESTAPI:一套介于客户端与服务段之间进行通信并指示其执行的接口
Server docker daemon:服务端dacker守护进程等待客户端发送命令来执行
Docker 核心技术
IMAGE-镜像
CONTAINER-容器
DATA VOLUMES-数据卷
NETWORK-网络
Docker客户端(docker client)
Docker客户端是用户与Docker进行交互的最主要方式当在终端输入dockers命令时,对应的就会在服务端产生对应的作用,并把结果返回给客户端。Docker Client除了连接本地服务端,还可以通过更改或者指定DOCKER_HOST连接远程服务端。
Daocker服务端(docker daemon)
docker daemon就是Docker的服务端,它负责监听DockerApi(Docker Client)请求并管理Docker对象(Docker Server),如镜像、容器、网络、数据卷等
docker registry
俗称Docker仓库,专门用于存储镜像的云服务环境。
Docker Hub就算一个公共存放镜像的地方,类似于GitHub存储代码文件。同样的也可以类似GitHub那样搭建私有的仓库。
Docker对象(Docker Objects)
镜像:一个Docker的可执行文件,其中包括应用程序所需要的所有代码内容、依赖库、环境变量和配置文件等。
容器:镜像被运行起来后的实例
网络:外部或者容器间如何互相访问的网络方式,如host方式
数据卷:容器和主机之间、容器和容器之间共享存储方式类似于虚拟机和主机之间的共享文件目录
官方资料
Docker官网:https://www.docker.com/
Github Docker源码:
https://docker-doc.readthedocs.io/zh_CN/latest/
Docker 的设计特点包括如下:
-
轻量
在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核;能快读的启动,而只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件,这样就能尽量降低磁盘用量,并能更快地下载镜像;
-
标准
Docker 容器基于开放式标准,能够在所有主流 Linux 版本、Microsoft Windows 以及包括 VM、裸机服务器和云在内的任何基础服务设施上运行;
-
安全
Docker 赋予应用隔离性,不仅仅限于彼此隔离,还独立于底层的基础设施。Docker 默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。
优点
启动快比虚拟机 , 可以秒级启动
对资源占用小 , 宿主机上可运行千台容器
方便用户获取 , 分布 , 和更新应用镜像 , 指令简单 , 学习费用低
通过 Dockerfile 配置文件来灵活的自动创建和部署镜像 & 容器 , 提高工作效率
Docker 除了运行其中应用外 , 基本不消耗其他系统资源 , 保证应用性能同时 ,尽量减小系统
缺点
隔离性
基于hypervisor的虚机技术,在隔离性上比容器技术要更好,它们的系统硬件资源完全是虚拟化的,当一台虚机出现系统级别的问题,往往不会蔓延到同一宿主机上的其他虚机。但是容器就不一样了,容器之间共享同一个操作系统内核以及其他组件,所以在收到攻击之类的情况发生时,更容易通过底层操作系统影响到其他容器。当然,这个问题可以通过在虚机中部署容器来解决,可是这样又会引出新的问题,比如成本的增加以及下面要提到的问题:性能。
性能
不管是虚机还是容器,都是运用不同的技术,对应用本身进行了一定程度的封装和隔离,在降低应用和应用之间以及应用和环境之间的耦合性上做了很多努力,但是随机而来的,就会产生更多的网络连接转发以及数据交互,这在低并发系统上表现不会太明显,而且往往不会成为一个应用的瓶颈(可能会分散于不同的虚机或者服务器上),但是当同一虚机或者服务器下面的容器需要更高并发量支撑的时候,也就是并发问题成为应用瓶颈的时候,容器会将这个问题放大,所以,并不是所有的应用场景都是适用于容器技术的。
存储方案
容器的诞生并不是为OS抽象服务的,这是它和虚机最大的区别,这样的基因意味着容器天生是为应用环境做更多的努力,容器的伸缩也是基于容器的这一disposable特性,而与之相对的,需要持久化存储方案恰恰相反。这一点docker容器提供的解决方案是利用volume接口形成数据的映射和转移,以实现数据持久化的目的。但是这样同样也会造成一部分资源的浪费和更多交互的发生,不管是映射到宿主机上还是到网络磁盘,都是退而求其次的解决方案。
Docker官网
https://docs.docker.com/engine/install/centos/
Centos7上安装Docker
确定你是Centos7及以上版本
cat /etc/redhat-release
卸载旧版本
sudo yum remove docker / docker-client / docker-client-latest / docker-common / docker-latest / docker-latest-logrotate / docker-logrotate / docker-engine
yum安装gcc相关
yum -y install gcc yum -y install gcc-c++
安装需要的软件包
yum install -y yum -utils
使用阿里云服务器要再加上一步才可以设置镜像
yum install -y yum-utils device-mapper-persistent-data lvm2
设置stable镜像仓库
sudo yum-config-manager / --add-repo / https://download.docker.com/linux/centos/docker-ce.repo
设置阿里云镜像
yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件包索引
yum makecache fast
安装DOCKER CE
sudo yum install docker-ce docker-ce-cli containerd.io
启动如果没有报错说明没有问题
systemctl start docker
查看后台服务
ps -ef |grep docker
测试
docker version
docker run hello-world
卸载
systemctl stop docker yum remove docker-ce docker-ce-cli containerd.io rm -rf /var/lib/docker rm -rf /var/lib/containerd
镜像加速器配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://l3su1l19.mirror.aliyuncs.com"] } EOF
sudo systemctl daemon-reload sudo systemctl restart docker
为什么Docker会比vm虚拟机快
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
2.容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
3.每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
1.docker 有着比虚拟机更少的抽象层
由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接试用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显的优势。。
2.docker利用的是宿主机的内核,而不需要加载操作系统的OS内核
当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建的过程时分钟级别的,而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。
帮助启动类命令
启动docker: systemctl start docker 停止docker: systemctl stop docker 重启docker: systemctl restart docker 查看docker状态: systemctl status docker 开机启动: systemctl enable docker 查看docker概要信息: docker info 查看docker总体帮助文档: docker --help 查看docker命令帮助文档: docker 具体命令 --help
原本的docker源:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
换成了阿里的:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
但是问题也就出现在这里了,
但我使用sudo systemctl enable docker命令的时候
给我报了这个
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
最后知道了,因为我在使用源的时候,执行了这个
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
但是如果我们换成了阿里的之后,这个并没有先操作!
因此如果我们换了了阿里云之后,还是必须执行这个命令
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
然后就能解决这个报出来了问题了.
镜像命令
docker images
- 列出本地主机上的镜像: docker images
各个选项说明:
- REPOSITORY:表示镜像的仓库源 TAG:镜像的标签版本号 IMAGE ID:镜像ID CREATED:创建时间 SIZE:镜像大小
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像 同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
OPTIONS说明:
- -a :列出本地所有的镜像(含历史映像层)
-q :只显示镜像ID
- docker search [OPTIONS] 镜像名
OPTIONS说明:
- –limit : 只列出N个镜像,默认25个
docker search 某个xxx镜像的名字
实例
从 Docker Hub 查找所有镜像名包含 java,并且收藏数大于 10 的镜像
OPTIONS说明:
-
–automated :只列出 automated build类型的镜像;
-
–no-trunc :显示完整的镜像描述;
-
-f <过滤条件>:列出收藏数不小于指定值的镜像。
参数说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
docker pull 某个xxx镜像的名字 从镜像仓库中拉取或者更新指定镜像
OPTIONS说明:
-
-a :拉取所有 tagged 镜像
-
–disable-content-trust :忽略镜像的校验,默认开启
docker pull 镜像名字[:TAG]
docker pull 镜像名字
1.没有TAG就算最新版
2.等价于
3.docker pull 镜像名字:latest
4.docker pull ubuntu
docker system df 查看镜像/容器/数据卷所占用的空间
如果你想检查 Docker 使用了多少空间,你可以使用内置命令 docker system df,以及 Linux 命令du 来获取整个目录的大小。
docker system df
sudo du -sh /var/lib/docker/
此命令显示静态映像、对其文件系统(例如日志文件)进行了更改的容器以及绑定到容器的卷。
然而,这并不完全准确——在这里,我运行了许多容器,但它们都将数据存储在主机操作系统上的绑定安装中,而不是卷中。
docker rmi 查看xxx镜像名字的id
docker rmi : 删除本地一个或多个镜像。
OPTIONS说明:
-
-f :强制删除;
-
–no-prune :不移除该镜像的过程镜像,默认移除;
删除单个镜像
docker rmi -f 镜像ID
删除多个镜像
docker rmi -f 镜像命1.TAG镜像名2:TAG
删除全部
docker rmi -f ${docker images -qa}
有镜像才可以创建容器这是根本前提
docker pull centos docker pull nbuntu
OPTIONS说明(常用):有些是一个减号,有些是两个减号
–name=”容器新名字” 为容器指定一个名称
-d:后台运行容器并返回容器ID:也既守护式容器(后台运行)
-i:以交互模式运行容器,通常与+t同时使用:
-t:为容器重新分配一个输入终端,通常与+i同时使用:
也即可启动交互式容器(前台有伪终端,等待交互)
-P:随机端口映射,大写P
-p:随机端口映射,小写p
原创文章,作者:端木书台,如若转载,请注明出处:https://blog.ytso.com/270236.html