为什么需要Docker容器
-
在软件开发中,最麻烦的事情之一就是环境配置。在正常情况下,如果要保证程序能运行,我们需要设置好操作系统,以及各种库和组件的安装。
-
举例来说,要运行一个Python程序,计算机必须要有 Python 引擎,还需要安装好程序的各种依赖,甚至还要配置特定的环境变量。假设你有两个程序都需要部署在同一个服务器上,一个需要软件是基于Python2.0,一个是Python3.0,那么在部署上就很容易造成混乱。因为不同版本的Python模块可能互不兼容,况且不同开发环境上的库也需要额外的配置。如果要部署很多程序,而开发环境和部署环境各不相同的话,可想而知配置得多么麻烦。
-
为了更好地将软件从一个环境移植到另一个环境上,必须从根源上解决问题,那么如何在移植软件的时候,将一模一样的原始环境迁移过来呢?
虚拟机
虚拟机是移植环境的一种解决方案。虚拟机本质上也是一个软件,在这个软件中,我们可以运行另一种操作系统。比如我们想要在 MacOS 上运行 Linux 系统,我们就在电脑上安装 Linux 镜像,并使用虚拟机打开此镜像,就能创建出一个镜中镜了。这个方案非常方便,想要新环境,就安装镜像,然后使用虚拟机打开,不想要直接删除。但是这个方案有几个缺点:
占用资源多:虚拟机需要安装整个操作系统,自然会消耗大量内存和硬盘空间。如我们只需要运行1MB的软件,有时候也不得不安装几个G的环境才能运行。
运行步骤冗余:虚拟机安装的是完整的系统,每次运行程序都需要按部就班,打开系统、登入用户等等之类麻烦的步骤,很不方便。
运行速度慢:为了运行特定环境中的软件,虚拟机必须先运行系统,而系统占用的资源往往很多(网络,GUI,IO等等),自然也会影响运行速度。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。
虚拟化技术:VMware、VirtualBox、阿里云服务器、docker 虚拟化技术
名词解释:
kvm,VMware:kvm:Kernel-based Virtual Machine,linux上虚拟化的技术,把一台机器虚拟化成多台
openstack:python写的,创建,管理,销毁 虚拟机的管理工具,web管理界面,点点点就能创建,删除虚拟机
kvm+openstack的方案:公司多台服务器,openstack是管理虚拟机的工具
docker:容器技术
k8s:kubernetes,kubernetes是管理container(docker)的工具
公司主流:k8s+docker、kvm+k8s+docke
功能上:kubernetes是管理container的工具,openstack是管理VM的工具。
业务上:openStack是定位于laaS平台的项目,Kubernetes是定位于PaaS平台的项目
时间上:云平台方案的第一阶段:虚拟机;云平台方案的第二阶段:容器技术;
虚拟机和容器的比较
虚拟机需要虚拟化出操作系统:笨重,资源消耗大
容器:轻量级,资源消耗小
IAAS PAAS SAAS FAAS
'''一 IaaS基础设施服务'''
IaaS: Infrastructure-as-a-Service(基础设施即服务)
第一层叫做IaaS,有时候也叫做Hardware-as-a-Service,几年前如果你想在办公室或者公司的网站上运行一些企业应用,你需要去买服务器,或者别的高昂的硬件来控制本地应用,让你的业务运行起来。
但是现在有IaaS,你可以将硬件外包到别的地方去。IaaS公司会提供场外服务器,存储和网络硬件,你可以租用。节省了维护成本和办公场地,公司可以在任何时候利用这些硬件来运行其应用。
一些大的IaaS公司包括Amazon, Microsoft, VMWare, Rackspace和Red Hat.
'''二 paas平台即服务'''
第二层就是所谓的PaaS,某些时候也叫做中间件。你公司所有的开发都可以在这一层进行,节省了时间和资源。
PaaS公司在网上提供各种开发和分发应用的解决方案,比如虚拟服务器和操作系统。这节省了你在硬件上的费用,也让分散的工作室之间的合作变得更加容易。网页应用管理,应用设计,应用虚拟主机,存储,安全以及应用开发协作工具等。
一些大的PaaS提供者有Google App Engine,Microsoft Azure,Force.com,Heroku,Engine Yard。最近兴起的公司有AppFog, Mendix 和 Standing Cloud
不仅卖服务器,还卖软件
OSS对象存储,阿里云mysql服务,阿里云的redis
'''三saas软件即服务'''
第三层也就是所谓SaaS。这一层是和你的生活每天接触的一层,大多是通过网页浏览器来接入。任何一个远程服务器上的应用都可以通过网络来运行,就是SaaS了。
你消费的服务完全是从网页如Netflix, MOG, Google Apps, Box.net, Dropbox或者苹果的iCloud那里进入这些分类。尽管这些网页服务是用作商务和娱乐或者两者都有,但这也算是云技术的一部分。
一些用作商务的SaaS应用包括Citrix的GoToMeeting,Cisco的WebEx,Salesforce的CRM,ADP,Workday和SuccessFactors
多租户
社保局:社保软件
'''四FAAS函数及服务'''
Serverless:无服务
Linux容器(Container)
为了解决虚拟机存在的这些缺点,Linux发展出了另一种虚拟化的技术:Linux容器。Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,就是在正常进程的外面套用了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层程序的隔离。由于容器是进程级别的,相比虚拟机有更多优势:
- 占有资源少:容器只占用需要的资源,不占用那些用不到的资源。相比于虚拟机安装完整的操作系统,容器需要消耗的空间自然就少了很多。
- 资源利用率高:虚拟机都是独享资源,电脑需要为每个虚拟环境单独分配资源,不仅仅占用空间大,而且资源的利用率很低。而容器之间可以共享资源,最大化资源的利用率。
- 运行速度快:容器里面的应用就是底层系统的一个进程,所以启动容器相当于直接运行本机的一个进程,而不是一个完整并臃肿的操作系统,自然就快很多。
Docker是什么?
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口,它也是目前最流行的Linux容器解决方案。Docker 将软件代码和其依赖,全打包在一个文件中。运行单个文件,就会生成虚拟容器。在这个虚拟容器中,不管本地的操作系统是如何的不同,此容器都能照常运行。
简而言之,Docker的接口非常简单,可以帮助用户更好地创建和使用容器,让相同的代码在不同的环境上正常运行。
docker组件介绍
Docker服务器和客户端
Docker是一个客户端-服务器(c/s)架构程序,Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果,Docker提供了一个命令行工具Docker以及一整套RESTful API,你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程
Docker镜像与容器
- 镜像是远程拉下来的文件
- 容器是镜像运行后得到的,一个镜像可以运行多个容器
- 面向对象中的 类:镜像 对象:容器
- 容器:把容器当做一个操作系统上运行了软件
镜像是构建Docker的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。
Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。
Register(注册中心)
Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。
Docker架构
客户端cli
服务端 server
Images:镜像
containers:容器 (想象成一个操作系统运行了一个软件)
networks:网络
Volumes:数据卷,文件
Registry:远程仓库
仓库里放了许多镜像
Docker安装启动
# docker 可以安装在各个操作系统之上
centos 7.5
win10 以上可以
mac
最好,在虚拟机的centos上安装
# 版本介绍
Docker-CE指的是Docker社区版,由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用
Docker-EE指Docker企业版,由售后团队和技术团队提供支持,专为企业开发和IT团队设计
# 卸载
停止服务:systemctl stop docker
# 安装
- 安装一些依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 把yum源设置为阿里云
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker
sudo yum install docker-ce
- 查看docker版本
docker -v # Docker version 20.10.22, build 3a2c30b
# 配置国内镜像站:仓库在国外,下载镜像很慢,配置国内镜像站
- 阿里云:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
- mkdir /etc/docker
- vim /etc/docker/daemon.json
写入:
{
"registry-mirrors": ["https://moxywhnb.mirror.aliyuncs.com"]
}
重启:
- sudo systemctl daemon-reload
- sudo systemctl restart docker
# docker 命令
# 启动docker:
systemctl start docker
#停止docker:
systemctl stop docker
#重启docker:
systemctl restart docker
#查看docker状态:
systemctl status docker
#开机启动:
systemctl enable docker
#查看docker概要信息
docker info # docker客户端,服务端的概要信息
docker镜像操作
# 搜索镜像
-docker search 镜像名字
直接取网站搜索
# 从远程仓库拉去的文件
-docker pull centos:centos7.9.2009
-docker pull python:3.8-slim
-docke pull redis # 最新版
-docker pull mysql:5.7
# 查看本地镜像
-docker images
# 删除镜像
-docker rmi 镜像id
# 一次性删除所有镜像
-docker rmi `docker images -q`
# 一次性删除所有容器
-docker rm `docker ps -aq`
# 自己制作一个镜像,想传到自己的仓库里
把本地的镜像打个标签
docker tag 镜像id 账户名/XXXX
docker login 输入用户民密码
docker push 账户名/XXXX
镜像分层的好处
镜像是一堆文件,方便快速上传到远程仓库,原来已经分了好多层,只需要挂载上去就好了,还有快速的下载,下载的时候只需要下载新的层就好了
镜像上传到远程仓库
从远程仓库下载镜像
做加速
只要在容器中新增了文件,就会多一层
Docker容器操作
# 1 基于镜像运行成容器
-创建容器,运行容器
# -it和-id区别 :it进入到容器内部 ,id以守护进程运行容器,不进入
# --name=名字 不写会随机
# centos:7 镜像的名字和tag
# -p 3307:3306 把宿主机的3307端口映射到容器的3306端口,以后访问宿主机的3307,就等于访问容器的3306
# -v /root/lqz:/home 把宿主机的/root/lqz映射到容器的 /home ,以后再宿主机或容器内修改这个文件夹,都会相互影响
# 在容器内部,退出来:exit ---》只要退出,容器也退出了
-docker run -it --name=centos centos:7 # 基于centos:7镜像 创建并运行容器,进入到容器中,名字为centos
# 2 查看正在运行的容器
docker ps
# 3 查看所有容器
docker ps -a
# 4 在容器上执行命令
docker exec 容器id ls
docker exec 12a6a0281168 ls
docker exec -it 12a6a0281168 /bin/bash
# 5 停止容器
docker stop 容器id
# 6 运行容器
docker start 容器id
# 7 删除
docker rm 容器id # 正在运行的容器不能删
# 8 映射从容器里面zxr文件夹映射到宿主机里面的homme文件夹
docker run -id --name=centos3 -v /root/zxr:/home centos:7
# 8 文件拷贝
-把宿主机文件cp到容器内部
docker cp 宿主机文件 容器id:容器路径
-把容器内部文件cp到宿主机
docker cp 容器id:路径/文件 /root/ss.py
# 9 查看容器信息
docker inspect 容器id
docker inspect --format='{{.NetworkSettings.IPAddress}} 容器id # 查看ip地址