虚拟化与容器化

虚拟化技术

虚拟机就是在你的操作系统里面装一个软件(如VMWare),然后通过这个软件再模拟出n台“子电脑”出来。子电脑意味着要虚拟出整个操作系统,会导致占用空间更大,启动更慢

虚拟机

VMWare官方文档:https://docs.vmware.com/cn/VMware-Workstation-Pro/index.html

网络连接类型

网络连接类型特点标识
桥接虚拟机和宿主机在网络上是平级的关系,可以把虚拟机当作一台独立的电脑,然后跟宿主机连接在同一交换机上。宿主机、虚拟机、其他PC机三者可以ping通。VMnet0
NAT只要宿主机能上网,虚拟机就能上网。主机和虚拟机可以ping通,但是其他机器ping不通虚拟机。VMnet8
仅主机虚拟机与宿主机直接连起来VMnet1

在这里插入图片描述

Bridged桥接模式

https://note.youdao.com/ynoteshare1/index.html?id=236896997b6ffbaa8e0d92eacd13abbf&type=note

确认一下主机的ip地址、网关、DNS

vi /etc/sysconfig/network-scripts/ifcfg-eth0

分区

分区用途大小
/boot系统空间200M
/应用空间10GB
swap虚拟交换空间2048M

容器技术

容器技术也是虚拟化技术,属于轻量级的虚拟化。但是它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似“沙箱”)。

特性虚拟机容器
隔离级别操作系统级别进程级别
隔离策略HypervisorGGroups
系统资源5%~15%0%~5%
启动时间分钟
镜像存储GB~TBKB~MB
集群规模上百上万
高可用策略备份,容灾,迁移弹性,负载,动态
镜像隔离资源消耗
虚拟机VMWare虚拟硬件,运行完整的操作系统开启多个虚拟机几G 分钟
容器Docket直接运行在宿主机上容器间隔离
每个容器内都有一个属于自己的文件系统,互不影响
几M 秒级

在这里插入图片描述

docker中的容器是共享Host OS 的,而VM存在独立的OS。每一个容器与VM的功能是相似的,但是没有VM那么笨重

Docket容器

镜像+集装箱式的隔离

Docker概述

Docker 是一个开源的应用容器引擎,基于GO语言并遵从Apache2.0协议开源。

Docker让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

问题一:环境的切换与配置麻烦。

开发(开发环境)----> 测试(测试环境)-----> 运维(生产环境)

之前:在开发环境构建出了一个war包,先在Linux下载好Java、Tomcat、MySQL,配置好环境变量,将war包丢到Tomcat的webapps文件夹下,才能在Linux跑起来。

Docket:将我们的想要的环境构建(打包)成一个镜像,然后我们可以推送(发布)到网上去。想要用这个环境的时候,在网上拉取一份。

有了Docker,我们在搭环境的时候,跟以前的方式就不一样了。

现在:在Linux下直接拉取一份镜像(各种环境都配好了),将镜像运行起来,把war包丢进去就好了。

问题二:应用之间需要隔离。

把多个应用部署在同一台服务器上,假设应用之间不隔离,那可能会出现什么问题?

如果版本更新,导致服务不可用

如果一个应用出现了问题,导致CPU占100%。那另一个应用也会受到关联,跟着一起凉凉了。
这两个应用是完全不同技术栈的应用,比如一个PHP,一个.NET。这两个应用各种的依赖软件都安装在同一个服务器上,可能就会造成各种冲突/无法兼容,这可能调试就非常麻烦了。

Docket:Docker底层用的Linux的cgroup和namespace这两项技术来实现应用隔离。

在Linux内核中,提供了cgroups功能,来达成资源的区隔化。它同时也提供了名称空间(namespace)区隔化的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括进程树,网络,用户id,以及挂载的文件系统。

Docket架构

在这里插入图片描述

组件概念说明
Images镜像通过运行镜像启动容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容-代码,运行时,库、环境变量和配置文件。
Container容器容器是独立运行的一个或一组应用,是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
Registry仓库DockerHub就相当于Maven的Repository,在Respository中存放是一个一个的jar包,而在DockerHub存放的是一个一个的镜像。

容器与镜像的关系类似于面向对象编程中的对象与类。

Images container1 = new Images();

Images container2 = new Images();

Images containersn = new Images();

面向对象Docker
对象容器
镜像
其他组件概念说明
Client客户端Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Host主机一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Machine命令行工具Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

Docker网络原理

Docket镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行库、环境变量和配置文件

