容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用”装”起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去,这其实是 PaaS 最理想的状态。
云计算服务类型
基础设施即服务IaaS
平台即服务(PaaS)
软件即服务(SaaS)
容器的本质是进程,容器就是未来云计算系统中的进程。
容器和虚拟机对比:
容器是应用程序层的抽象,将代码和依赖项打包在一起。多个容器可以在同一台计算机上运行,并与其他容器共享OS内核,每个容器在用户空间中作为隔离的进程运行。容器占用的空间少于VM,可以处理更多的应用程序,并且需要的VM和操作系统更少。
特性 虚拟机 容器
启动 分钟级 秒级
硬盘启动 一般为GB 一般为MB
性能 弱于 接近原生
系统支持量 一般几十个 单机支持上千个容器
docker基础概念:
Docker系统有两个程序:docker服务端和docker客户端
Docker服务端:
是一个服务进程,管理着所有的容器。
Docker客户端:
是docker服务端的远程控制器,可以用来控制docker的服务端进程。
docker的优势:
交付物标准化:
Docker是软件工程领域的”标准化”交付组件,最恰到好处的类比是”集装箱”。
集装箱将零散、不易搬运的大量物品封装成一个整体,集装箱更重要的意义在于它提供了一种通用的封装货物的标准,卡车、火车、货轮、桥吊等运输或搬运工具采用此标准,隧道、桥梁等也采用此标准。以集装箱为中心的标准化设计大大提高了物流体系的运行效率。
传统的软件交付物包括:应用程序、依赖软件安装包、配置说明文档、安装文档、上线文档等非标准化组件。
Docker的标准化交付物称为”镜像”,它包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。
一次构建,多次交付
类似于集装箱的”一次装箱,多次运输”,Docker镜像可以做到”一次构建,多次交付”。当涉及到应用程序多副本部署或者应用程序迁移时,更能体现Docker的价值。
应用隔离
集装箱可以有效做到货物之间的隔离,使化学物品和食品可以堆砌在一起运输。Docker可以隔离不同应用程序之间的相互影响,但是比虚拟机开销更小。
总之,容器技术部署速度快,开发、测试更敏捷;提高系统利用率,降低资源成本。
namespace
cgroups
rootfs
docker三大核心组件:
Docker 镜像 - Docker images
Docker 仓库 - Docker registeries
Docker 容器 - Docker containers
docker仓库:
用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。
公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。
库:registry
公有库:
Docker-hub Daocloud ali 网易蜂巢
私有库:
公司内部使用(自己部署)
分类:
操作系统名称 centos ubuntu
应用名称 nginx tomcat mysql
Tag:
表示镜像版本
Docker 镜像:
Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。
每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。下层那个镜像是上层镜像的父镜像。
镜像名称:
仓库名称+镜像分类+tag名称(镜像版本)
完整镜像名称:
docker.io/nginx:v1
docker.io/nginx:latest
daocloud.io/centos:6
镜像ID:
64位的id号
基础镜像:
一个没有任何父镜像的镜像,谓之基础镜像。
注意:
Registry中镜像是通过Repository来组织的,而每个Repository又包含了若干个Image。Registry包含一个或多个Repository
Docker 容器:
Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。
容器安装部署:
使用aliyun docker yum源安装新版docker
docker-ce
docker-ee
删除已安装的Docker
(注意:这个是可选项,如果系统中存在那么我们就删除)
[root@xingdian ~]# yum remove docker \
配置阿里云Docker Yum源
[root@xingdian ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 git
[root@xingdian ~]# yum-config-manager —add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装指定版本
查看Docker版本:
[root@xingdian ~]# yum list docker-ce —showduplicates
安装较旧版本(比如Docker 17.03.2) :
需要指定完整的rpm包的包名,并且加上—setopt=obsoletes=0
参数:
[root@xingdian ~]# yum install -y —setopt=obsoletes=0
docker-ce-17.03.2.ce-1.el7.centos.x86_64
docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
安装Docker新版本(比如Docker 19.03.0):
[root@xingdian ~]# yum install docker-ce-19.03.0.ce -y
或者
[root@xingdian ~]# yum install docker-ce -y
启动Docker服务
[root@xingdian ~]# systemctl enable docker
[root@xingdian ~]# systemctl start docker
查看docker版本状态
[root@xingdian ~]# docker -v
查看docker运行状态:
[root@xingdian ~]# docker info
仓库使用:
国内镜像站
https://www.daocloud.io
国外镜像站
https://hub.docker.com
镜像加速器
使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此 DaoCloud 推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问 Docker Hub 的速度,目前已经拥有了广泛的用户群体,并得到了 Docker 官方的大力推荐。
登录登出docker hub:
登录到自己的Docker register,需有Docker Hub的注册账号
[root@xingdian ~]# docker login
退出登录:
[root@xingdian ~]# docker logout
docker的镜像与容器的区别:
Docker镜像
假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的。这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态。
一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。
要列出本地所有有效的镜像,可以使用命令
[root@xingdian ~]# docker images
Docker容器
Docker容器可以使用命令创建:
[root@xingdian ~]# docker run imagename
它会在所有的镜像层之上增加一个可写层。这个可写层有运行在CPU上的进程,而且有两个不同的状态:运行态(Running)和退出态 (Exited)。这就是Docker容器。当我们使用docker run启动容器,Docker容器就进入运行态,当我们停止Docker容器时,它就进入退出态。当我们有一个正在运行的Docker容器时,从运行态到停止态,我们对它所做的一切变更都会永久地写到容器的文件系统中。要切记,对容器的变更是写入到容器的文件系统的,而不是写入到Docker镜像中的。我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身。如果对容器的底层镜像进行修改,那么当前正在运行的容器是不受影响的,不会发生自动更新现象。
64字符的十六进制的字符串来定义容器ID,它是容器的唯一标识符。容器之间的交互是依靠容器ID识别的,由于容器ID的字符太长,我们通常只需键入容器ID的前4个字符即可。当然,我们还可以使用容器名。
容器名称:
—name= Assign a name to the container
—为容器分配一个名字,如果没有指定,会自动分配一个随机名称
—docker run子命令的参数
容器命名方式:
1)使用UUID长命名(”f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778”)
2)使用UUID短命令(”f78375b1c487”)
3)使用Name(“xingdian”)
注意:
1.这个UUID标识是由Docker deamon生成的。
2.如果你在执行docker run时没有指定—name,那么deamon会自动生成一个随机字符串UUID。
3.但是对于一个容器来说有个name会非常方便,当你需要连接其它容器时或者类似需要区分其它容器时,使用容器名称可以简化操作。无论容器运行在前台或者后台,这个名字都是有效的。
4.如果在使用Docker时有自动化的需求,你可以将containerID输出到指定的文件中(PIDfile)类似于某些应用程序将自身ID输出到文件中,方便后续脚本操作。
—cidfile=””: Write the container ID to the file
镜像名称:
镜像是Docker最核心的技术之一,也是应用发布的标准格式。无论你是用docker pull image,或者是在Dockerfile里面写FROM image,下载镜像应该是Docker操作里面最频繁的动作之一了。
常说的”ubuntu”镜像其实不是一个镜像名称,而是代表了一个名为ubuntu的Repository,同时在这个Repository下面有一系列打了tag的Image,Image的标记是一个GUID,为了方便也可以通过Repository:tag来引用。
Registry中镜像是通过Repository来组织的,而每个Repository又包含了若干个Image。
• Registry包含一个或多个Repository
• Repository包含一个或多个Image
• Image用GUID表示,有一个或多个Tag与之关联
注意:
当一个镜像的名称不足以分辨这个镜像所代表的含义时,你可以通过tag将版本信息添加到run命令中,以执行特定版本的镜像。
[root@xingdian ~]# docker run ubuntu:14.04
名字空间:
namespace 空间隔离
cgroup 资源限制
rootfs 文件系统
名字空间是 Linux 内核一个强大的特性。每个容器都有自己单独的名字空间,运行在其中的应用都像是在独立的操作系统中运行一样。名字空间保证了容器之间彼此互不影响。
pid 名字空间
不同用户的进程就是通过 pid 名字空间隔离开的,且不同名字空间中可以有相同 pid。
net 名字空间
有了pid名字空间, 每个名字空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 名字空间实现的,每个 net 名字空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。
mnt名字空间
类似 chroot,将一个进程放到一个特定的目录执行。mnt 名字空间允许不同名字空间的进程看到的文件结构不同,这样每个名字空间 中的进程所看到的文件目录就被隔离开了。
uts 名字空间
UTS(“UNIX Time-sharing System”) 名字空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非主机上的一个进程。
user 名字空间
每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。
docker使用:
查看centos所有的镜像:
[root@xingdian ~]# docker search centos
凡是镜像大于100的显示出来,小于100的不显示
[root@xingdian ~]# docker search centos —stars=100
[root@xingdian ~]# docker search centos —filter=stars=100
OFFICIAL [OK]代表官方的
AUTOMATED [OK]代表完整的镜像
拉取镜像:
[root@xingdian ~]# docker pull centos
[root@xingdian ~]# docker pull daocloud.io/library/centos:7.8.2003
查看本地镜像:
[root@xingdian ~]# docker image list
[root@xingdian ~]# docker images
[root@xingdian ~]# docker image ls
查看镜像详情:
[root@xingdian ~]# docker image inspect 镜像id
删除镜像:
删除一个或多个,多个之间用空格隔开,可以使用镜像名称或id
[root@xingdian ~]# docker rmi daocloud.io/library/mysql
强制删除:—force
如果镜像正在被使用中可以使用—force强制删除
[root@xingdian ~]# docker rmi docker.io/ubuntu:latest —force
删除所有镜像:
[root@xingdian ~]# docker rmi $(docker images -q)
#-q查出所有id号
只查看所有镜像的id:
[root@xingdian ~]# docker images -q
启动容器并指定名为server并放后台运行
[root@xingdian ~]# docker run —name server -it -d centos:latest /bin/bash
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
[root@blackmed ~]# docker run -p 80:80 -v /data:/data -d nginx:latest
使用镜像nginx:latest以交互模式启动容器,容器内执行/bin/bash命令。
[root@blackmed ~]# docker run -it nginx:latest /bin/bash
参数:
• -v:文件映射,格式为:主机目录:容器目录
• -d: 后台运行容器,并返回容器ID;
• -i: 以交互模式运行容器,通常与 -t 同时使用;
• -p: 端口映射,格式为:主机(宿主)端口:容器端口
• -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
• —name=”nginx-lb”: 为容器指定一个名称;
• —dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
• —dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
• -h “mars”: 指定容器的hostname;
• -e username=”ritchie”: 设置环境变量;
• —cpuset-cpus=”0-2” or —cpuset-cpus=”0,1,2”: 绑定容器到指定CPU运行;
—privileged 以特权模式运行
查看容器
只查看运行状态的容器:
[root@xingdian ~]# docker ps
[root@xingdian ~]# docker ps -a
-a 查看所有容器
只查看所有容器id:
[root@xingdian ~]# docker ps -a -q
列出最近一次启动的容器
[root@xingdian ~]# docker ps -l
查看容器详细信息
[root@xingdian ~]# docker inspect 1fbf6
启动容器
[root@xingdian ~]# docker start name
关闭容器
[root@xingdian ~]# docker stop name
退出不关闭:
快捷键:ctrl +p+q
删除容器
[root@xingdian ~]# docker rm 容器id或名称
要删除一个运行中的容器,添加 -f 参数
根据格式删除所有容器:
[root@xingdian ~]# docker rm $(docker ps -a -q)
docker 参数:
-it:在终端运行
-d:放在后台运行
—name:指定容器启动后的名字
—hostname:指定容器内部的名字
-p:映射端口 例:999:8080 8080是容器对应的端口 999是映射到我们终端的可访问的端口,切记这个端口没有在使用
-v:映射目录,相当于docker与终端的一个共享目录 例 -v /opt:/opt
start:启动
stop:关闭
restart:重启
docker exec -it name/id :进入容器内
docker cp:复制内容容器内或终端内
rm:删除一个或多个容器,进行此操作前先关闭容器
rmi:删除镜像
ps:查看当前运行中的容器以及镜像
ps -a:查看当前运行与未运行的容器以及镜像
docker logs name/id:查看容器的日志情况
—privileged:以特权模式运行
docker images:查看所有镜像及对应信息
docker images -q:只查看每个镜像的id号
