一、虚拟化实现形式
1、主机级虚拟化
- 虚拟的是整个物理机的完整平台,可以和底层宿主机的操作系统完全不同;如VMware Workstation
- 两种类型实现:
- 类型1虚拟化:如:VMware Workstation;直接在硬件的基础上安装一个虚拟机管理器,即主机操作系统全部运行在虚拟
文章来源(Source):浅时光博客 机内部,不会直接与硬件打交道 - 类型2虚拟化:在硬件之上安装一个虚拟机管理软件(vmm)
- 类型1虚拟化:如:VMware Workstation;直接在硬件的基础上安装一个虚拟机管理器,即主机操作系统全部运行在虚拟
2、容器级虚拟化
- 首先有底层平台—-用户部署操作系统(内核+用户空间:用户空间里跑进程;内核的核心作用:资源分配和管理)

2.1:功能实现
在一个虚拟机中运行2个相同的套接字进程(如两个80端口,同一个Ip的Nginx
多个不同的虚拟机共享同一个宿主机(物理机)的硬件资源;
进程运行在用户空间,多个进程运行在不同的用户空间,多个用户空间隔离,然后多个用户空间共享同一个内核空间。用户空间给进程提供运行环境且保证内部进程不受其他进程的干扰,这就是容器技术
最早出现在Free BSD中,早期叫jail(监禁),目的是运行一个进程不受其他环境干扰,保证应用的安全运行;后期将此技术复制到Linux平台,叫做vserver(chroot,功能实现:切根);
一个用户空间的主要目的是为了实现隔离环境,一个应用运行在此用户空间中它就是唯一运行在当前内核之上 用户空间中的进程。
一个用户空间包括:主机名域名(UTS)、文件系统(挂载数;Mount)、IPC(进程之间通信专用通道)、PID(进程标识符)、Net
每一个用户空间中每一个进程同属于某一个进程(它们的”父进程”);如果没有父进程,此进程即为该用户空间的INIT;一个系统运行包括:进程数和文件系统数;由于INIT进程只有一个,所以必须给每个用户空间做个假INIT进程
所谓的init
进程,它是一个由内核启动的用户级进程。内核会在过去曾使用过init
的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init
。
一个内核空间上只能有一个root,每个用户空间上也有个root (此root只可以在当前用户空间中有超级权限,如果放在宿主机上此root即是一个普通用户)
- 注意:要想运行容器技术,Linux内核必须在3.8及以上;Centos6内核为2.6不可使用
2.2:核心技术
- chroot(Change Root)
chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 `/` 位置。
- 名称空间:Namespaces
CPU属于压缩资源,如果CPU不够那么此应用进程挂起,等待CPU释放;内存属于非压缩型资源,如果内存不够那就导致OOM kill(OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”)
- cgroups (Control Groups)
- 容器技术是Linux内核中的技术
- LXC:LinuX Container—-简化了容器技术的实现
lxc-create
:可以用此命令快速创建一个用户空间;template(模板)
:也就是一个脚本实现用户空间的安装- Docker即为LXC的增强版
- LXC:LinuX Container—-简化了容器技术的实现
- Docker功能实现原理:
利
- Docker与LXC的区别:
Docker是一个容器只运行一个进程,而LXC是一个容器当一个用户空间(似虚拟机一样)运行N个进程
- 容器给运维带来了极大的不便利,而给开发带来了极大的便利,一次变更可适用于更多容器环境
- 对于开发
- 1. 降低了软件开发的成本和难度,以往程序员在多环境下开发和分发部署是极其麻烦和困难的
- 2. 真正做到了一次编译多次运行(开发的程序打包成一个docker镜像),从而开发工程师无需针对不同环境,不同系统类型进行开发单独的版本
- 对于运维
- 1. 由于每个容器都有单独的进程进行运行,而这些进程都是运行在自己所属的名称空间中,如果出现问题,进行调试则需要这些名称空间中自带的工具进行调试才行(运行时才需要启动调试工具的进程);之前进行调试只需要使用ps等命令即可查看每个进程的运行情况,而现在如果想要对容器进行调试则需要先进入该容器中并且该容器中存在调试工具才可以进行调试
- 2. 如果真正管理好容器则需要容器编排工具。如果完全靠手动去管理容器比去管理单个应用程序复杂的多
- 对于开发
- Docker镜像实现之构建底层原理
分层构建联合挂载机制来实现:先做一个底层系统,如CentOS系统,基于CentOS之上装一个Nginx即为Nginx镜像(只包含Nginx本身,不包含CentOS);
底层是个CentOS,上一层是Nginx,两层组合即为运行在CentOS上的Nginx
存储:单独的外置共享存储池,实现持久化存储
2.3:容器编排工具
- Docker:machine+swarm+compose
- ASW:mesos+marathon
- kubernetes-k8s(k和s之间有8个字母)
- 谷歌、微软等公司成立了CNCF组织,容器开源的组织
- docker、k8s使用了Go语言研发
- docker后来研发了容器引擎:libcontainer,新版本docker引擎runC
二、Docker基础用法
1、runC:容器引擎
- OCI:Open Container Initiativ
- 由Linux基金会主导于2015年6月创立
- 旨在围绕容器格式和运行时制定一个开放的工业化标准
- OCF:Open Container Format
- 开放的容器格式
- 容器站点:Docker Hub
2、Docker架构
- C/S架构应用程序

- 客户端(Client)
- 注:Client端到Server端默认HTTPS/HTTP协议
- docke
文章来源(Source):浅时光博客 r build - docker pull
- docker run
- Server端(Docker_Host)
- Docker daemon:子程序、子命令;守护进程服务器;监听某个套接字(socket)之上,支持三种类型套接字:1、Ipv4套接字:ipv4+端口 2、Ipv6套接字: ipv6+端口 3、Unix Socketfile
- Containers:容器
- Images:镜像,镜像来自于Registry(Docker 仓库 dockerhub);从docker hub下载镜像默认使用HTTPS/HTTP协议(默认必须加
s
)
3、Docker版本
- Docker-ee:企业版
- Docker-ce:社区版
4、Docker组成
- 镜像:静态
- 容器:动态,有生命周期
5、Docker对象

三、安装及使用Docker
1、环境准备
- 依赖的基础环境:
- 64位CPU
- Linux kernel 3.10以上(Centos7刚好) , “Extras” repository
- 以下操作为如何下载Centos系统中默认的Docke镜像和下载Docke官方镜像;访问互联网镜像网站(以下为清华大学镜像网站);CentOS系统中默认docker由于版本比较老,不建议下载使用
1.1、进入清华大学镜像网站首页,找到docke-ce镜像

1.2、选择Linux版本

1.3、选择CentOS

1.原文链接:https://www.dqzboy.com 4、右键选择复制链接地址

1.5、登入Linux系统使用wget进行下载到系统中
[root@docker ~]# cd /etc/yum.repos.d/
[root@docker yum.repos.d]# wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
- 注意:下载下来的yum源中默认的地址为docker官方站点,可以手动更改yum源指定成国内的docker镜像网
原文链接:https://www.dqzboy.com 站
2、安装docker
2.1、替换yum源网址
- 将刚才下载下来的yun源,进行更改为清华大学中的docker-ce的地址 https://mirrors.tuna.tsinghua.edu.cn/docker-ce
[root@docker yum.repos.d]# vim docker-ce.repo
%s@https://download.docker.com/@https://mirrors.tuna.tsinghua.edu.cn/docker-ce/@

2.2、查看yum源
[root@docker yum.repos.d]# yum repolist
2.3、下载docker
[root@docker yum.repos.d]# yum -y install docker-ce
2.4、创建docker守护进程文件,并进行编辑加速器
- 镜像加速器(推荐阿里云)
- docker官方:docker cn—-加速效果不行
[root@docker ~]# mkdir /etc/docker
[root@docker ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://xxxxxx.docker-cn.com"]
}
2.5、启动docker
[root@docker ~]# # systemctl enable docker.service;systemctl start docker.service
- 查看docker详细信息
[root@docker ~]# docker info
Containers: 0 #当前系统中的容器数量
Running: 0 #其中运行状态的容器数量
Paused: 0 ##其中暂停状态的容器数量
Stopped: 0 #其中停止状态的容器数量
Images: 0 #镜像数量
Server Version: 18.09.2 #服务器版本
Storage Driver: overlay2 #存储驱动后端,专用的文件驱动
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: #插件
Volume: local #存储插件
Network: bridge host macvlan null overlay #网络插件
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog #日志插件
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9754871865f7fe2f4e74d43e2fc7ccd237edcbce
runc version: 09c8266bf2fcf9519a651b04ae54c967b9ab86ec
init version: fec3683
Security Options:
seccomp #安全
Profile: default
Kernel Version: 3.10.0-957.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 3.84GiB
Name: docker
ID: 35ZE:Y2HG:DYNW:4ZPK:OIZS:BDF6:6E5B:YOEL:7ZC2:LT5G:EE4D:FC2W
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://registry.docker-cn.com/ #刚才手动配置的加速镜像,表明加速正常
Live Restore Enabled: false
Product License: Community Engine
# 以上就表明docker安装完成并且可以正常启动,正常加速镜像
3、Docker使用
3.1、操作指令:
docker search
:搜索Docker Hub以获取图像docker pull
:从 Docker Hub 中拉取或者更新指定镜像。docker images
:列出镜像docker create
:创建一个新的容器docker start
:启动一个或多个已停止的容器docker run
:运行新容器docker attach
:进入到正在运行的容器docker ps
:列出容器docker logs
:获取容器的日志docker restart
:重新启动容器docker stop
:停止一个或多个正在运行的容器docker kill
:kill一个或多个正在运行的容器docker rm
:删除一个或多个容器
3.1.1:搜索镜像
- docker search: 搜索镜像
[root@docker ~]# docker search nginx
- 注意:带有斜杠的为用户仓库或者项目仓库,单独名称的为顶级仓库(官方仓库)

3.1.2:下载镜像
- docker pull: 下载镜像到本地pull(拉)
[root@docker ~]# docker image pull nginx:1.14-alpine
3.1.3:查看本地镜像
- docker images: 列出本地docker镜像 或者 docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
仓库名称 仓库标签 镜像ID号(唯一标识) 创建时间 镜像大小
[root@docker ~]# docker images ls --no-trunc #显示详细信息

3.1.4:创建容器
- docker create: 创建容器 或者
docker container create
3.1.5:列出本地容器
- docker ps: 列出所有容器 或者
docker container ls
3.1.6:启动容器
- docker run 镜像名: 启动容器
-
docker run -i 镜像名
:交互式访问 -
docker run -t 镜像名
:交互式接口 -
docker run --name 镜像名
: 启动时指定名称 -
docker run -d 镜像名
:启动时运行在后台
-
3.1.7:进入容器
- docker exec :在运行的容器中执行命令
- 语法:
docker exec [选项] 容器名 执行的命令 [ARG...]
- 语法:
- 选项说明:
-d
:分离模式: 在后台运行-i
:即使没有附加也保持STDIN 打开-t
:分配一个伪终端
3.1.8:列出本地网络
docker network ls
: 列出本地网络,容器启动不指定则默认bridge网段
[root@docker ~]# docker network ls //列出本地网络,默认加入bridge网络
- 任何启动的容器会应用docker0这个网络地址,这个网络是NET桥,自动映射的是ens33这个网络,可以访问外网,但是访问无法通过这个网络进来

3.1.9:删除镜像
docker image rm 镜像名
:删除一个镜像 或者 docker rmi 镜像名
docker image rm -f 镜像名
:强制删除镜像
3.2、启动容器:
- 语法:
docker run --name 容器名称 -it 镜像仓库名:标签
[root@docker ~]# docker run -it -d -p 8070:8080 --name web -v /root/software:/software --privileged=true 镜像名 /bin/bash
- 参数详解:
-it
创建一个交互式的容器-d
作为一个守护进程在后台运行-p
映射端口8070 本机的端口 映射的容器的端口--name
自定义容器名称-v
挂载目录/root/software(本地目录)到/software(容器目录),在创建前容器是没有software目录的,docker 容器会自己创建--privileged=true
关闭安全权限,否则你容器操作文件夹没有权限
3.3、停止容器:
[root@docker ~]# docker stop 容器名或容器ID
3.4、删除容器:
[root@docker ~]# docker rm 容器名或容器ID //容器停止后即可删除
3.5、举例测试:
- ps:启动一个redis
[root@docker ~]# docker run --name redis -d redis //本地没有会进行下载
[root@docker ~]# docker exec -it redis /bin/sh
#
# redis-cli
127.0.0.1:6379>
[root@docker ~]# docker stop redis
[root@docker ~]# docker rm redis

3.6、启动一个CentOS容器
3.6.1:下载CentOS7.6官方容器镜像
[root@docker ~]# docker pull centos:7.6.1810
#查看镜像
[root@fz-web ~]# docker images
#启动容器
[root@docker ~]# docker run -itd --name centos7 -p 32768:22 --privileged=true centos:7.6.1810 /usr/sbin/init
- 注意:这里启动如果不指定/usr/sbin/init 那么容器的sshd服务无法启动,报错如下:
Failed to get D-Bus connection: Operation not permitted
3.6.2:查看容器运行状态
[root@docker ~]# docker container ps
[root@docker ~]# lsof -i:32768
3.6.3:登入容器进行简单配置
[root@docker ~]# docker container exec -it CentOS7.6 /bin/bash
[root@507620b383d0 /]#
#修改容器ROOT密码
[root@507620b383d0 /]# passwd root
#安装ssh服务端和客户端
[root@507620b383d0 /]# yum -y install openssh-server openssh-clients
[root@507620b383d0 /]# yum install initscripts
#启动sshd服务
[root@507620b383d0 /]# systemctl start sshd
#安装ss命令
[root@507620b383d0 ~]# yum install iproute iproute-doc
#安装vim
[root@507620b383d0 /]# yum -y install vim
3.6.4:远程连接该容器
3.7:基于该容器制作镜像
- 语法:docker commit 当前运行的容器名/或容器ID 新镜像名:版本号
[root@docker ~]# docker container ps

[root@docker ~]# docker commit 507620b383d0 ypcentos7.6:1810

[root@docker ~]# docker images

写的真详细