容器服务 Container Service01 (基础介绍)
一、LXC介绍
LXC为Linux Container的简写。
Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。
1)与传统虚拟化技术相比,它的优势在于:
与宿主机使用同一个内核,性能损耗小;
不需要指令级模拟;
不需要即时(Just-in-time)编译;
容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
避免了准虚拟化和系统调用替换中的复杂性;
轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。
总结:Linux Container是一种轻量级的虚拟化的手段。
二、什么是docker?
Docker是**Docker.lnc**公司开源的一个基于LXC技术之上构建的Container**容器引擎**,源代码托管在Github上,基于Go语言并遵从**Apache2.0协议**开源
Docker是通过**内核虚拟化**技术(namespaces及cgroups等)来提供容器的**资源隔离与安全保障**等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,**提高资源利用率**;
1.2、Docker的三大理念
构建 运输 运行
1.3、Docker组成
Docker的组成部分docker类似于**CS**结构
Docker Client
Docker Server
** 自我理解:docker的启动就像server端,我们执行命令就像client端
**1)server截图
2)client截图
提示:目前的版本是如果docker的服务端挂了,运行在docker上的所有容器都会挂掉
1.4.1 CLI 交互模型
Docker的C/S模式
1.4.2 RemoteAPI交互模型
Docker的C/S模式-RemoteAPI
三、Docker组件介绍
2.1镜像(Image)
类似于系统镜像,我们要启动docker就需要镜像,与vm组成不同,但类似;
2.2容器(Container)
容器可以理解为运行在linux上的一个进程,我们可以对容器进行增、删、改、查,有隔离性,但没有vm隔离性高
2.3仓库(Repository)
仓库就是存放docker镜像的地方,就像github统一存储一样,docker也有dockerhub,就像官网提供的公共仓库,蛮方便;
三、docker与其他产品的区别
3.1虚拟机和docker的区别(图解)
3.2 Docker与OpenStack区别
类别 | Docker | Openstack/KVM | 结论 |
---|---|---|---|
虚拟化 | 内核虚拟化【依赖linux操作系统】 | 硬件虚拟化【CPU】 | docker与openstack相对的虚拟结构不同 |
部署难度 | 非常简单 | 组件多,部署复杂 | 因为平台都是在已有生产环境的情况下,进行改造,所以尽量选择侵入性比较小的容器技术 |
启动速度 | 秒级 | 分钟级 | 天下武功,为快不破 |
执行性能 | 与物理系统相近 | VM会浪费资源 | 核心业务对服务SLA要求非常苛刻 |
镜像体积 | 容器镜像MB | 虚拟机镜像GB | 集群调整,体积越小,并发越大 |
管理效率 | 管理简单 | 相互依赖,管理复杂 | 方便管理,才能增加效率,可控性是企业核心竞争力 |
隔离性 | 高 | 完全隔离 | 隔离性可以保证环境一致性 |
可管理性 | 单进程,建议不开ssh服务 | 系统管理全面 | VM在这方面更强 |
网络连接 | 相对弱 | 借助Neutron可以灵活组件各类网络架构 | VM在这方便更强,docker需要借助iptables或者第三方工具flanneld |
四、Docker能做什么?
4.1 简化配置
保留了VM虚拟化的优点,在所有主机上都可以运行docker来快速部署,并且可以把配置部署与开发代码一同上线;
4.2 完善流水线(pipeline)管理
从本地开发-测试环境-预生产环境-灰度环境-生产环境,经过多次调试,开发总会说 “在我这可以啊,怎么到线上就不行了呢”,大多数原因就是环境不统一造成,使用docker就可以解决这个问题;
4.3 提高开发效率
发开效率与两点有密切关系,1就是测试环境尽量贴近生产环境 ,2减少发开环境部署这个步骤,docker占用的资源相对低很多,所以很轻松的就可以跑几十个服务
4.4 隔离应用
多个应用环境在一起开发时,可能会先各种坑,主要是隔离的问题
4.5 整合服务器
docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案
4.6 调试能力
Docker提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。你可以在《Docker拯救世界》的文章中找到这一点的例证。
4.7 多租户环境
另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的 例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间, 也浪费金钱。
使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff命令。
4.8 快速部署 **
在虚拟机之前,引入新的硬件资源需要消耗几天的时间。Docker的虚拟化技术将这个时间降到了几分钟,Docker只是创建一个容器进程而无需启动操作系统,这个过程只需要秒级的时间。这正是Google和Facebook都看重的特性。你可以在数据中心创建销毁资源而无需担心重新启动带来的开销。通常数据中心的资源利用率只有30%,通过使用Docker并进行有效的资源分配可以提高资源的利用率。
小结: 一句话说明docker的本质就是 低开销(系统文件、内存 共用)的虚拟机
五、Docker改变了什么?
面向产品:产品交付
面向开发:简化环境配置
面向测试:多版本测试
面向运维:环境一致
面向架构:自动化扩容(微服务)
六、 Centos 7 安装 Docker
6.1、环境
[root@linux-node1 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@linux-node1 ~]# uname -r
3.10.0-693.el7.x86_64
6.2、安装
准备说明
1、centos7 主机3台(推荐2C4g,最低1c1g)
2、关闭防火墙、SELINUX[会就加策略]
setenforce 0 #临时关闭,不需要重启
systemctl stop firewalld
systemctl disable firewalld
3、做好主机名解析,即三台虚拟机能ping通彼此的主机名
hosts文件参考
192.168.56.11 k8s-master
192.168.56.12 k8s-node1
192.168.56.13 k8s-node2
4、时间同步(很重要)
*/5 * * * * /usr/sbin/ntpdate 1.cn.pool.ntp.org >/dev/null 2>&1
5,部署docker
#安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加docker 最新源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# yum安装
yum install docker-ce -y
systemctl enable docker.service
systemctl start docker.service
最新版本我们可以去官方网站进行下载。
温馨提示:使用docker最好使用最新版,因为功能比较完善
6.3 配置docker加速器【国内源】
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
systemctl restart docker #重启生效
配置检查
docker info #查看镜像是否生效
七、Docker基础命令
7.1查看当前镜像
[root@linux-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fluent/fluentd latest 5174335bf8fc 5 days ago 35.6MB
busybox latest f9b6f7f7b9d3 7 days ago 1.14MB
mysql latest f008d8ff927d 7 days ago 409MB
alpine latest 3fd9065eaf02 13 days ago 4.15MB
centos latest ff426288ea90 2 weeks ago 207MB
nginx latest 3f8a4339aadd 3 weeks ago 108MB
sebp/elk latest b0dc4bffd033 4 weeks ago 1.07GB
aclstack/mem latest 61eec139308f 4 months ago 21.9MB
progrium/consul latest 09ea64205e55 2 years ago 69.4MB
7.2搜索镜像
执行docker search centos 会从dockerhub上搜索镜像
[root@linux-node1 ~]# docker search centos
##docker search [镜像名字]
7.3 下载镜像
我们可以使用docker pull centos **/ **docker pull nginx来安装centos和nginx的镜像
导出镜像
docker save -o [镜像名称] [镜像]
[root@linux-node1 ~]# docker save -o nginx.tar nginx
[root@linux-node1 ~]# ls
10 anaconda-ks.cfg nginx.tar
需要将docker导出为tar,后面为镜像名称,默认保存在当前路径
7.4 导入镜像
[root@linux-node1 ~]# docker load < nginx.tar
7.5删除镜像
[root@linux-node1 ~]# docker rmi 3f8a4339aadd
提示:如果镜像已经创建了一个容器,那么将无法进行删除
7.6 删除容器
1)正常删除镜像
[root@linux-node1 ~]# docker rm 4af3e9997f8f
2)强制删除(如果有容器在运行,并使用这个镜像)
[root@linux-node1 ~]# docker rm -f 4af3e9997f8f
7.7 运行容器
启动有2中方式:
docker run [镜像]
docker run [镜像] [命令参数]
[root@linux-node1 ~]# docker run centos
#Centos是镜像的名称,镜像的名称必须在选项的后面
#启动镜像,输入Hello,并关闭
[root@linux-node1 ~]# docker run centos /bin/echo 'Hello Word'
Hello Word
7.8 查看启动镜像
ps是显示正在运行的容器 -a是显示不运行的 -q显示ID
[root@linux-node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a64ea5e0666 centos "/bin/bash" 4 seconds ago Exited (0) 3 seconds ago vigorous_bhabha
我们可以看到,现在容器并没有启动。因为docker启动需要在前台启动一个进程。容器的名称可以我们指定或自动生成
提示: 管理docker容器可以通过名称也可以通过ID
7.9 docker默认端口(2379)需启动daemon模式
[root@linux-node1 ~]# netstat -lntup|grep dockerd
tcp 0 0 10.0.0.106:2375 0.0.0.0:* LISTEN 3714/dockerd
查看docker默认信息
[root@linux-node1 ~]# docker -H 10.0.0.106 info
八、Docker 管理命令
1,创建容器常用选项
2,Docker资源限制
docker run -d --name nginx03 --memory="500m" --memory-swap="600m" --cpus="0.5" --oom-kill-disable nginx
docker stats c5a4cf8870da #查看容器资源利用率
3,管理常用命令
cp 宿主机与docker进程拷贝
## docker 宿主机文件复制到容器中
[root@k8s-node2 yum.repos.d]# docker cp docker-ce.repo e219a2ce5e7e:/
[root@k8s-node2 yum.repos.d]# docker exec -it e219a2ce5e7e ls /
bin dev etc lib media opt root sbin sys usr
boot docker-ce.repo home lib64 mnt proc run srv tmp var
## docker 文件复制到宿主机
[root@k8s-node2 yum.repos.d]# docker cp e219a2ce5e7e:/docker-ce.repo /a
[root@k8s-node2 yum.repos.d]# ls /a
/a
九、Docker登陆及nsente工具介绍
例如:我要新建一个qiuyuetao的容器,它的镜像是centos.他有三个参数,第一个是给容器起一个名称,-t 分配一个伪终端(tty)-i标准输入打开,我要在里面输入命令
[root@linux-node1 ~]# docker run -it --name qiuyuetao centos /bin/bash
[root@d89fb8a7957b /]# 现在已经等了到容器里呢
--name 容器的名称
-t 让docker分配一个伪终端
-i 让docker的标准输入打开{input}
##此时不能使用exit 退出,否则容器会退出,可以使用Ctrl+p+q快捷键进行退出
温馨提示:容器不是一个虚拟机,因为他就是一个进程,如果我们退出,这个进程就退出了,不能exit,使用Ctrl +p+q 组合键即可退出。
如果我们执行创建容器的时候,里面没有我们指定的镜像,那么他会从dockerhub上进行下载然后在启动
9.1 exec 主要解决不进入docker,但能在docker中执行命令
##exec 也能进入docekr
[root@linux-node1 ~]# docker exec -it d89fb8a7957b bash ##容器ID
提示:生产场景是不使用docker attach的,需要我们使用nsenter这个工具,这个工具包含在util-linux软件包里面
yum install util-linux ##安装nsenter工具
通过docker inspect来获取到第一个进程的pid
[root@linux-node1 ~]# docker inspect -f "{{ .State.Pid }}" qiuyuetao
3996
9.2 使用nsenter工具连接容器
[root@linux-node1 ~]# nsenter -t 3996 -m -u -i -n -p
[root@d89fb8a7957b /]#
[root@d89fb8a7957b /]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11776 1888 pts/0 Ss+ 09:25 0:00 /bin/bash
root 15 0.0 0.0 15180 1900 ? S 09:30 0:00 -bash
root 28 0.0 0.0 50852 1700 ? R+ 09:30 0:00 ps -aux
nsenter --target上面查到的进程id --mount --uts --ipc --net --pid #输入该命令便进入到容器中
解释nsenter指令中进程id之后的参数的含义:
* –mount参数是进去到mount namespace中
* –uts参数是进入到uts namespace中
* –ipc参数是进入到System V IPC namaspace中
* –net参数是进入到network namespace中
* –pid参数是进入到pid namespace中
* –user参数是进入到user namespace中
保证容器中有多个进程存在,不会因为exit造成容器暂停
9.3 nsenter工具脚本登陆【自动化docker】
脚本内容如下:
[root@linux-node1 ~]# cat docker_in.sh
#!/bin/bash
# Use nsenter to access docker
docker_in(){
NAME_ID=$1
PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)
nsenter -t $PID -m -u -i -n -p
}
docker_in $1
执行结果如下:
[root@linux-node1 ~]# chmod +x docker_nsenter.sh
[root@linux-node1 ~]# ./docker_nsenter.sh qiuyuetao
[root@d89fb8a7957b /]# #使用脚本登陆到容器内
9.4 当然使用exec 也可以不进入容器去看
[root@linux-node1 ~]# docker exec -it d89fb8a7957b ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11776 1888 pts/0 Ss+ 09:25 0:00 /bin/bash
root 73 0.0 0.0 47448 1664 pts/1 Rs+ 09:41 0:00 ps aux
基础内容就先介绍到这,后续会在使用方面更深入的了解
- QQ精品交流群
-
- 微信公众号
-