1、 南京第五十五所技术开发有限公司 云计算开发服务平台 用户手册 版本:先电 paas-v2.1 发布日期:2017年4月21日 南京第五十五所技术开发有限公司 版本修订说明 修订版本 修订时间 修订说明 Cloud-paas-v1.2 2014年3月7日 云计算开发服务平台用户手册。 Cloud-paas-v1.3 2015年11月8日 新增框架说明,增加框架结构图。 Cloud-paas-v1.3.1 2016年1月18日 修订GRE网络下的PaaS平台搭建 Cloud-paas-v1.4 2016年
2、4月12日 软件包修改mongodb和ActiveMQ安装脚本 Cloud-paas-v2.0 2016年12月15日 升级Docker作为服务平台底层 Cloud-paas-v2.0.5 2017年3月13日 更新国际化 Cloud-paas-v2.1 2017年4月21日 Jenkins结合gogs实现持续化集成 目 录 1、 Docker基础架构与环境说明 6 1.1 Docker架构及基本组件 6 1.2、系统要求 10 1.3、设备说明 10 1.3.1、网络说明 11 1.3.2、基础环境配置 11 2、容器服务管理平台Rancher安
3、装搭建 12 2.1、Docker软件包安装配置 12 2.2、配置Docker 配置文件 12 2.3、启动服务 12 2.4、配置镜像仓库 12 2.5、镜像、容器服务基本操作 13 2.5.1 获取镜像操作 13 2.5.2 容器操作 15 2.5.3 终止容器 18 2.5.4 进入容器 18 2.5.5 容器内部操作 19 2.5.6 查看容器日志及相关操作 20 2.5.7 导出和导入容器 23 2.5.8 删除容器 24 2.6、下载镜像 24 2.6.1 Server节点 24 2.6.2 client节点 24 2.7、启动容器服务 24
4、3、访问站点服务 24 3.1、浏览器访问 24 3.2、添加账号 25 3.3、添加主机 26 4、应用模板部署 27 4.1、内容管理系统(CMS) 28 4.1.1、通过主页选择应用 28 4.1.2、启动服务 29 4.1.3、等待应用部署完成 29 4.1.4、部署完成后的修改 29 4.2、博客系统 33 4.2.1、部署Ghost 33 4.2.2、部署Wordpress 34 4.3、Git系统 35 4.3.1、通过主页选择应用 35 4.3.2、启动服务 35 4.3.3、服务安装完成 36 4.3.4、完成安装 36 4.4、仪表盘系统
5、 38 4.4.1、通过主页选择应用 38 4.4.2、启动服务 38 4.4.3、等待应用部署完成 39 4.5、Jekins系统 40 4.5.1、通过主页选择应用 40 4.5.2、启动服务 40 4.5.3、等待应用部署完成 41 4.6、云网盘系统 41 4.6.1、通过主页选择应用 41 4.6.2、启动服务 41 4.6.3、等待应用部署完成 42 4.6.4、修改端口 42 4.6.5、访问服务 42 4.7、聊天系统 43 4.7.1、通过主页选择应用 43 4.7.2、启动服务 43 4.7.3、等待应用部署完成 43 5、Dockerf
6、ile定制镜像 45 5.1、利用 Commit 理解镜像构成 45 5.2、使用 Dockerfile 定制镜像 50 6、Jenkins结合gogs实现持续化集成 52 6.1.、部署环境 52 6.1.1、部署环境 52 6.1.2、Jenkins服务安装插件 52 6.2、配置Gogs 53 6.2.1、设定环境 53 6.2.2、创建名称为xiandian的仓库。 54 6.2.3、克隆仓库到本地 54 6.3、部署jenkins 54 6.3.1、配置系统管理远程连接SSH 54 6.3.2、创建项目 55 6.3.3、配置项目源码管理 55 6.3.
7、4、配置触发器 55 6.3.5、构建环境 56 6.4、构建主机配置 56 6.4.1、创建工作目录 56 6.4.2、编写Dockerfile 56 6.4.3、本地克隆镜像 57 6.5、测试环境 58 6.5.1、Jenkins持续集成测试 58 6.5.2、重新提交代码查看效果 59 1、 Docker基础架构与环境说明 1.1 Docker架构及基本组件 Docker是开发、测试、部署、运行应用的一个开放平台,目的让应用快速交付,快速上线。Docker遵循开源Apache 2.0协议。 Docker提供一个安全隔离用于打包和运行应用的轻量级环境—容器
8、Container),一个宿主机可以同时运行很多容器(数量远远超过虚拟机VM的方式)。 1)Docker引擎 Docker引擎Docker Engine是C/S架构,主要有以下部件组成:: 服务器(Docker daemon):后台运行的Docker daemon进程。Daemon进程用于管理Docker对象,包括镜像(images,)容器(containers)网络(networks)数据卷(data volumes)。 REST接口:同daemon交互的REST API接口。 客户端(Docker client):命令行(CLI)交互客户端。客户端使用REST API接口同Do
9、cker daemon进行访问。 图1.1 Docker服务的架构图 2)Docker平台组成 图1.2 Docker服务组成图 运行一个Docker服务,组成包括Docker daemon服务器、Docker Client客户端、Docker Image镜像、Docker Registry库、Docker Contrainer容器。 (1)Docker镜像: 是一个只读模板,用于创建Docker容器,由Dockerfile文本描述镜像的内容。镜像定义类似“面对对象的类”,从一个基础镜像(Base Image)开始。构建一个镜像实际就是安装、配置和运行的过程,Docker镜
10、像基于UnionFS把以上过程进行分层(Layer)存储,这样更新镜像可以只更新变化的层。Docker的描述文件为Dockerfile,Dockerfile是一个文本文件,基本指令包括: FROM:定义基础镜像。 MAINTAINER :作者或维护者。 RUN:运行linux 命令。 ADD:增加文件或目录。 EVN:定义环境变量。 CMD:运行进程。 (2)Docker容器: 是一个镜像的运行实例。容器有镜像创建,运行过程例如: 运行ubuntu操作系统镜像,-I 前台交互模型,运行命令为/bin/bash $ docker run -i -t ubuntu /bin/b
11、ash 运行过程如下: 拉(pull)镜像,Docker Engine 检查ubuntu 镜像是否存在,如果本地已经存在,使用该镜像创建容器,如果不存在,Docker Engine从镜像库拉镜像。 使用该镜像创建新容器。 分配文件系统,挂载一个读写层,在读写从加载镜像。 分配网络/网桥接口,创建一个网络接口,让容器和主机通信。 从可用的IP池选择IP地址,分配给容器。 执行命令/bin/bash。 捕获和提供执行结果。 (3)Docker 仓库: Docker仓库是Docker镜像库。Docker Registry也是一个容器。Docker Hub是Docker公司提供的
12、互联网公共镜像仓库。可以构建自己本地的镜像仓库,国内有些公司也构建了镜像仓库。包括阿里云、新浪等。Docker 集群服务:Docker集群服务运行承租的Docker节点一起工作。目前支持swarm模式。 一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。 一般而言,一个仓库包含的是同一个软件的不同版本的镜像,而标签则用于对应于软件的的不同版本。可以通过 <仓库名>:<标签> 的格式来指定具体是哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 以 Ubuntu 镜像 为例,ubunt
13、u 是仓库的名字,其内包含有不同的版本标签,如,14.04, 16.04。可以通过 ubuntu:14.04,或者 ubuntu:16.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如ubuntu,那将视为 ubuntu:latest。 最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。除此以外,还有 CoreOS 的 Quay.io,CoreOS 相关的镜像存储在这里;Google 的 Google Container Registry,Kubernetes 的镜像使用的就是这个服务。 由于某些原因
14、在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见的有 阿里云加速器、DaoCloud 加速器、灵雀云加速器等。 除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。在后续的相关章节中,会有进一步的搭建私有 Registry 服务的讲解。 开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,
15、足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 Docker Trusted Registry 中,提供了这些高级功能。 除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,VMWare Harbor 和 Sonatype Nexus。 1.2、系统要求 安装运行环境系统要求为Centos7, 内核版本不低于3.10。 Docker版本不低于1.10。 1.3、设备说明 安装PaaS的VM的网络IP采用I
16、aaS的外部IP,IP设置成静态IP。网络架构如下: 图:网络架构图 1.3.1、网络说明 设备名: 1) Server节点 主要作为系统的运行指令的发送节点。 server:10.0.6.80 2) Client节点 主要为服务运行的节点,可以使用一个或者多个均可。 client1:10.0.6.81 client2:10.0.6.82 3) Registry节点 主要作为系统所有的运行的镜像仓库节点。 registry:10.0.6.83 1.3.2、基础环境配置 在配置完网络接口之后,重启启动网络服务使更改生效: 1) 配置yum源 yum源
17、使用centos7和提供的docker目录的yum源,如: [root@registry ~]# vi /etc/yum.repos.d/docker.repo [centos] name=centos baseurl=file:///opt/centos gpgcheck=0 enabled=1 [docker] name=docker baseurl=file:///opt/docker/ gpgcheck=0 enabled=1 2) 删除iptables防火墙规则 # iptables –F iptables –X iptables –Z /usr/s
18、bin/iptables-save 3) 修改系统内核 打开内核转发功能。 编辑配置文件/etc/sysctl.conf,将以下内容添加: net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 修改完成后使用命令生效。 # sysctl –p 2、容器服务管理平台Rancher安装搭建 2.1、Docker软件包安装配置 所有节点安装docker环境。 # yum -y install docker-io 2.2、配置Docker 配置文件
19、 所有节点配置/etc/sysconfig/docker文件修改如下配置: ADD_REGISTRY='--add-registry 10.0.6.83:5000' INSECURE_REGISTRY='--insecure-registry 10.0.6.83:5000' 2.3、启动服务 # systemctl start docker.service systemctl enable docker.service 2.4、配置镜像仓库 将提供的软件包拷贝到镜像注册节点,而后进行如下操作: 首先切换到镜像存放目录 镜像仓库导入镜像。 # docker load
20、< registry_latest.tar # docker images查询上传的image id) #docker run -d -p 5000:5000 --restart=always --name registry registry:latest(只做一遍) # docker tag c9bd19d022f6(此处为上一步查看的上传镜像的ID值) 10.0.6.83:5000/registry:latest (默认提供的镜像导入格式为 文件名_版本号.tar格式,例如rancher_server_v1.1.4-xd.tar此镜像导入后修改的名称为 10.0.6.83:5000
21、/rancher/erver:1.1.4-xd, registry_latest.tar镜像导入后的结果为10.0.6.83:5000/registry:latest) # docker push 10.0.6.83:5000/registry:latest 以此类推上传其他的镜像到私有仓库内。 注: 或者我们可以根据提供的install.sh脚本安装docker 环境,只需要把提供的软件包和install.sh脚本上传到仓库节点,配置好各节点yum,运行install.sh脚本完成所有节点安装,根据提示完成相关操作。 (2.4 此步骤只需要在registry节点操作) 2.5、镜
22、像、容器服务基本操作 2.5.1 获取镜像操作 Docker Hub 上有大量的高质量的镜像可以用,从 Docker Registry 获取镜像的命令是 docker pull。其命令格式为: docker pull [选项] [Docker Registry地址]<仓库名>:<标签> 具体的选项可以通过 docker pull --help 命令看到,这里说一下镜像名称的格式。 1)从docker hub拉取ubuntu镜像 $ docker pull ubuntu:14.04.3 14.04.3: Pulling from library/ubuntu bf5d463153
23、22: Pull complete 9f13e0ac480c: Pull complete e8988b5b3097: Pull complete 40af181810e7: Pull complete e6f7c7e5c03e: Pull complete Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbe Status: Downloaded newer image for ubuntu:14.04.3 2)从私有库拉取ubuntu镜像 # docker pull 1
24、0.0.6.80:5000/ubuntu/14.04.3.3.tar:latest Trying to pull repository 10.0.6.80:5000/ubuntu/14.04.3.3.tar ... latest: Pulling from 10.0.6.80:5000/ubuntu/14.04.3.3.tar 3)查看ubuntu镜像是否下载到本地 # docker images REPOSITORY TAG IMAGE ID CREATED
25、 SIZE 10.0.6.80:5000/rancher/agent-instance v0.8.3.tar 6dccaa66a75d 6 months ago 330.9 MB 10.0.6.80:5000/rancher/agent v1.0.2.tar deb5c6987c83 6 months ago 454.3 MB 10.0.6.80:5000/ubuntu/14.04.3.3.tar latest
26、ebdc8e295a2e 11 months ago 187.9 MB 注意:本地镜像都保存在docker宿主机的/var/lib/docker目录下。 # cd /var/lib/docker/ # ll total 8 drwx------. 15 root root 4096 Dec 24 19:58 containers drwx------. 5 root root 50 Dec 23 14:47 devicemapper drwx------. 3 root root 25 Dec 23 13:02 image drwxr-x-
27、 3 root root 18 Dec 23 13:02 network drwx------. 6 root root 4096 Dec 24 19:58 tmp drwx------. 2 root root 6 Dec 23 13:02 trust drwx------. 3 root root 77 Dec 23 14:58 volumes 4)从镜像启动一个容器 例如启动ubuntu镜像 # docker run -t -i --name next_container ubuntu/14.04.3.tar:latest /bin/bash 2
28、5.2 容器操作 启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。 新建并启动所需要的命令主要为 docker run。 例如,下面的命令输出一个 “Hello World”,之后终止容器。 $ docker run ubuntu:14.04.3 /bin/echo 'Hello world' Hello world 这跟在本地直接执行 /bin/echo 'hello world' 几乎感觉不出任何区别。 下面的命令则启动一个 bash 终端,允许用户进行交互。 $ docker run -t -i ubuntu
29、14.04.3 /bin/bash root@af8bae53bdd3:/# 其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。 在交互模式下,用户可以通过所创建的终端来输入命令,例如 root@af8bae53bdd3:/# pwd / root@af8bae53bdd3:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var 当利用 docker run 来创建容器时,
30、Docker 在后台运行的标准操作包括: (1). 检查本地是否存在指定的镜像,不存在就从公有仓库下载。 (2). 利用镜像创建并启动一个容器。 (3). 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。 (4). 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。 (5). 从地址池配置一个 ip 地址给容器。 (6). 执行用户指定的应用程序。 (7). 执行完毕后容器被终止。 (8). 启动已终止容器。 可以利用 docker start 命令,直接将一个已经终止的容器启动运行。 # docker ps -a CONTAINER ID IM
31、AGE COMMAND CREATED STATUS PORTS NAMES 6f3bbb08549f ubuntu:14.04.3 "/bin/echo 'Hello wor" About a minute ago Exited (0)About a minute ago
32、 focused_northcutt 896ba7a2099d nginx "nginx -g 'daemon off" 2 hours ago Up 2 hours 443/tcp, 0.0.0.0:81->80/tcp web2 5a5fb3a18ea8 nginx "nginx -g 'daemon off
33、" 4 hours ago Up 4 hours 0.0.0.0:80->80/tcp, 443/tcp webserver 3bdab40bc301 ubuntu:latest "ip add show" 11 hours ago Created pedantic_wescoff ea59a492cf02
34、 192.168.200.11:5000/ubuntu/14.04.3.3.tar "latest ip add show" 11 hours ago Created furious_dubinsky cd507e407c1c jamtur01/consul "/usr/sbin/consul age" 11 hours ago Exited (1)10 hours
35、ago tiny_goldstine [root@client ~]# docker start cd507e407c1c cd507e407c1c 后台(background)运行: 更多的时候,需要让 Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现。 下面举两个例子来说明一下。如果不使用 -d 参数运行容器。 $ sudo docker run ubuntu:14.04.3 /bin/sh -c "while true; do echo hell
36、o world; sleep 1; done" hello world hello world hello world hello world 容器会把输出的结果(STDOUT)打印到宿主机上面 如果使用了 -d 参数运行容器。 $ sudo docker run -d ubuntu:14.04.3 /bin/sh -c "while true; do echo hello world; sleep 1; done" 77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a 此时容器会在后台运行并不会把输
37、出的结果(STDOUT)打印到宿主机上面(输出结果可以用docker logs 查看)。 容器是否会长久运行,是和docker run指定的命令有关,和 -d 参数无关。 使用 -d 参数启动后会返回一个唯一的 id,也可以通过 docker ps 命令来查看容器信息。 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 77b2dc01fe0f ubuntu:14.04.3 /bin/sh -c 'while tr
38、2 minutes ago Up 1 minute agitated_wright 要获取容器的输出信息,可以通过 docker logs 命令。 $ sudo docker logs [container ID or NAMES] hello world hello world hello world . . . 2.5.3 终止容器 可以使用 docker stop 来终止一个运行中的容器。 此外,当Docker容器中指定的应用终结时,容器也自动终止。 例如对于上一章节中只启动了一个终端的容器,用户通过 exit 命令或 Ctrl+d 来退出终端时,所创建
39、的容器立刻终止。 终止状态的容器可以用 docker ps -a 命令看到。例如 sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ba267838cc1b ubuntu:14.04.3 "/bin/bash" 30 minutes ago E
40、xited (0)About a minute ago trusting_newton 98e5efa7d997 training/webapp:latest "python app.py" About an hour ago Exited (0)34 minutes ago backstabbing_pike 处于终止状态的容器,可以通过 docker start 命令来重新启动。 此外,docker restart 命令会将一个运行态的容器终止,然后再重
41、新启动它。 2.5.4 进入容器 在使用 -d 参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括docker attach 命令等。下面示例如何使用docker attach命令。 $ sudo docker run -idt ubuntu 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED
42、 STATUS PORTS NAMES 243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia $sudo docker attach nostalgic_hypatia root@243c32535da7:/# 注意:使用attach进入容器需要ctry+c。但是使用 attach 命令有时候并不方便。当多
43、个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。 2.5.5 容器内部操作 检查容器主机名 root@1cec78443028:/# hostname 1cec78443028 查容器/etc/hosts文件 root@1cec78443028:/# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefi
44、x
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 1cec78443028
检查容器接口
root@1cec78443028:/# ip a
1: lo:
45、valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
9: eth0:
46、al eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:2/64 scope link valid_lft forever preferred_lft forever 检查容器的进程 root@1cec78443028:/# ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 18164 20
47、16 ? Ss 05:25 0:00 /bin/bash root 18 0.0 0.0 15564 1148 ? R+ 05:35 0:00 ps –aux 2.5.6 查看容器日志及相关操作 获取守护式容器的日志 [root@l-client ~]# docker logs ubuntu_container hello world hello world hello world hello world 跟踪守护式容器的日志 [root@l-client ~]# docker logs -f ubuntu_
48、container hello world hello world hello world hello world 跟踪守护式容器的最新日志 [root@l-client ~]# docker logs -ft ubuntu_container 2016-12-23T06:08:52.604010000Z hello world 2016-12-23T06:08:53.679457000Z hello world 在容器级别启动syslog [root@l-client ~]# docker run --log-driver="syslog" --name ubuntu_c
49、ontainer -d ubuntu:14.04.3.3 /bin/sh -c "while true; do echo hello world; sleep 1; done" 441c3de8dbcbfb09d9586c456d47417150dc7cdaf9cfb26597945b27a68bb310 查看守护式容器的进程 [root@l-client ~]# docker top ubuntu_container UID PID PPID C STIM
50、E TTY TIME CMD root 7356 965 0 06:26 ? 00:00:00 /bin/sh -c while true; do echo hello world; sleep 1; done root 7485






