yum install docker -y
安装完成后,运行下面的命令可以启动Docker并设置开机启动:chkconfig docker onservice docker start
执行下面的命令可以验证安装是否正确:docker run hello-world
如安装正确,你将看到以下信息:Unable to find image "hello-world: latest" locallyTrying to pull repository docker.io/library/hello-world ...latest: Pulling from docker.io/library/hello-world9db2ca6ccaee: Pull completeDigest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdcStatus: Downloaded newer image for docker.io/hello-world:latestWARNING: IPv4 forwarding is disabled. Networking will not work.Hello from Docker!This message shows that your installation appears to be working correctly.To generate this message,Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.( amd64)3. The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client,which sent itto your terminal.To try something more ambitious,you can run an Ubuntu container with:$ docker run -it ubuntu bashShare images, automate workflows,and more with a free Docker ID:https://hub. docker.com/For more examples and ideas, visit:https://docs.docker.com/engine/userguide/
Docker 镜像前面讲Docker概念时就提到了,我们可以将环境容器打包到Docker容器中执行,而在容器中执行的载体就是镜像1.拉取镜像通过命令docker pull就可以从 Docker仓库中拉取镜像,Docker 的默认仓库为Docker Hub那么如何配置国内加速镜像?(1)修改/etc/docker/daemon.json,加入以下内容R:{ "registry-mirrors": ["https : / /9cpn8tt6.mirror.aliyuncs.com"] ]}
(2)重启 Docker我们可以举个例子,拉取Java镜像:docker pull java
执行该命令后,Docker 会默认从Docker Hub下载最新的Java镜像由于网络原因,可能需要等一段时间当出现如下信息后,说明镜像拉取完成:Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8cOe9d Status:Downloaded newer image for docker.io/java: latest
我们还可以指定镜像版本,如:docker pull java:7
这样Docker就会下载版本为7的Java镜像2.创建镜像实际生产中,我们要将环境应用部署到 Docker 容器中,这就需要创建它的镜像镜像的创建主要有3种方式:基于容器、基于本地模板导入和基于Dockerfile文件本书主要讲解基于Dockerfile创建镜像,因为实际生产中,我们大多数是通过 Dockerfile来构建应用镜像的我们以Nginx为例,从 Docker Hub拉取Nignx镜像并改变首页内容(1)编写文件命名为Dockerfile,输入如下内容:FROM nginxRUN echo '<h1>Nginx Hello world!</h1>' >/usr/share/nginx/html/index.html
(2)在 Dockerfile文件所在目录执行以下命令:docker build -t nginx .
等待一段时间后,看到以下内容:Successfully built a3c8cee6148b
说明镜像创建成功通过docker images命令可以查看刚才创建的镜像:[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx latest b8cd84ec56e7 About an hour ago 109MB
3.查看及搜索镜像查看镜像非常简单,执行以下命令即可:docker images
执行后会看到镜像列表,如:此外,通过命令docker search可以搜索指定镜像,如:docker search java
我们将看到Docker Hub包含的所有名为Java的镜像列表:4.删除镜像我们可以通过镜像名或镜像ID删除镜像,基本命令为docker rmi例如删除java:7的镜像:docker rmi docker.io/java:7
或者:docker rmi d23bdf5b1b1b
其中 d23bdf5b1b1b为要删除的镜像ID,镜像ID通过docker images获取 Docker容器Docker 的另一大核心便是容器,前面我们讲过,创建或拉取的镜像需要放到容器里面才能运行,那么怎么将镜像运行到容器里呢?1.创建容器和启动容器容器的创建和启动很简单,通过docker run命令即可,如果输入的容器名称不存在,会自动创建一个容器如果存在,就会直接启动该容器例如启动运行上一节构建的Nginx镜像:docker run -d -p 91:80 nginx
其中-d表示后台运行,-p用于指定容器运行端口,第一个端口为物理主机的端口,第二个端口为容器的端口因为外部访问只能访问物理主机的端口,所以我们需要指定它启动完成后,通过浏览器访问地址“IP:91”可以看到如图15-1所示的界面我们还可以通过docker ps命令查看启动的容器:此外,通过docker ps -a命令能够查看所有的容器2.进入容器和删除容器容器创建后可以通过docker exec命令进入容器,如:docker exec -it 806d1021575d /bin/bash
删除容器也很简单,通过命令docker rm即可:docker rm 806d1021575d
其中,806d1021575d为容器ID注意,启动中的容器是无法删除的,如果提示删除失败,需要先通过命令停止容器: docker stop容器ID,相反,启动容器的命令为: docker start容器IDK8S集群环境搭建从本节开始,我们将进入一个非常神奇的世界,利用K8S快速搭建分布式集群环境,并实现分布式系统的部署K8S全称Kubernetes,是谷歌开源的一套用于搭建分布式集群应用环境的平台,它基于Docker,和 Docker配合可以很方便地部署分布式应用在进行K8S分布式集群部署之前,首先应先搭建集群环境环境准备本文集群使用单台虚拟机做演示,即将Master和Node都部署到一台机器上,实际中可以由多台服务器做集群虚拟机在上一章已经安装完成,采用CentOS 64位操作系统,内存为2GB由于我们是在个人计算机上安装Linux虚拟机,资源有限,所以用一台虚拟机模拟集群环境,实际中的集群环境搭建和单机模拟是一样的操作下面就是本文虚拟机的环境配置IP:172.20.10.2操作系统:CentOS7.4内存:2GB集群搭建首先,我们需要安装Docker(前面已经安装了Docker,此处省略)然后,我们来安装etcdR,执行以下命令:yum install etcd -y
启动etcd:systemctl start etcdsystemctl enable etcd
输入如下命令查看etcd健康状况:etcdctl -C http://localhost:2379 cluster-health
如果出现以下内容,说明etcd没有问题:member 8e9e05c52164694d is healthy: got healthy result from http://localhost:2379cluster is healthy
接着安装K8S,执行命令:yum install kubernetes -y
安装好后,编辑文件/etc/kubernetes/apiserver,将KUBE_ADMISSION_CONTROL后面的ServiceAccount去掉,如:KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny, ResourceQuota"
接下来分别启动以下程序(Master ):systemct1 start kube-apiserversystemctl enable kube-apiserversystemctl start kube-controller-managersystemctl enable kube-controller-managersystemctl start kube-schedulersystemctl enable kube-scheduler
最后,启动Node节点的程序:systemctl start kubeletsystemctl enable kubeletsystemctl start kube-proxysystemct1 enable kube-proxy
这样一个简单的K8S集群环境就已经搭建完成了,我们可以运行以下命令来查看集群状态:[root@localhost ~]# kubectl get noNAME STATUS AGE127.0.8.1 Ready 1h
该集群环境目前还不能很好地工作,因为需要对集群中 pod的网络进行统一管理,所以需要创建覆盖网络flannel(1)安装flannel:yum install flannel -y
(2)编辑文件/etc/sysconfig/flanneld,增加以下代码:FLANNEL_OPTIONS=" --logtostderr=false --log_dir=/var/log/k8s/flannel/--etcd-prefix=/atomic.io/network --etcd-endpoints=http:/ / localhost:2379 --iface=ens33"
其中--iface对应的是网卡的名字(3)配置etcd中关于flanneld 的 key因为flannel使用etcd进行配置来保证多个flannel实例之间配置的一致性,所以需要在etcd上进行如下配置:etcdctl mk /atomic.io/network/config '{"Network" : "10.0.0.0/16" }'
/atomic.io/network/config这个key与上文/etc/sysconfig/flannel中的配置项是相对应的,错误的话启动就会出错Network是配置网段,不能和物理机IP冲突,可以任意定义,尽量避开物理机IP段(4)启动修改后的flannel,并依次重启Docker和 Kubernetes :systemctl enable flanneldsystemctl start flanneldservice docker restartsystemctl restart kube-apiserversystemctl restart kube-controller-managersystemctl restart kube-schedulersystemct1 enable flanneldsystemctl start flanneldservice docker restartsystemctl restart kubeletsystemctl restart kube-proxy
这样我们将应用部署到Docker容器中时,就可以通过物理IP访问到容器了分布式应用部署本节中,我们就可以开始部署一个分布式应用了(实际中的集群是一个Master对应多个Node,通过K8S会通过Master 将 Docker镜像随机分配到不同的Node 中)接下来,以注册中心register为例来讲述K8S的应用部署1.构建应用镜像首先将register打包并上传到服务器上,并编写Dockerfile:#下载Java 8的镜像FROM java:8#将本地文件挂到到/tmp目录VOLUME /tmp#复制文件到容器ADD register.jar /register.jar#暴露8101端口EXPOSE 8101#配置启动容器后执行的命令ENTRYPOINT ["java", "-jar", " /register.jar"]
然后通过docker build命令创建镜像:docker build -t register .
如果构建成功,你将看到以下内容:Sending build context to Docker daemon 1.019 GBStep 1/5 : FROM java: 8--->d23bdf5b1b1bStep 2/5: VOLUME /tmp--->[Warning]IPv4 forwarding is disabled. Networking will not work.--- > Running in 63ddece53c5e--->015fedfaf379Removing intermediate container 63ddece53c5eStep 3/5 :ADD register.jar /register.jar---> aaed606aa239Removing intermediate container 940f70c5bddeStep 4/5 :EXPOSE 8101--->[warning] IPv4 forwarding is disabled. Networking will not work.---> Running in ca6e30c82996--->22856e75b953Removing intermediate container ca6e30c82996Step 5/5 :ENTRYPOINT java -jar /register.jar--->[Warning]IPv4 forwarding is disabled.Networking will not work.---> Running in60636581cda9--->901d6123e0b7Removing intermediate container 60636581cda9Successfully built 901d6123e8b7
这时执行命令docker images就将看到刚才构建的镜像,如:[root@localhost ~]#docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEregister latest 9bc4a8542033 About an hour ago 712 MB
2.利用K8S部署应用(1)创建rc文件register-rc.yaml :apiVersion: v1kind: ReplicationControllermetadata:name: registerspec:#节点数,设置为多个可以实现负载均衡效果replicas: 1selector:app:registertemplate:metadata:labels:app: registerspec:containers:- name: register#镜像名image: register#本地有镜像就不会去仓库拉取imagePullPolicy: IfNotPresentports:- containerPort: 8101
在上述文件中,image为要拉取的镜像名,意为拉取register镜像; imagePullPolicy为镜像拉取策略,可选值有 Always(每次都从仓库拉取一次镜像,无论镜像是否存在)、Never(不拉取镜像,无论镜像是否存在)、工fNotPresent(本地镜像不存在时才会进行拉取); containerPort为容器内部启动端口(2)执行以下命令创建pod:[root@localhost ~]# kubectl create -f register-rc.yamlreplicationcontroller "register" created
(3)创建成功后,我们可以查看pod:[root@localhost ~]#kubectl get poNAME READY STATUS RESTARTS AGEregister-lsk2g 0/1 containerCreating 0 3s
ContainerCreating 提示正在创建中,这时运行命令kubectl describe po register-lsk2g可以查看创建日志:读者请注意看加粗字体部分,提示redhat-cat.crt不存在,我们先通过ll命令查看下该文件:[ root@MiNiFi-R3-srV ~]# ll /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crtlrwxrwXrwx 1 root root 27 7月 31 22:53/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt ->/etc/rhsm/ca/redhat-uep.pem
可以发现该文件是个链接文件,它指向的是/etc/rhsm/ca/redhat-uep.pem,而这个文件发现确实不存在,那这个文件又是怎么来的呢?答案就在这个路径里,我们需要安装rhsm这个软件,执行命令安装:yum install rhsm -y
安装完成后,执行1l命令查看该文件是否存在:[ root@MiwiFi-R3-srv ~]# ll /etc/rhsm/ca/redhat-uep.pemls:无法访问/etc/rhsm/ca/redhat-uep.pem:没有那个文件或目录我们发现,依然没有该文件不过没关系,我们可以手动创建:touch /etc/rhsm/ca/redhat-uep.pem执行完以上操作后,我们先将rc删除,再创建:[root@MiwiFi-R3-srv ~]# kubectl delete rc registerreplicationcontroller "register" deleted[root@MiwiFi-R3-srv ~]# kubectl create -f register-rc.yamlreplicationcontroller "register" created等待一段时间后,重新查看po,我们发现已经成功启动:[root@MiwiFi-R3-srv ~]# kubectl get poNAME READY STATUS RESTARTS AGEregister-hdmxs 1/1 Running 0 1m
这时,我们还无法通过局域网访问应用,还需要创建服务:(1)创建文件register-svc.yaml :apiVersion : v1kind: Servicemetadata:name: registerspec:type: NodePortports:- port: 8101targetPort: 8101nodePort: 30001selector:app: register
在上述文件中,nodePort为节点暴露给外部的端口,即外部是通过该端口访问容器的,端口范围为30000~32767,否则无法创建服务;targetPort为目标端口,即外部通过nodePort访问容器内部开启的哪个端口.(2)执行命令以创建服务:[root@MiwiFi-R3-srv ~]# kubectl create -f register-svc.yamlservice "register" created
(3)我们可以查看刚才创建的服务:[root@localhost ~]#kubectl get svcNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes 10.254.0.1 <none> 443/TCP 1hregister 10.254.68.212 <nodes> 8101: 30001/TCP 1h
这时,我们就可以通过172.20.10.2:30001访问应用了,如图15-2所示如果访问不到,需要关闭防火墙:systemctl stop firewalldiptables -P FORWARD ACCEPT
至此,通过 K8S部署应用就大功告成了在实际的生产环境中,可能会有一个 Master管理多个Node,和本章讲述的原理一样,只是对应在不同机器上而已通过 kubectl创建pod和 service,Master会随机分配到不同服务器上,通过K8S来部署分布式应用就变得非常简单通过本章的一系列操作,我们可以利用Jenkins实现系统的自动化部署,结合上一章的操作步骤,将本章讲解的K8S发布步骤编写成一个脚本,利用Jenkins自动执行脚本就能完成系统的自动化部署小结通过本章的学习,读者可以了解到 Docker+K8S搭建集群环境的全过程,亦可独立完成集群环境的搭建,并能利用K8S部署微服务应用本文给大家讲解的内容是springcloud实战:使用Kubernetes部署分布式集群觉得文章不错的朋友可以转发此文关注小编;感谢大家的支持!(图片来源网络,侵删)
0 评论