将应用和环境打包成一个镜像!就可以直接运行。

Docker镜像加载原理
在这里插入图片描述

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

boots(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引导加 kernel,

Linux刚启动时会加bootfs文件系统,在 Docker镜像的最底层是 boots。这一层与我们典型的

Linux/Unix系统是一样的,包含boot加載器和内核。当boot加载完成之后整个内核就都在内存中了,此时

内存的使用权已由 bootfs转交给内核,此时系统也会卸载bootfs。

rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系统中 的/dev,/proc,/bin,/etc等标准目录和文件。 rootfs就是各种不同的操作系统发行版,比如 Ubuntu,

Centos等等。

Docket镜像构建步骤:

1、 编写一个dockerfile文件

2、 docker build 构建称为一个镜像

3、 docker run运行镜像

4、 docker push发布镜像(DockerHub 、阿里云仓库)

dockerfile

dockerfile 是用来构建docker镜像的文件!命令参数脚本!

# 基础镜像,一切从这里开始构建
FROM 10.45.80.1/public/centos7.6_java8_tomcat9_base:9.0.37
# 镜像是谁制作的
MAINTAINER srilanka.whalecloud
# 镜像构建的时候需要运行的命令
RUN cd /usr/tomcat/tomcat9.0/webserver/webapps/ && mkdir fm-web
# 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
ADD Code/fm-prj-srilanka-parent/fm-prj-srilanka-web/target/fm-web/   /usr/tomcat/tomcat9.0/webserver/webapps/fm-web/

# 类似ADD,将我们文件拷贝到镜像中
COPY Code/docker-app.def /app/docker-app.def
COPY Code/ZSMART_HOME /app/ZSMART_HOME
# 构建的时候设置环境变量!
ENV ZSMART_HOME /app/ZSMART_HOME
ENV CATALINA_HOME /usr/tomcat/tomcat9.0/webserver
ENV LOG_PATH /app/logs
ENV z_app zpass
ENV srvRunPath fm
ENV LANG en_US.UTF-8

# 镜像构建的时候需要运行的命令
RUN chown -R zpaas:zpaas /app/ZSMART_HOME \
   && chmod +x /app/ZSMART_HOME/bin/* \
   && chown -R zpaas:zpaas /usr/tomcat/tomcat9.0/webserver \
   && mkdir -p /app/logs \
   && chmod +x /app/docker-app.def \
   && chown -R zpaas:zpaas /app

# 指定这个容器启动的时候要运行的命令,可以追加命令
ENTRYPOINT ["/usr/local/bin/tini", "-g", "--", "/app/docker-entrypoint.sh"]

# 挂载的目录
VOLUME ["/app/logs"]

# 镜像的工作目录
WORKDIR /app
# 指定执行后续命令的用户和用户组
USER zpaas

# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
CMD ["start"]

#注
#1)CMD 和 ENTRYPOINT
#CMD指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
#ENTRYPOINT指定这个容器启动的时候要运行的命令,可以追加命令
#2)
EXPOSE # 保留端口配置 
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。
镜像构建
docker build -f 文件路径 -t 用户名/镜像名:[tag] . 
运行镜像
发布镜像

(DockerHub 、阿里云仓库)

https://hub.docker.com/

Docket容器

容器数据卷

数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

MySQL,容器删除了,删库跑路!需求:MySQL数据可以存储在本地!

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

Docker安装

#卸载旧的版本
yum remove docker \
          docker-client \
          docker-client-latest \
          docker-common \
          docker-latest \
          docker-latest-logrotate \
          docker-logrotate \
          docker-engine

#安装Docket(使用root权限操作)
yum install -y docker

#开启Docket服务
systemctl start docker.service

#查看安装结果 
docker version

#设置开机启动
systemctl enable docker.service

#配置Docket镜像下载加速(默认安装后的Docker环境在拉取Docker镜像时速度很慢)
vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://x44nsz66.mirror.aliyuncs.com"]
}
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
#阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

systemctl daemon-reload 
systemctl restart docker.service

#检查加速器是否生效
docker info

Docker命令

在这里插入图片描述

Docker镜像

命令用法含义参数备注
logindocker login [OPTIONS]登陆到一个Docker镜像仓库docker login -u 用户名 -p 密码
docker logout退出登陆
pulldocker pull [OPTIONS] 镜像:版本从docker中心镜像仓库拉取指定镜像-a :拉取所有 tagged 镜像
  --disable-content-trust:忽略镜像的校验,默认开启
pushdocker push [OPTIONS]  镜像:版本推送指定镜像或者库镜像至docker源服务器 --disable-content-trust:忽略镜像的校验,默认开启
searchdocker search [OPTIONS] 镜像在 docker hub中心镜像仓库中搜索镜像--automated :只列出 automated build类型的镜像;NAME镜像仓库源的名称。DESCRIPTION镜像的描述
--no-trunc :显示完整的镜像描述;STARS点赞数。OFFICIAL是否 docker 官方发布。AUTOMATED自动构建
-f <过滤条件>:列出收藏数不小于指定值的镜像。
imagesdocker images [OPTIONS] 镜像:版本查看本地主机的所有镜像-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);REPOSITORY镜像的仓库源
--digests :显示镜像的摘要信息;TAG镜像的标签
-f :显示满足条件的镜像;IMAGE ID镜像的id
--format :指定返回值的模板文件;CREATED镜像的创建时间
--no-trunc :显示完整的镜像信息;SIZE镜像的大小
-q :只显示镜像ID。
rmidocker rmi [OPTIONS] 镜像:版本删除本地一个或多个镜像-f :强制删除;
--no-prune :不移除该镜像的过程镜像,默认移除;
tagdocker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]给本地镜像打标签
builddocker build [OPTIONS] PATH | URL | -使用 Dockerfile 创建镜像。--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
--quiet, -q :安静模式,成功后只输出镜像 ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
--squash :将 Dockerfile 中所有的操作压缩为一层。
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
--network: 默认 default。在构建期间设置RUN指令的网络模式
historydocker history [OPTIONS] 镜像查看指定镜像的创建历史。-H :以可读的格式打印镜像大小和日期,默认为true;
--no-trunc :显示完整的提交记录;
-q :仅列出提交记录ID。
savedocker save [OPTIONS] 镜像.tar [镜像...]导出镜像 -o :输出到的文件。
loaddocker load [OPTIONS]导入镜像--input , -i : 指定导入的文件,代替 STDIN。
--quiet , -q : 精简输出信息。
importdocker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]从归档文件中创建镜像-c :应用docker 指令创建镜像;
-m :提交时的说明文字;
infodocker info显示 Docker 系统信息,包括镜像和容器数
versiondocker version查看 docker版本号

Docker容器

先有镜像才能创建容器

命令用法含义参数备注
rundocker run [OPTIONS] 镜像创建一个新的容器并运行-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷
createdocker create [OPTIONS] 容器创建一个新的容器但不启动它同run
startdocker start 容器启动容器
stopdocker stop 容器停止容器
restartdocker restart 容器重启容器
killdocker kill [OPTIONS] KILL 容器杀掉一个运行中的容器 -s :向容器发送一个信号
rmdocker rm [OPTIONS] 容器移除一个或多个容器-f :通过 SIGKILL 信号强制删除一个运行中的容器。删除所有已经停止的容器 docker rm $(docker ps -a -q)
-l :移除容器间的网络连接,而非容器本身。
-v :删除与容器关联的卷。
pausedocker pause 容器暂停容器中所有的进程
unpausedocker unpause 容器取消暂停容器中所有的进程
execdocker exec [OPTIONS] 在运行的容器中执行命令-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
psdocker ps [OPTIONS]查看容器列表-a :显示所有的容器,包括未运行的。CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。created(已创建)restarting(重启中)running(运行中)removing(迁移中)paused(暂停)exited(停止)dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
 --no-trunc:不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
inspectdocker inspect [OPTIONS] 容器/镜像获取容器/镜像的元数据。-f :指定返回值的模板文件。
-s :显示总的文件大小。
--type :为指定类型返回JSON。
topdocker top [OPTIONS] 容器查看容器中运行的进程信息
attachdocker attach [OPTIONS] 容器连接到正在运行中的容器
eventsdocker events [OPTIONS]从服务器获取实时事件-f :根据条件过滤事件;
--since :从指定的时间戳后显示所有事件;
--until :流水时间显示到指定的时间为止;
logsdocker logs [OPTIONS] 容器获取容器的日志-f : 跟踪日志输出
--since :显示某个开始时间的所有日志
-t : 显示时间戳
--tail :仅列出最新N条容器日志
waitdocker wait 容器截取容器停止时的退出状态值
exportdocker export [OPTIONS] 容器将文件系统作为一个tar归档文件导出到STDOUT。 -o :将输入内容写到文件。
portdocker port 容器查看映射端口对应的容器内部源端口
commitdocker commit [OPTIONS] 容器从容器创建一个新的镜像-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
cpdocker cp [OPTIONS] A B容器与主机之间的数据拷贝,把a复制到b中 -L :保持源目标中的链接docker cp [OPTIONS] 容器:目录 本机目录
docker cp [OPTIONS] 本机目录 容器:目录
diffdocker diff 容器检查容器里文件结构的更改。

Docker安装实例

nginx

docker search nginx

docker pull nginx:latest

docker images

docker run --name nginx_xxx -p 8080:80 -d nginx

docker ps

http://127.0.0.1:8080

mysql

docker search mysql

docker pull mysql:latest

docker images

docker run -itd --name mysql_xxx -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

docker ps

docker exec -it mysql_xxx bash

redis

docker search redis

docker pull redis:latest

docker images

docker run --name redis_xxx -p 6379:6379 redis

docker ps

docker exec -it redis_xxx /bin/bash

mongo

docker search mongo

docker pull mongo:latest

docker images

docker run --name mongo_xxx -p 27017:27017 mongo 

docker ps

docker exec -it mongo_xxx mongo admin

zookeeper

docker search zookeeper

docker pull zookeeper:latest

docker images

docker run --name zookeeper_xxx --restart always -e JVMFLAGS="-Xmx1024m" -p 2181:2181 zookeeper

docker ps

docker exec -it zookeeper_xxx /bin/bash

elasticsearch

docker search elasticsearch

docker pull elasticsearch:latest

docker images

docker run --name elasticsearch_xxx -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch

docker ps

http://127.0.0.1:9200

rocketmq

#拉取镜像 
docker pull foxiswho/rocketmq:server-4.3.2 
docker pull foxiswho/rocketmq:broker-4.3.2

#创建数据挂载目录
mkdir /Users/liubo/devApps/rocketmq/server/logs
mkdir /Users/liubo/devApps/rocketmq/server/store
mkdir /Users/liubo/devApps/rocketmq/server/logs
mkdir /Users/liubo/devApps/rocketmq/broker/store
mkdir /Users/liubo/devApps/rocketmq/broker/conf

#新建并编辑配置文件
touch broker.conf
vi /Users/liubo/devApps/rocketmq/broker/conf/broker.conf

namesrvAddr=192.168.130.128:9876
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1 = 192.168.130.128

#创建server容器 
docker create -p 9876:9876 --name rockerMQserver -e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" -e "JAVA_OPTS=-Duser.home=/opt" -v /Users/liubo/devApps/rocketmq/server/logs:/opt/logs -v /Users/liubo/devApps/rocketmq/server/store:/opt/store foxiswho/rocketmq:server-4.3.2
#启动容器 
docker start rockerMQserver

#创建broker容器 
docker run -it -d --net host --name rockerMQbroker -e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" -e "JAVA_OPTS=-Duser.home=/opt" -v /Users/liubo/devApps/rocketmq/broker/conf/broker.conf:/etc/rocketmq/broker.conf -v /Users/liubo/devApps/rocketmq/broker/logs:/opt/logs -v /Users/liubo/devApps/rocketmq/broker/store:/opt/store --privileged=true foxiswho/rocketmq:broker-4.3.2


#拉取镜像-RocketMQ的UI管理工具
docker pull styletang/rocketmq-console-ng:1.0.0

#创建并启动容器-RocketMQ的UI管理工具
docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr=172.21.52.147:9876;172.21.52.147:9877 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 8082:8080 -t styletang/rocketmq-console-ng:1.0.0

#浏览器访问
http://172.21.52.147:8082/

jenkins

docker search jenkins

docker pull jenkins/jenkins:latest

docker images

#创建一个jenkins目录
mkdir /Users/liubo/devApps/JenkinsHome

docker run -d --name jenkins_xxx -p 8081:8080 -v /Users/liubo/devApps/JenkinsHome/jenkins_xxx:/Users/liubo/devApps/JenkinsHome/jenkins_xxx jenkins/jenkins:latest;

docker ps

http://127.0.0.1:8081

docker exec -it jenkins_xxx bash

cat /var/jenkins_home/secrets/initialAdminPassword

#安装过程中出现一个错误:Forbidden
#可能是国外部分资源网站网速卡住,选择重试,直至安装完成。

Docker Compose

portainer

容器集群管理

Docket Swarm

docker原生自带的容器集群管理系统

Kubernetes(K8S)

文档:https://www.kubernetes.org.cn/docs

容器集群管理系统

在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。

Master

Node

Pod

Replication Controller

Service

Label

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值