1、docker介绍
1.1、虚拟化技术介绍
Hypervisor,也称为虚拟机监控器,是一个用于创建和运行虚拟机 (VM) 的进程。它是一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件,也可叫做VMM ( virtual machine monitor )。通过 Hypervisor,一台主机计算机可通过以虚拟化的方式共享其资源(如内存和处理资源)来支持多台客户机虚拟机。
Hypervisor 一般分为两种类型:
第 1 类被称为“裸机 hypervisor”,直接在主机硬件上运行。
第 2 类被称为“托管 hypervisor”,作为软件层在操作系统上运行,就像其他计算机程序一样。
1.完全虚拟化:完全虚拟化会使用 hypervisor,这是一种能够直接与物理服务器的磁盘空间和 CPU 进行通信的软件。Hypervisor 监视着物理服务器的资源,保持每台虚拟服务器的独立性,使之察觉不到其他虚拟服务器的存在。它也会在关联的虚拟服务器运行应用时,将物理服务器的资源中继给该虚拟服务器。在使用完全虚拟化方面,最大的限制就是 hypervisor 有其自身的处理需求。这会降低应用速度,影响服务器性能。
2.半虚拟化:与完全虚拟化不同,半虚拟化需要整个网络作为一个有凝聚力的单元来协同工作。在半虚拟化模式下,虚拟服务器上的每个操作系统都能感知到彼此,因此,虽然半虚拟化仍然需要使用 hypervisor,但其不需要使用与完全虚拟化模式同样多的处理能力来管理操作系统。
1.2、容器技术及其特点
#容器技术发展:
Chroot Jail
将进程及其子进程与操作系统的其余部分隔离开来,但是根进程(root process)可以轻松地退出chroot,它从未考虑实现安全机制。
FreeBSD Jail
FreeBSD:保证根进程不会退出,并且还实现了将进程及其活动隔离到文件系统的特定视图中。
CGroups
是一种机制,这种机制能限制和隔离一系列进程的资源使用(CPU,内存,磁盘I / O,网络等)
LXC(Linux containers,Linux容器)
LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。
#容器技术特点
可移植性:不依赖具体的操作系统或云平台,比如在阿里云或腾讯云直接随意迁移。
占地小:容器只需要其应用程序以及它需要运行的所有容器和库的依赖清单,不需要将所有的依赖库都打包在一起。
共享 bin 和 lib:不同的容器可以共享 bin 和 lib,进一步节省了空间
1.3、虚拟化技术与容器技术的关系
#虚拟化使得多个操作系统(Windows 或 Linux)可同时在单个硬件系统上运行。
虚拟化会使用虚拟机监控程序模拟硬件,从而使多个操作系统能够并行运行。但这不如容器轻便。事实上,在仅拥有容量有限的有限资源时,您需要能够可以进行密集部署的轻量级应用。Linux 容器在本机操作系统上运行,与所有容器共享该操作系统,因此应用和服务能够保持轻巧,并行化快速运行。
#容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。
Linux 容器镜像提供了可移植性和版本控制,确保能够在开发人员的笔记本电脑上运行的应用,同样也能在生产环境中正常运行。相较于虚拟机,Linux 容器在运行时所占用的资源更少,使用的是标准接口(启动、停止、环境变量等),并会与应用隔离开;此外,作为(包含多个容器)大型应用的一部分时更加易于管理,而且这些多容器应用可以跨多个云环境进行编排。
1.4、什么是docker
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)。
1.5、docker组成
镜像(Image):
Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):
仓库可看成一个代码控制中心,用来保存镜像。
2、docker安装
2.1、添加yum源
mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/{*,bak/} &>/dev/null
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
2.2、安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
2.3、安装
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
yum install docker-ce -y
2.4、启动
systemctl daemon-reload
systemctl start docker
systemctl enable docker
docker version
2.5、配置加速器
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<-EOF
{
"registry-mirrors": ["https://uoggbpok.mirror.aliyuncs.com"]
}
EOF
或者:
cat > /etc/docker/daemon.json <<-EOF
{
"registry-mirrors": ["https://68rmyzg7.mirror.aliyuncs.com"]
}
EOF
systemctl restart docker
3、Docker的镜像基础管理
3.1 获取镜像
docker search centos
docker pull centos:7.6.1810
docker pull nginx
3.2 镜像基本查看
[root@docker ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f6d0b4767a6c 5 weeks ago 133MB
centos 7.6.1810 f1cb7c7d58b7 23 months ago 202MB
#标识镜像唯一性的方法:
1. REPOSITORY:TAG
centos:7.6.1810
2. IMAGE ID (sha256:64位的号码,默认只截取12位)
f1cb7c7d58b7
#查看长信息
[root@docker ~]# docker image ls --no-trunc
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest sha256:f6d0b4767a6c466c178bf718f99bea0d3742b26679081e52dbf8e0c7c4c42d74 5 weeks ago 133MB
centos 7.6.1810 sha256:f1cb7c7d58b73eac859c395882eec49d50651244e342cd6c68a5c7809785f427 23 months ago 202MB
3.3 镜像详细信息查看
[root@docker ~]# docker image inspect nginx
3.4 只查看镜像ID
[root@docker ~]# docker image ls -aq
f6d0b4767a6c
f1cb7c7d58b7
3.5 镜像的导入和导出
[root@docker ~]# docker image save nginx >/tmp/nginx.tar
[root@docker ~]# docker image rm f6d0b4767a6c
[root@docker ~]# docker image load -i /tmp/nginx.tar
[root@docker ~]# docker image tag f6d0b4767a6c love2/nginx:v1.0
3.6 镜像的删除
#删除单个镜像
[root@docker ~]# docker image rm -f f6d0b4767a6c
#删除所有镜像
[root@docker ~]# docker image rm -f `docker image ls -aq`
4、容器管理
4.1、运行容器
4.1.1、交互式容器
[root@docker ~]# docker container run -it f1cb7c7d58b7
[root@b77445ac7372 /]#
[root@docker ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b77445ac7372 f1cb7c7d58b7 "/bin/bash" About a minute ago Up About a minute competent_albattani
CONTAINER ID : 容器的唯一号码(自动生成的)
NAMES : 容器的名字(可以自动,也可以手工指定)
#例子: 手工指定容器名启动
[root@docker ~]# docker container run -it --name "centos7.6" centos
[root@docker ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d94223386ede centos "/bin/bash" 15 seconds ago Up 13 seconds centos7.6
4.1.2、守护式容器
[root@docker ~]# docker run -d --name="nginx" nginx
860b8dad21cd02bdc513b469742af41a091b460699543423fb4005d101677098
#查询容器的详细信息:
[root@docker ~]# docker container inspect nginx
4.1.3、不同启动容器的应用场景
#交互式的容器: 工具类: 开发,测试,临时性的任务()
[root@docker ~]# docker container run -it --name "centos7.6" centos --rm
#守护式容器: 网络服务
[root@docker ~]# docker run -d --name="nginx" nginx
4.2、容器的启动/关闭/连接
#守护式容器的关闭和启动
[root@docker ~]# docker container stop nginx
[root@docker ~]# docker container start nginx
#交互式的容器的关闭和启动
[root@docker ~]# docker container stop centos7.6
[root@docker ~]# docker container start -i centos7.6
#容器的连接方法:
[root@docker ~]# docker container attach centos7.6
子进程的方式登录(在已有工作容器中生成子进程,做登录.可以用于进行容器的调试,退出时也不会影响到当前容器)
[root@docker ~]# docker container exec -it centos7.6 /bin/bash
容器的后台及前台运行:
1. ctrl + P, Q
attach 调用到前台
2. 死循环
3. 让程序前台一直允许(夯在前台)
制作守护式容器时,常用的方法
4.3、容器的网络访问
#指定映射(docker 会自动添加一条iptables规则来实现端口映射)
-p hostPort:containerPort
-p ip:hostPort:containerPort
-p ip::containerPort(随机端口:32768-60999)
-p hostPort:containerPort/udp
![](https://img2020.cnblogs.com/blog/1870442/202102/1870442-20210223101033342-1455913052.png)
#随机映射
docker run -P 80(随机端口)
[root@docker ~]# docker run -d -p 80:80 --name "n1" f6d0b4
[root@docker ~]# docker container run -d -p 192.168.20.120:8081:80 --name='n2' nginx
4.4、其他命令
[root@docker ~]# docker ps -aq
等价于:
[root@docker ~]# docker container ls -aq
[root@docker ~]# docker top 5bb04b3
等价于:
[root@docker ~]# docker container top 5bb04b3
#查看日志:
[root@docker ~]# docker logs 5bb04b3
[root@docker ~]# docker logs -tf 5bb04b3
5、docker的数据卷实现持久化存储
#1. 手工交互数据:
[root@docker ~]# echo "test html" >index.html
[root@docker ~]# docker container cp ./index.html n1:/usr/share/nginx/html
#2. Volume实现宿主机和容器的数据共享
[root@docker ~]# mkdir -p /opt/html
[root@docker ~]# docker run -d --name="n3" -p 83:80 -v /opt/html:/usr/share/nginx/html nginx
#3. 例子: 开启两个nginx容器(90,91),共同挂载一个数据卷,实现静态资源共享
#4. 数据卷容器:
(1)宿主机模拟数据目录
mkdir -p /opt/Volume/a
mkdir -p /opt/Volume/b
touch /opt/Volume/a/a.txt
touch /opt/Volume/b/b.txt
(2)启动数据卷容器
docker run -it --name "nginx_volumes" -v /opt/Volume/a:/opt/a -v /opt/Volume/b:/opt/b centos:6.9 /bin/bash
ctrl p q
(3)使用数据卷容器
docker run -d -p 8085:80 --volumes-from nginx_volumes --name "n8085" nginx
docker run -d -p 8086:80 --volumes-from nginx_volumes --name "n8086" nginx
作用: 在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数卷容器进行统一管理