Docker与自动化部署
Docker安装与基本使用 虚拟机系统centOS7 mini Docker的应用场景 1.简化配置,同一Docker的配置可以在不同 环境中使用,降低了硬件要求和应用环境之间的耦合度.2.代码的流水线管理.代码从开发者的假期到最终在生产环境上的部署,需要经过很多的中间环境.而每一个中间环境都有自己微小的蛤贝,Docker给应用提供一个从开发到上线均一致的环境,让代码的流水线变得简单.3.提高开发效率4.隔离应用,使应用松耦合5.快速部署docker [CMD] [options]基本命令与释义attach进入到正在运行的容器build由Dockerfile构建镜像commit由容器的改变创建一个新的镜像cp在容器中复制文件或文件夹到本地文件或文件夹中.logs获取容器日志network管理Docker网络node管理Docker集群节点pause暂停一个或多个容器内的所有进程port列表端口映射或用于容器的特定的映射ps列出容器pull从镜像仓库中拉出镜像push上传镜像rename重命名镜像restart重启一个容器rm 删除容器rmi删除镜像run在容器中运行命令search在Docker Hub中查找镜像service管理Docker服务start启动停止的容器stats显示容器的实时流资源使用统计信息stop停止正在运行的容器swarm管理Docker集群tag将镜像标记到存储库中top显示容器的正在运行的进程volume管理Docker卷 docker run [options]常用参数与释义(主要介绍docker run) -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;-d: 后台运行容器,并返回容器ID;-i: 以交互模式运行容器,通常与 -t 同时使用;-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=[]: 开放一个端口或一组端口; 1.安装Docker2.加入开机启动3.启动Docker4.下载镜像5.查看本地镜像6.启动容器7.查看容器 搭建本地镜像仓库 仓库IP 192.168.247.142 1.拉取registry镜像 2.启动镜像仓库容器并且映射虚拟机端口5000和容器端口5000 3.将本地目录/opt/data/registry挂载到容器内目录/tmp/registry中 4.用busybox做试验 5.在需要拉取镜像的虚拟机上创建/etc/docker/daemon.json(这一步很关键,解决的http和https服务冲突问题) 6.向私有仓库中上传镜像 docker的网络配置 1.查看docker的所有网络 2.指定查看bridge网络的配置 3.启动两个busybox做实验,分别是container1和container2 4.再次查看bridge,这时可以看到container1和container2已经被加入bridge中了 5.也可以进入到container1中,用ifconfig查看网络配置6.ping7.8.自建桥接模式的网络isolated_nw9.查看网络能看到已经建立的isolated_nw10.启动container3时指定网络isolated_nw,则可以加入自建网络中 Tomcat与Mysql 这部分我把网上的教程基本都做了一遍,但是由于我对javaweb项目的结构了解不透彻,web应用部署也不熟悉,所以没能达到预期的要求。以下我分别列出Tocmcat和Mysql容器的启动和使用。还有部分参数解释。 docker run -it –rm -p 8888:8080 tomcat:8.0 虚拟机端口:容器端口 tomcat镜像指定 docker run –name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag指定容器名,mysql密码,镜像 将mysql与web应用容器相连的命令是:docker run –name some-app –link some-mysql:mysql -d application-that-uses-mysql启动web应用容器,用–link连接mysql容器 官方文档指出,–link几乎已经废弃 单容器应用部署实践 说明:部署一个单页面的应用参考网址:https://github.com/docker/labs/blob/master/beginner/chapters/votingapp.md 1.启动容器会自动下载dockersanples/static-site镜像 2.启动容器 3.查看端口 4.查看容器运行情况 5.在浏览器中输入地址和端口号,就可以看到网页 6.创建文件夹flask-app 7.flask-app下有四个文件 8.构建镜像 9.启动容器,将虚拟机8888端口映射到容器的5000端口 10.在浏览器中输入网址,查看运行效果 多容器应用部署实践 说明:用docker compose和docker deploy stack 部署参考网址:https://github.com/docker/labs/blob/master/beginner/chapters/votingapp.md应用说明:该应用基于以下镜像搭建PythonNode.jsredis.netpostgress 1.下载工程 2.创建Docker Swarm 3.docker stack deploy是在Docker Swarm模式下docker-compose的替代 4.查看启动的服务 5.查看容器的运行情况 6.浏览器中输入虚拟机地址,这是5000端口,是投票服务 7.浏览器中输入虚拟机地址,这是5001端口,投票统计服务 8.镜像更新,只需要修改虚拟机中的配置文件9. 10.重启app 11.在浏览器中查看运行情况 12.13.14. Kubernetes安装和配置 1.创建多台centOS7 mini 系统的虚拟机备用2.修改主机名3.设置hosts4.关闭防火墙5.安装etcd6.修改etc配置文件/etc/etcd/etcd.conf7.安装Docker8.修改配置/etc/sysconfig/docker9.将Docker设为开机启动项,启动Docker10.安装Kubernetes11.修改/etc/kubernetes/apiserver12.修改/etc/kubernetes/config13.启动服务并设置开机项自启动14.修改/etc/kubernetes/config15.修改/etc/kubernetes/kubelet16.启动服务并设置开机自启动17.在master上查看节点和各节点状态18.安装flannel19.修改配置/etc/sysconfig/flanneld 用kubeadm安装kubernetes并且部署微服务 因为GFW问题导致遇到很多下载失败问题 1.安装Docker 2.安装k8s工具包 3.kubeadm 初始化 Kuberbernetes基础概念 Pod Pod是Kubernetes的最小操作单元,一个Pod可以由一个或多个容器组成;同一个Pod只能运行在同一主机上,共享相同的volumes,network,namespace ReplicationController(RC) RC用来管理Pod,一个RC可以由一个或多个Pod组成,在RC被创建后,系统会根据定义好的副本数来创建Pod数量.在运行过程中,如果Pod数量小于定义的,就会重启停止的或重新分配Pod,反之则kill多余的.当然,也可以动态伸缩运行的Pods规模或熟悉. Service Service定义了一个Pod逻辑集合的抽象资源,Pod集合中的容器提供相同的共而过.集合根据定义的Label和Selector完成,当创建一个Service后,会分配一个ClusterIP,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡. Label Label是用于区分Pod,Service,RC的key/value键值对;Pod,Service,RC可以有多个label,但是每个label的key只能对应一个;主要是将Service的请求通过label转发给后端提供服务的Pod集合. kubectl 客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口. kube-apiserver 作为整个系统的控制入口,以REST API服务提供接口. kube-controller-manager 用来执行整个系统中的后台任务,包括节点状态状况,Pod个数,Pods和Service的关联等. kube-scheduler 负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点. etcd 负责节点间的服务发现和配置共享. kube-proxy 运行在每个计算节点上,负责Pod网络代理.定时从etcd获取到service信息来做相应的策略. kubelet 运行在每个计算节点上,作为agent,节后分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver. DNS 一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就都可以通过DNS访问服务了.