失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【Docker1】指令 docker-compose Dockerfile 容器编排工具k8s

【Docker1】指令 docker-compose Dockerfile 容器编排工具k8s

时间:2020-03-22 13:04:25

相关推荐

【Docker1】指令 docker-compose Dockerfile 容器编排工具k8s

文章目录

1.pull/image,run/ps(进程),exec/commit2.save/load3.docker-compose3.1 link3.2 docker-compose .yml4.Dockerfile4.1 ENV4.2 LABEL5.k8s5.1.整个流程5.2 三个基础概念5.3 service之间如何互相通信5.4 service的虚拟ip到公网ip

1.pull/image,run/ps(进程),exec/commit

Docker是主要应用于linux和后台应用的虚拟机(和vmware像):由三部分构成:镜像(image)是像ubuntu镜像文件(iso,img文件),容器(ps)是一个正在运行的虚拟机,仓库是存放镜像文件场所(dockerhub)。

tar文件类似于vm使用时的vmdk文件,可将一个镜像直接保存成一个tar文件,别人load重新加载成一个镜像,run起来成了一个虚拟机。

Dockfile是一个很短的配置文件,通过写“如何构建”的步骤来指定一个镜像如何构建的,通过docker build指令可将Dockfile构建成一个镜像。仓库保存了一些公有镜像如ubuntu镜像,nginx镜像,mysql镜像,tomcat镜像等。

ubuntu安装命令:sudo apt install docker.io,网站:play with docker。

docker run -d -p 80:80 nginx上面才会出现80端口,点击80端口跳转到nginx网页首页。

docker run -d -p 81:80 nginx指定外部81端口同理点击81跳转到nginx网页首页(nginx的默认端口是80)。

如下再次点击外部80端口。

如下暂时用不到81,容器里内容修改后要commit成新镜像m1,和pull下来的nginx镜像并列。

当前目录自己新增index.html(里面写着wai bu de wen jian)和Dockerfile两文件,将原来nginx里面index.html替换了,如下vi Dockerfile。

点击外部100号端口如下:上面为dockerfile build成一镜像run成为一容器。

2.save/load

docker save +镜像id,不是容器id。docker rmi m2将m2镜像直接删除,提示有个容器基于这镜像无法删除,那将容器(container id)也删了。

删了容器还要删除镜像m2,docker load使m2镜像又从tar文件重新拿过来了。

如上行文件映射-v就是将一些静态文件放外面,在外面修改文件(因为是映射的)里面文件也会跟着变化。这个文件映射还会用于其他的一些数据保存,比如mysql的data目录也可以映射到外面,防止数据丢失。

3.docker-compose

组织一个多容器项目:宿主机(etho网卡)安装docker会生成一张docker网卡,docker网卡通过nat方式为每个容器分配ip。容器间同一网段可通过ip通信,容器和宿主机通信是通etho网卡转发路由过来(端口通信),通信方式主要是ip和端口进行通信。

如下curl…回车后打印出下面< html >…。以下就能获取nginx容器数据了,但这种方式需要登录一台机器查看ip,再登录另一台机器去配置这个ip,在实际生产中是不可行的。

3.1 link

以下为真正的生产过程中的通讯--link,先docker rm -f删除nginx和alpine两个容器,在alpine中ping myng(相当于域名)的话自动解析为myng的ip。

如下curl myng直接得到nginx的首页内容,浏览器将内容解析为界面。

3.2 docker-compose .yml

nginx需要到php中去解析,php需要到mysql中访问数据库,两个需要写link,且必须先创建mysql,再部署到其他机器重新输入整个指令麻烦。将这些指令记录到一个配置文件里统一配置,这就是docker-compose(需安装)。

网页会显示如下index.html文本字样。

创建test.php用来监测php是否运行成功。

如下phpinfo函数。

在外面创建的/root/html目录可以映射到nginx里面/usr/share/nginx/html如下,以.php结尾会走.php{}里。

如下简单说就是nginx.conf文件将外面.html和.php文件映射到nginx里面。

port就是-p参数,volumes就是-v参数,devilbox/…是dockerhub上搜索的。

如下是接着上面往后。

点击如下80端口。

访问根目录显示index.html,访问test.php中phpinfo()显示如下。

1.如下首先访问根目录即index.html,到nginx下读取/这个配置条件即会到/usr/share/nginx/html下读取,这个目录刚好映射到了外部的/root/html目录下,最后读取到了/root/html目录下的index.html返回。

2.怎么访问test.phptest.php也是进nginx匹配到了正则以php结尾,pass转发到php这台机器的9000号端口并且目录是/var/www/html,php这域名会解析到php容器ip,php容器的/var/www/html这个目录同样设置了映射到外部/root/html目录,返回test.php。

3.mysql.php同样到/root/html目录下mysql.php,mysql.php里会指定一条dbhost即数据库主机ip,主机ip指定的是mysql,在docker-compose中也配置了这个服务,根据mysql域名去解析刚好能解析到mysql的容器,到它的3306号端口,密码是123456,将登陆成功的消息返回回来。

4.Dockerfile

镜像像程序,容器像进程。

FROM:指定当前镜像基于哪个镜像,必填,一行就可以构建一个镜像。

WORKDIR:指定接下来shell语句运行在哪个路径下,如下alpine镜像下肯定没有/app这个目录,自动创建。

COPY:将当前宿主机文件拷贝到镜像中去。ADD和COPY相似,都是可以从外面复制到镜像里面,COPY一般源地址是文件系统源地址,ADD源地址不光是文件系统还可以是一个URL,如果没有用到网络资源,用COPY就行。

RUN:构建容器时运行这脚本,当前工作目录就是/app。

CMD:指定整个容器启动起来运行脚本,运行完后整个容器生命周期结束(tail -f 阻塞式)。ENTRYPOINT:和CMD一样指定容器启动起来的核心脚本,但既指定ENTRYPOINT又指定CMD,以哪个为准:ENTRYPOINT非json则以ENTRYPOINT为准,CMD无效。如果ENTRYPOINT和CMD都是json则ENTRYPOINT+CMD拼成一句shell。如下可以以json数组形式指定。

必须命名为Dockerfile。

如下指定镜像名test,最后的点表示dockfile文件位于当前目录下。

1.txt里面原本内容有123。

EXPOSE:指定当前镜像暴露出的一个端口,比如nginx镜像中指定EXPOSE暴露80端口。暴露好处是通过docker run -P将80端口映射到本机的随机端口,docker run --network=host模式的话会将80端口直接绑定到本机的80端口。

VOLUME:指定映射文件,VOLUME /a/b把容器中的/a/b这个目录映射到了宿主机的一个目录下。

4.1 ENV

指定参数方式:第一个是ENV直接指定当前容器的环境变量,环境变量可以在docker run中-e指定,也可以在Dockerfile中ENV直接指定,A=10和A空格10都一样。

第二个是ARG(本身就是参数意思),ENV和ARG有个本质区别:ENV是构建时一直到运行时都一直生效的环境变量,是系统的环境变量,ARG则是一个构建参数,只有在构建(docker build)时才有效,真正运行时无效了。

如下b=11默认为11,构建时指定。

4.2 LABEL

LABEL:对镜像没任何作用,只是标识,便于通过docker inspect指令找到这镜像

ONBUILD:接的参数可以是Dockerfile中其他任意参数

ONBUILD是当前镜像构建时候不会执行,基于当前镜像的镜像构建时候才会执行

5.k8s

5.1.整个流程

master下发给node指令是集群之间的语言(用户不懂),1.api server(进程,master有四个进程)会监听用户的指令进行操作master。用户的指令分为三种形式:第一种通过kubectl指令直接下发,第二种通过htttp接口将指令下发到node上进行容器的调度,第三种webui图形化界面填写配置或拖拽控件进行容器节点调度。

用户通过如上三种指令方式中任意一种,下发指令或配置文件到api server,api server只是一个传达作用。还要通过scheduler和controller-manager两个进行协调调度,这两个协调调度还要通过ETCD元数据支持,最后生成一个调度指令交给api server。api server最终将指令下发传达到这些节点,这些节点进行相应容器的创建,销毁或扩张等一些操作,状态更新完后实时汇报状态的更新到api server,api server再将状态记录到ETCD里,这就是大概流程。

2.ETCD进程:是kv数据库用来存储元数据信息,如各个节点状态,像zookeeper。

3.controller-manager进程:各种资源自动化的控制中心。

4.scheduler进程:调度实施者。

node即客户端中kubelet进程是直接和api server进行通信,kube-proxy进程是创建虚拟网卡,docker进程在实际调度机器时,机器上必须安装docker才能进行容器调度。

5.2 三个基础概念

如上方式不智能(如运维人员刚好有事,没收到消息),k8s用deployment(kubectl run指令创建)实现自动化运维。如下d1是deployment名字,--image指定运行的镜像,httpd镜像会启一个apache服务器,指定alpine版本。get查看资源是否启动成功。最终以docker形式在node节点上启动。

现在有个新问题,刚创建好的两个http容器没有做端口映射,如下现在要做对外暴露一个接口,做负载均衡。这就用到service。kube-proxy进程会在整个集群层面抽象出一张大的虚拟的交换机(如下紫色矩形),可创建ip,三个橘色pod统称为一个service。

5.3 service之间如何互相通信

docker-compose能实现多个dockers之间通信,但k8s中不再以docker为单位,以pod为单位,即services间如何进行通信?最简单的是通过ip进行通信,和docker-compose一样,ip是不可能记住的,也不可能每次都去配置ip,那该如何进行通信呢?在k8s中默认提供一个dns服务,将d1对应ip,所以只需要输入d1就能解析到ip。服务1:d1 httpd镜像服务2:d2 nginx镜像

如上是在d2容器中,如下d1是dns,解决了服务间相互调用问题。

5.4 service的虚拟ip到公网ip

dns解决了服务间相互调用问题,现有一个新问题:外界用户不知道服务抽象出来的虚拟ip(上图紫色矩形上的ip),用户只知道官网ip即master机器ip,用户能否通过一个ingress代理访问到虚拟ip。

如果觉得《【Docker1】指令 docker-compose Dockerfile 容器编排工具k8s》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。