Docker-容器服务 Container Service01(基础)

2017年9月10日14:20:57 发表评论 2,825 views
摘要

Docker容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。

广告也精彩

容器服务 Container Service01 (基础介绍)

Docker-容器服务 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
截图
Docker-容器服务 Container Service01(基础)
2)client截图
Docker-容器服务 Container Service01(基础)
提示:目前的版本是如果docker的服务端挂了,运行在docker上的所有容器都会挂掉
1.4.1 CLI 交互模型
Docker-容器服务 Container Service01(基础)

Docker的C/S模式
1.4.2 RemoteAPI交互模型Docker-容器服务 Container Service01(基础)

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的区别(图解)

Docker-容器服务 Container Service01(基础)

3.2 Docker与OpenStack区别

类别 Docker Openstack/KVM 结论
虚拟化 内核虚拟化【依赖linux操作系统】 硬件虚拟化【CPU】 docker与openstack相对的虚拟结构不同
部署难度 非常简单 组件多,部署复杂 因为平台都是在已有生产环境的情况下,进行改造,所以尽量选择侵入性比较小的容器技术
启动速度 秒级 分钟级 天下武功,为快不破
执行性能 与物理系统相近 VM会浪费资源 核心业务对服务SLA要求非常苛刻
镜像体积 容器镜像MB 虚拟机镜像GB 集群调整,体积越小,并发越大
管理效率 管理简单 相互依赖,管理复杂 方便管理,才能增加效率,可控性是企业核心竞争力
隔离性 完全隔离 隔离性可以保证环境一致性
可管理性 单进程,建议不开ssh服务 系统管理全面 VM在这方面更强
网络连接 相对弱 借助Neutron可以灵活组件各类网络架构 VM在这方便更强,docker需要借助iptables或者第三方工具flanneld

四、Docker能做什么?

Docker-容器服务 Container Service01(基础)

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

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加速器【国内源】

国内docker镜像网站

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

systemctl restart docker      #重启生效

Docker-容器服务 Container Service01(基础)
配置检查

docker info  #查看镜像是否生效

Docker-容器服务 Container Service01(基础)

七、Docker基础命令

Docker-容器服务 Container Service01(基础)

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

Docker-容器服务 Container Service01(基础)

7.5删除镜像

    [root@linux-node1 ~]# docker rmi 3f8a4339aadd

Docker-容器服务 Container Service01(基础)
提示:如果镜像已经创建了一个容器,那么将无法进行删除

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
Docker-容器服务 Container Service01(基础)

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-容器服务 Container Service01(基础)

八、Docker 管理命令

1,创建容器常用选项

Docker-容器服务 Container Service01(基础)

2,Docker资源限制

Docker-容器服务 Container Service01(基础)

docker run -d --name nginx03 --memory="500m" --memory-swap="600m" --cpus="0.5" --oom-kill-disable nginx

docker stats c5a4cf8870da   #查看容器资源利用率

3,管理常用命令

Docker-容器服务 Container Service01(基础)

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精品交流群
  • weinxin
  • 微信公众号
  • weinxin
广告也精彩
admin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: