最近一段时间想学习一下k8s,学k8s之前还需要再复习一下相关的知识,于是这篇文章就出现了
官网
文章一共分为:
出现的原因的历史能干什么的一些概念的安装的基本命令使用运行镜像的挂载和数据卷同步网络命令使用网络创建内部网络使用运行镜像,并连接如何编写以及如何构建镜像使用构建一个镜像并运行出现的原因
一个项目从开发到上线,一般都会有开发环境,联调环境,生产环境。如果有一个环境中某个软件或者依赖版本不同了,可能产品就会出现一些错误,甚至无法运行。比如开发人员在系统,但是最终要把项目部署到linux。如果存在不支持跨平台的软件,那项目肯定也无法部署成功。这时候问题就出现了,开发说我代码在开发环境跑的好好的,怎么到上线的时候就不行了呢,然后还要重新检查操作系统,软件,依赖等版本,费神费力不说,遇到脾气不好的,那不得干一架。这要是中间整错一个环节,直接白费,结果就是搭环境一两天,部署项目两分钟的事件。
再比如如果一个产品需要使用mysql集群,redis集群,或者集群等等,不同的人都要用到这些,那每一个人都要对集群进行配置,如果有一个位置不同就有可能产生重大问题。况且配环境是一个极其繁琐,很需要耐心和细心的。回想一下自己刚学编程的时候,配置环境变量是不是都有可能耗费很长时间,这些集群就更不用说了。
对于上面的问题,如果有这么一个工具:开发人员把环境配置好,将需要运行的jar包运行成功,然后把jar包和需要的环境一起打包给运维人员,让运维人员部署就可以了。这么一来就可以解决掉我们上面说的这些问题,这大大提高了项目上线的效率。于是,就出现了。
的历史
有意思的是, 公司起初是一家名为 的平台即服务(-as-a-.PaaS )提供商,底层技术上, 平台利用了 Linux容器技术,为了方便创建和管理这些容器, 开发了一套内部工具,之后被命名为“”。就是这样诞生的!
2013年,的 PaaS 业务并不景气,公司需要寻求新的突破,于是他们聘请了 Ben Golub 作为新的 CEO,将公司重命名为”,放弃 PaaS 平台,怀揣着将和容器技术推向全世界”的使命,开启了一段新的征程
如今 公司被普遍认为是一家创新型科技公司,据说其市场价值约为 10 亿美元,公司已经通过多轮融资吸纳了来自硅谷的几家风投公司的累计超过 2.4亿美元的投资。几乎所有的融资都发生在公司更名为”之后。
能干什么
在容器(也是虚拟化技术)出现之前,都是使用的虚拟机技术。所谓的虚拟机技术就是我想在我的mac中装一个系统,那么就需要虚拟出一整套完整的操作系统,占用的资源非常的多,并且十分的笨重。
虚拟机技术:我需要将整个操作系统运行在我的电脑中
虚拟出来的系统
而容器化技术则不是虚拟出完整的操作系统,它是直接运行在我们的宿主机内核之上,容器本身是没有内核的,只有自己需要的一些核心文件,并且每个容器之间互相隔离,每个容器内都有自己的文件系统。
宿主机内核
的一些概念
:客户端,负责输入命令
:服务端,拥有一个守护进程,接受命令,执行命令。
镜像:就是一个模版,类似于java的类,可以通过类生成很多个容器,但是景象本身不能运行:景象—>容器(提供服务)
是一种轻量级的可执行的软件包,用来打包软件运行环境和基于运行环境开发软件,它包含运行某个软件所需要的所有内容,包括代码、运行时库、环境变量和配置文件
容器:利用容器技术独立运行一个、一组应用;启动、停止、删除、基本命令;一个容器就是一个轻巧的linux系统
仓库:分为公有仓库和私有仓库,是存放镜像的地方,平时我们也可以将我们build的镜像存放到共有仓库中
:面向开发,我们以后要发布项目做镜像,就需要编写文件,这个文件十分简单;构建文件,定义了一切的步骤,是源代码
:联合文件系统,是一种分层的、轻量级的高性能文件系统,他支持对文件系统的修改作为一次提交来一层一层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是镜像基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像
容器数据卷:将应用和环境打包成一个镜像,如果数据在容器中,容器删除后数据也会丢失,需要把数据存储到本地。容器之间可以有一个数据共享系统,中产生的数据同步到本地。这就是卷技术,将我们的容器目录挂载到linux目录下面
的安装
安装十分的简单,这里我使用的是mac版本的,点击对应平台的版本安装客户端
的基本命令
docker version //显示docker的客户端与服务端版本即为安装成功
docker info //比docker version显示的信息更为全面
systemctl stop docker //关闭docker服务
systemctl restart docker //重启docker服务
docker search 镜像名称 //从远程仓库查询镜像
docker pull 镜像名称 //从远程仓库拉取镜像
docker pull 镜像名称:版本号 //从远程仓库拉取指定版本的镜像
docker images //显示本地所有镜像
//-a:显示所有 -q:只显示镜像id -f:搜索指定镜像
//每列解释:repository:仓库源 tag:镜像标签(版本) image id:镜像id created:镜像创建时间 size:镜像大小
docker rmi -f 镜像id //删除一个镜像
docker rmi -f $(docker images -aq) 删除全部的容器 //删除所有的镜像
docker run [options] 镜像ID //运行一个镜像
//--name="容器名字" #给容器起名字
// -it #使用交互方式启动,进入容器查看内容 exit:容器停止并退出 ctrl+P+Q:容器不停止退出
// -d #后台方式运行 使用docker ps 发现容器停止了,原因:容器启动后,发现自己没有提供服务,就会自己停止
// -p #指定容器端口号 3306:80 通过访问3306可以映射到docker内部的80端口 宿主机端口:容器端口
// -v #卷挂载,容器内路径与宿主机路径映射
// --net 连接一个网络
// --volumes-from #卷同步
// --privileged=true #权限全开,不利于宿主机安全,能不用尽量不要用
// --restart=always #在容器退出时总是重启容器;no,默认策略,在容器退出时不重启容器;on-failure,在容器非正常退出时(退出状态非0),才会重启容器;on-failure:3,在容器非正常退出时重启容器,最多重启3次;always,在容器退出时总是重启容器;unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。
docker ps [options] //正在运行的容器
//-a 正在运行的容器+运行过的容器
//-n=? 显示最近创建的容器
//-aq 显示所有运行的容器编号
docker rm 容器id //删除单个容器
docker rm -f $(docker ps -aq) //删除所有容器
docker start 容器id //启动一个容器,之前已经使用docker run启动了一个容器
docker restart 容器id //重启一个容器
docker stop 容器id //停止一个容器
docker kill 容器id //强制退出一个容器
docker run -it --rm 镜像id //用完即删,容器停止后就会自动删除,用于测试
docker logs -tf 容器id //f是时间戳的意思
docker top 容器id //查看docker的进程情况
docker inspect 容器名称 //查看容器信息,元数据
docker exec -it 容器id /bin/bash //进入容器后进入新的终端
docker attach 容器id //进入容器正在执行的
docker cp 容器id:容器地址 主机地址 //将容器中指定目录的数据拷贝到主机指定目录下
docker commit -m="提交信息" -a="作者" 容器id 镜像名 //如果想保存当前的容器状态,就可以使用commit命令生成一个新的镜像
使用运行镜像
//使用docker安装elasticsearch
//拉取elasticsearch镜像,没指定版本,默认拉取最新的
docker pull arm64v8/elasticsearch:7.17.4
//查看镜像是否拉取成功
docker images
//启动一个elasticsearch镜像,容器名称:elasticsearch01,连接网络名称:wangpeng_net
//映射端口 9200、9300
//设置环境变量为单机模式
//设置卷挂载
docker run --name elasticsearch01 --net wangpeng_net -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -v elasticsearch:/usr/share/elasticsearch/config -d -e ES_JAVA_OPTS="-Xms256m -Xmx256m" 5acf0e8da90b
//查看容器是否启动成功
docker ps
//查询启动日志
docker logs 容器ID
//访问路径:http://localhost:9200/
有此内容说明es启动成功
的挂载和数据卷同步
当我们启动容器之后可能需要修改一些容器内的配置,但是我们在不进入容器的基础上,如何快速方便的修改配置,又比如我们启动mysql镜像后,当容器停止后,数据也随之消失,那么又如何进行数据持久化操作呢?这时候我们需要用到挂载技术,将容器内指定目录与宿主机指定目录做映射。
目录挂载,之后外部的文件会自动同步到容器内,容器内的文件也会自动同步到容器外,可以多次-v 多次挂载
//这种情况下是指明了外部映射路径
docker run -it -v /home/test:/home centOS /bin/bash
//匿名挂载,这种情况下没有指定外部映射路径,docker会默认给他指定一个目录,一般在:/var/lib/docker/volumes/容器名字/_data
docker run -it -v /home/test centOS /bin/bash
//仅读,仅可以通过宿主机操作
docker run -it -v /home/test:/home:ro centOS /bin/bash
//可读可写
docker run -it -v /home/test:/home:rw centOS /bin/bash
//查看所有的卷情况
docker volume [options] inspect
//例如:查询所有的卷挂载信息
docker volume ls
//查询某个卷的详情
docker volume inspect 卷名
//创建一个卷
docker volume create 卷名
//具名挂载
docker run -it -v 卷名:/home/test::/home centOS /bin/bash
//使用--volumes-from进行容器路径自动同步
//先创建一个redis容器
docker run -d --name redis01 -p 6379:6379 f16c30136ff3
//再次启动一个容器,使用--volumes-from命令同步redis01中的数据
docker run --name redis02 -p 6378:6379 --volumes-from redis01 -d f16c30136ff3
//此时,我们进入redis01容器创建aaa.txt,然后退出redis01容器,进入redis02容器,发现redis2中也存在aaa.txt
//然后我们在redis02中创建02.txt,然后退出redis02进入redis01容器中,发现redis01中存在02.txt文件
验证截图
在使用运行镜像,并连接一章中,我们使用了挂载将的/usr/share//目录映射到外部指定目录,然后修改其中的.yml后直接启动容器就可以达到修改容器内部内容的目的
网络命令
在安装后,我们通过命令可以看到本机是有一个的网络的,这是的一个默认网络,如果启动容器没有指明网络的话,则默认是网络。
但是有一个问题就是我们当两个容器或者多个容器连接到网络中时,容器与容器之间只能通过ip进行访问,并不支持通过容器名进行连接。容器一旦重新启动,则对应的ip就会修改,这样很不方便
容器与容器之间连接也可以使用–link,但是这已经是过时的命令了。
原因在于如果一个容器启动的时候使用–link连接的另一个容器,那么当前容器是可以访问另一个容器的,这可能能达到我们的目的,但是对于另一个容器却无法连接此容器,因为–link命令只能单向连接,其中的原理其实也很简单,就是修改了容器中的host文件,将ip与容器名进行了映射。
基于以上的问题,我们可以使用的网络命令创建一个桥接模式的网络,在创建的网络中可以解决以上的问题,例如:通过容器名进行直接连接。
在使用运行镜像,并连接中我们就将容器连接到了容器,使之能够访问。
docker network create //创建一个网络
docker network inspect 网络id //查看网络的详细信息
docker network ls //列出当前系统中的所有网络
docker network connect 网络id 容器id //将已有容器连接到一个网络
docker network disconnect 网络id 容器id //从网络中断开一个容器
docker network rm 网络id //删除一个或多个网络
docker network prune //删除所有未使用的网络
使用网络创建内部网络
docker network create wangpeng_net //创建一个桥接网络
docker network ls //展示已经创建的网络
使用运行镜像,并连接
//先随便启动一个kibana镜像,目的是为了复制容器中的config文件,里面有kibana的yml配置
docker run --name kibana -d -p 5602:5601 --net wangpeng_net d0cb4cc865b8
//使用复制命令将容器中的config文件复制到宿主机指定文件下
docker cp kibana:/usr/share/kibana/config /Users/wangpeng/workspace/kibana
//停止随机启动的容器并删除
docker stop 容器ID
docker rm 容器ID
//查看宿主机指定文件夹的文件并赋值权限
chmod 777 /Users/wangpeng/workspace/kibana/config
//使用net命令连接到wangpeng_net,elasticsearch也已经连接
//如果这里elasticsearch没有连接,可以使用docker network connect wangpeng_net 容器id
//重新启动一个容器并做数据卷绑定,此时注意,由于我们启动elasticsearch的时候容器名字叫elasticsearch01
//所以在kibana的yml中需要修改elasticsearch.hosts: ["http://elasticsearch01:9200"] 这里需要与容器名一样
docker run --name kibana01 -d -p 5602:5601 --net wangpeng_net -v /Users/wangpeng/workspace/kibana/config:/usr/share/kibana/config d0cb4cc865b8
//启动完后访问kibana
如果出现: is not ready yet这种情况,大概率是因为没有连接到容器,我们可以检查的yml中的.hosts是否正确。
连接es成功页面
如何编写以及如何构建镜像
是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。由多条指令构成,中的每一条指令都会对应于镜像中的每一层。
大致由四部分组成:
基础镜像信息(基于哪个镜像)维护者信息(比如姓名啥的)镜像操作指令容器启动时执行指令(cmd[“/root/run.sh”] 、都是系统启动时,第一个加载的程序/脚本/命令)
命令
意义
FROM [镜像]
指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令,例如:7。
[名字]
当前镜像信息(可写可不写)
RUN命令
每一条RUN后面跟一条命令,在所基于的镜像上执行命令,并提交到新的镜像中。
CMD [“要运行的程序”,“参数1”、“参数2”]
指定启动容器时需要运行的命令或者脚本,只能有一条CMD命令,如果指定多条则只能执行最后一条,“bin/bash”也是一条CMD,并且会覆盖image镜像里面的cmd。
[端口号]
指定新镜像加载到时要开启的端口暴露端口。启动的时候我们还需要使用-p命令进行映射
ENV [环境变量] [变量值]
设置一个环境变量的值,会被后面的RUN使用。容器可以根据自己的需求创建时传入环境变量,镜像不可以。
ADD [源文件/目录] [目标文件/目录]
①将源文件复制到目标文件,源文件要与位于相同目录中,②或者是一个URL,③若源文件是压缩包则会将其解压缩
COPY [源文件/目录] [目标文件/目录]
将本地主机上的文件/目录复制到目标地点,源文件/目录要与在相同的目录中,copy只能用于复制,add复制的同时,如果复制的对象是压缩包,ADD还可以解压,copy比add节省资源
[“目录”]
在容器中创建一个挂载点,简单来说就是-v,指定镜像的目录挂载到宿主机上。
USER [用户名/UID]
指定运行容器时的用户
[路径]
为后续的RUN、CMD、指定工作目录,相当于是一个临时的”CD”,否则需要使用绝对路径,例如 /opt。移动到opt目录,并在这下面的指令都是在opt下执行。
[命令]
指定所生成的镜像作为一个基础镜像时所要运行的命令
健康检查
build构建命令:
示例:
docker build -t abs-svc-zqesp:1.0.0 .
#基于dockerfile文件构建镜像命令
完整的写法: docker build -f dockerfile -t nginx:new .
docker build : 基于dockerfile 构建镜像
-f :指定dockerfile 文件(默认不写的话指的是当前目录)
-t :(tag) 打标签 ——》nginx:new
. :专业说法:指的是构建镜像时的上下文环境,简单理解:指的当前目录环境中的文件
使用构建一个镜像并运行
我随便找了一个项目然后打成jar包
FROM openjdk:8
MAINTAINER wangpeng1017@139.com
WORKDIR /usr/local/java
EXPOSE 9361
ENTRYPOINT [ "java", "-jar", "/usr/local/java/abs-svc-zqesp-2.0-SNAPSHOT-20230711100216.jar"]
//构建Dockerfile,切换到Dockerfile所在的目录
docker build -t abs-svc-zqesp:1.0.0 .
//如果我们在运行的时候不挂载命令中的路径,会出现:Unable to access jarfile sky-business-server-1.0.0-SNAPSHOT.jar
//原因是因为:docker运行的时候会去找/usr/local/java/sky-business-server-1.0.0-SNAPSHOT.jar,但是此时外部环境和内部环境磁盘是不共享的,需要我们配置一下
//我们也可以适用add命令将jar包复制到容器中然后运行
docker run -d -p 9361:9361 -v /Users/wangpeng/Downloads/docker1:/usr/local/java --name abs-svc-zqesp d4f76eae051d
build镜像结果
运行容器结果
工作之余花了两天的时间把常用的一些命令复习了一遍,为之后的k8s做一下铺垫。以上只是的一些很常见的命令和使用,并不代遍已经精通了,想要精通,还有一条很长的路要走~
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666