docker-01
一、docker入门
什么是虚拟化?
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存条及存储(硬盘)等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍(比如说你有个4G的内存条你不能掰成两瓣2G和2G用,但是虚拟化技术可以),使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储(举例:阿里云可能后台有很多配置很高的机器,打破这些硬件的资源,虚拟出一台你想要的机器)。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(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+docker
功能上: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.
买了阿里云的服务器,就相当于买了阿里云的IAAS服务
二PASS平台即服务
- 不仅卖服务器,还卖软件(mysql、redis等),包括还卖OSS对象存储,阿里云mysql服务,阿里云的redis
三SAAS软件即服务
- 多租户:多账号淘宝卖家开店
- 比如社保局:社保软件
四FAAS:函数及服务
- Serverless:无服务
二、运维软件的名词
- 混合云:公司自己有服务器(私有云),买了云服务器(公有云)
- nginx: web服务器:请求转发,负载均衡
- ansible:python+paramiko写的,批量操作服务器的软件
- paramiko
- ssh链接,最多操作服务器不超过500台
- 服务端,无agent
- SaltStack:python+消息队列-批量操作服务器的软件
- 服务端,客户端,被控机装客户端
- zabbix:php写的,web服务器,监控软件,监控进程
- Prometheus+Grafana:go写的,监控软件,主要用来监控容器,监控进程
- jenkins:java写的,自动化构建工具
- CI(CI-Continuous integration,持续集成)
持续集成是指多名开发者在开发不同功能代码的过程当中,可以频繁的将代码行合并到一起并切相互不影响工作。
持续集成的目的,是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成
- CD(CD-continuous deployment,持续部署)
是基于某种工具或平台实现代码自动化的构建、测试和部署到线上环境以实现交付高质量的产品,持续部署在某种程度上代表了一个开发团队的更新迭代速率
三、docker组件介绍
Docker:容器技术(主要是为了进程间隔离)
- 这个
公司dotCloud
用go
写的软件 - Docker 的基础是 Linux 容器(LXC)等技术
- LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单
好处
举例说明
- 开发阶段:win上开发的 python3.8 第三方模块
- 上线阶段:linux上线 python3.8 第三方模块 不同平台有差异可能有的不支持
- 使用docker可以统一开发和部署环境,这样你开发和部署的东西都是一样一样的
- 只要部署项目运行起一个容器即可(可能有python+django+drf+uwsgi+代码),把这些东西都打包放在一个容器里,以后拿着这个容器在任意机器上都可以运行起来,前提就是机器上装上这个软件docker
- java容器:(jdk+tomcat+java代码)同理装个docker在别的机器上也能运行
比较(下图):其实就是没有操作系统这一层级,所以更轻量级
docker是一款cs架构软件(就是服务端(Client)和客户端(Server))
- 客户端cli
- 客户端和服务端交互使用resfulapi
- 客户端:比如执行了docker的ps命令-——>转成http请求(是符合resful规范)——>服务端 解析出来执行命令
架构
- 客户端client(执行一些命令)
- 通过http请求的resful规范进入服务端
- 服务端有个
Docker daemon
的进程负责接收 - 服务端 server
- Images:镜像(从仓库里拉下来的)
- containers:容器 (想象成一个操作系统运行了一个软件,每个容器都有一个IP地址)
- networks:网络
- Volumes:数据卷,文件
- Registry:远程仓库
- 镜像(仓库里放了很多的镜像)
最主要的是隔离的每个虚拟机的IP地址,做网络的隔离,只要网络隔离开,每个就是独立的个体
镜像和容器
- 镜像是从远程拉去下来的文件
- 容器是镜像运行后得到的,一个镜像可以运行多个容器
- 举例子相当于:面向对象中得 类:镜像 对象:容器
- 容器:把容器当做一个操作系统上运行的软件
- 比如说:我运行了redis容器:一个操作系统运行了redis 原来跑redis是把源码下下来编译安装,现在有了容器技术就可以拉一个redis镜像
可以通过容器运行一些软件,这样宿主机即便不支持这个软件的安装装个docker软件也都可以运行起来,这样部署项目就简单了
四、docker安装启动
docker是可以安装在各个操作系统之上
- 现在用的centos 7.5
- win10 以上可以
- mac
- 最好,在虚拟机的centos上安装
版本介绍
- Docker-CE指Docker社区版,由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用
- Docker-EE指Docker企业版,为收费版本,由售后团队和技术团队提供技术支持,专为企业开发和IT团队而设计
卸载
- 停止服务: systemctl stop docker
- yum list installed | grep docker
- yum remove docker-ce.x86_64 docker-ce-cli.x86_64 docker-ce.x86_64 docker-ce-cli.x86_64
- rm -rf /var/lib/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
win和mac :https://get.daocloud.io/#install-docker-for-mac-windows
配置国内镜像站:仓库在国外,下载镜像很慢,配置国内镜像站
-阿里云:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
-mkdir /etc/docker
-vim /etc/docker/daemon.json
-写入
{
"registry-mirrors": ["https://x1566319.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
- docker 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 liuqingzheng/xxxx
docker login #输入用户名密码
docker push liuqingzheng/xxxx
你的仓库你就能看到了
镜像分层:好处 面试题
- 镜像上传到远程仓库
- 从远程仓库下载镜像
- 做加速
- 只要在容器中新增了文件,就会多一层
如何获取镜像
- docker pull 拉取
- 压缩包还原
- 容器反打包成镜像
- dockerfile构建
六、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、文件拷贝
- 把宿主机文件cp到容器内部
- docker cp 宿主机文件 容器id:容器路径
- 把容器内部文件cp到宿主机
- docker cp 容器id:路径/文件 /root/ss.py
9、查看容器信息
- docker inspect 容器id
- docker inspect --format='{{.NetworkSettings.IPAddress}} 容器id # 查看ip地址