热门标签: Docker Rancher Windows Server容器 存储 容器

【实战】Rancher环境下创建catalog

本文是一篇在Rancher环境下创建catalog的实战记录原创文章,跟大家分享了一些在实现过程中的步骤和之间遇到的问题,欢迎大家加群讨论:


一. 项目描述


在Rancher 的catalog界面中新加一个catalog,用这个catalog创建的stack可以正常工作。实现环境在局域网内四台vmware的ESX虚拟机中进行试验,其中A(192.168.4.33)机器上启动rancherServer,另外B(192.168.4.27)和C(192.168.4.46)通过AddHost的方式添加进来。B和C主机添加进去之后,对每个主机进行编辑,各自添加一个hostname=B和C的labels,本步骤是为了后面测试catalog的docker-compose.yml中指定在哪台机器上运行是否正确。D(192.168.4.12)主机作为Registry。选择添加进catalog的的应用是gotomycloud官网。(注释:gotomycloud是一款用于远程办公的远程PC控制软件  )


 二. 实现步骤


说明:GoToMyCloud Web项目主要有两个服务器组成:A: mysql数据库服务器此服务器用容器来代替,需要在容器启动的时候带动mysql服务程序,并在第一次启动时将数据库的表建出来。B:tomcat网页服务器需安装java和tomcat ,将GoToMyCloud网页代码做成java的war包放在tomcat的指定路径下,就可访问网页。war包中有个配置用于指定数据库的IP地址,地址在做war包的时候,为了利用容器之间的link关系,需要进行修改,将ip地址换成mysql服务器的容器名称,这里定下来用mysqlhost。(注释:GoToMyCloud是一款用于远程办公的远程PC控制软件  )

 具体的实现步骤如下

1.搭建私有registry;

2.编写Dockerfile,制作mysql和tomcat的镜像;

3.编写docker-compose.yml和rancher- compose.yml,为创建新的catalog做准备;

4.添加自定义的catalog到rancher UI中并测试。


1.搭建私有registry


搭建registry的步骤只有一步,运行如下命令就可以创建一个registry的容器:


在上面的这个命令中,一定要使用-v做个主机目录和regsitry目录的映射,这样的好处是容器崩溃了,数据依然还在,重建regsitry的话数据就可以恢复了。
客户端使用此registry时,如果不修改/etc/sysconfig/docker这个配置文件,会报“认证不过”的错误。在这个文件中找到OPTIONS这个key,在后面的值中加:--insecure-registry 192.168.4.12:80

保存后,通过service docker restart 就可以访问这个私有的Registry了。


2.制作镜像:


2.1 mysql镜像制作:
1.)使用docker pull ubuntu命令先取下一个ubuntu的镜像作为基础镜像;

2.)基于这个镜像使用docker run –name ubuntu_mysql –it bash命令创建一个容器,在这个容器中使用apt-get install mysql-server,安装过程中会提示输入密码这个使用Cloudsoar12,安装完成后,需要配置mysql允许外部主机访问,这里要改两个地方:

A. /etc/mysql/my.cnf中找到bind-addree=127.0.0.1这行,然后把他注释掉,然后重启mysql服务;

B.使用mysql进入服务器,设置mysql允许其他主机访问。

3. )将第二步中配置好的容器通过docker commit ubuntu 192.168.2.35:80/base _mysql做成一个服务镜像,其中192.168.2.35:80是搭建的私有Registry,做成镜像后,通过push命令将这个镜像提交到私有Registry中。

4. )编写Dockerfile制作应用镜像。新建一个目录,命名为mysql,在这个目录下,放置如下三个文件:

A:GoToMyCloudDB.sql

容器首次启动时,通过这个文件可以将数据库表建出来;

B:run.sh

启动mysql服务,并且判断是否是第一次启动,如果是就导入GoToMyCloudDB.sql。里面的具体内容如下:

C:Dockerfile

文件内容如下:



在mysql这个目录下,建出上面的三个文件后,通过使用docker build –t 192.168. 4.12:80/brank_mysql,制作服务镜像,做完后上传到私有Registry上。


2.2 tomcat镜像制作


GoToMyCloud项目对tomcat的要求是8.0以上,在dockerhub上有一个版本叫做emedeiros/tomcat的,这个里面安装好了8.0.4的tomcat,java环境也已经配置好了,选择它作为服务镜像,具体的步骤如下:

1.先使用docker  pull 将emedeiros/tomcat 拉到本地;

2.新建一个目录,取名为tomcat,在这个目录下放3个文件:

A:GoToMyCloud.war,放网页代码

B:Run.sh,容器启动后的执行脚本,内容如下:

#!/bin/bash

#set -x

cd /opt/tomcat/bin/

./startup.sh

 

echo "begin sleep"

while true

do

sleep 5

done


C:Dockerfile文件,里面的内容如下:

FROM emedeiros/tomcat

COPY GoToMyCloud.war /opt/tomcat/webapps/GoToMyCloud.war

COPY run.sh    /opt/run.sh

RUN chmod 777 /opt/run.sh

expose 8080

CMD ["/opt/run.sh"] 

完成这步后使用docker build 将这个镜像打出来,并上传到registry上,比如叫做 192.168.2.35:80/brank_tomcat。


2.3  测试镜像


为了确认上面打出来的两个镜像是否是没有问题的,先不适用docker-compose来做,先通过docker 命令来启动两个容器,看是否可以把整个项目运行起来。验证步骤如下:

1.在192.168.4.46的主机上创建mysql 容器;

 docker run --name gotomycloud_mysql -d -p 3306:3306 192.168. 4.12:80/brank_mysql

2.在192.168.4.46的主机上创建tomcat 容器;

docker run -p 80:8080 -d --name gotomycloud_tomcat --link:gotomycloud_mysql:mysqlhost 192.168.4.12:80/brank_tomcat

3.打开局域网里的浏览器访问192.168.4.46:8080/GoToMyCloud看是否可以正常访问,正常的话说明制作的两个镜像是没有问题的。


3. 编写compose文件


Docker compose 是一个工具用于定义和运行多个容器。通过使用Compose 文件,我们可以配置应用服务,配置完成后使用一个命令,就可以创建和启动应用服务的所有容器。Compose文件采用的是YAML的语法。


3.1 YAML语法


YAML是“另外一种标记语言”的外语缩写,他是一种类似于XML的数据描述语言。YAML试图用一种比XML更敏捷的方式,来完成XML 所完成的任务。

语法:参考http://docs.saltstack.cn/zh_CN/latest/topics/yaml/index.html

1) 缩进:YAML使用一个固定的缩进风格标书数据层结构关系,每个缩进级别通常由两个空格组成,不要使用tab

2) 冒号:字典的keys在YAML中的表现形式是一个以冒号结尾的字符串,Values的表现形式是在冒号后面用一个空格隔开,或者是另起一行通过缩进和key分开,如 my_key:  my_value 或者是

my_key:

   my_value

3) 短横杆:用它来表示列表项,使用短横杆的时候要在其后面加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分。如:

 - List_value_one

 - List_valuse_two


3.2 docker-compose的关键字


Compose 文件参考:https://docs.docker.com/compose/compose-file/

Compose文件是一个YAML格式文件,第一级的Key就是服务的名字,默认的compose file的路径是./docker-compose.yml

每一个docker-compose.yml必须明确的指定image或者是build这个key,其他的key都是可选的。主要的关键字如下:

1) build:包含dockerfile的一个本地路径(可以是绝对或者是相对路径)或者是git 的repository。build不允许和image同时使用。

2) image:指定镜像的ID,可以是本地的或者是远端的,如果本地没有,compose会自动去远端pull。

3) labels:通过label这个key来给容器添加元数据。为了避免labels和其他的容器冲突建议使用DNS域名的写法,如

   labels:

        com.cloudsoar.hostname: “test”

4) cap_add,cap_drop:添加或者是删除容器的某些能力,所有的能力可以通过 man 7 capabilities来获取,后面以列表的形式指定。

5)command:override the default command,冲在默认的command的命令

6)cgroup_parent:指定cgroup的parent

7)container_name:指定一个自定义的容器名,因为容器的名称必须唯一,当指定了这个属性后,这个服务上的容器个数只能是1不能scale了。

8)devices:指定需要映射的设备,后面跟列表

9)dns:自定义dns服务器,可以是单个也可以是列表

10)dns_search: 自定义dns search domain,可以是单个也可以是列表

11)dockerfile:和build一起使用,build默认找的dockerfile,如果需要使用别的名字的文件作为dockerfile,就用这个采参数,这个参数不要和image一起使用。

12)env_file:从文件中添加环境变量,可以是单个值,也可以是列表。环境变量文件格式的形式要求是VAR=VAL这种形式,以#开头的行都表示注释。

13)environment:通过这个添加环境变量,后面可以是列表也可以是字典,任何表达true,false,yes,no的value必须用‘’括起来,否则会被YML解释器解释掉。

     Environment:

        SHOW : ‘true’

        RACK_ENV: development

     或者:

       Environment:

-  RACK_ENV=development

-  SHOW=true

14)expose: 通过expose出来的端口,只能被用在service之间的互连,所以只需要指定内部端口号即可,不需要指定主机端口号。

15)extend:扩展另外一个服务,就是docker-compose.yml中定义的某个服务,可以引用另外一个docker-compose.yml中某个服务的定义。是docker-compose共享通用服务配置的一种手段。例子如下:

       Extends:

         File: common.yml

         Service: webapp

16) externl-links:link to 这个docker-compose.yml定义之外的容器,link的容器是以(container:alias)的方式给出的。如 external_links:

           -  database

           -  project_db_1: mysql

17) extra_hosts:在容器的/etc/hosts中添加条目,如下:

     Extra_hosts:

-  “hostname1:192.168.0.7”

18links:link这个docker-compse.yml内的其他service。link的aliasname会在/etc/hosts中找到。

   links:

    - db:mydb

19)log_driver:指定日志的驱动用哪一种,默认的是json-file

20)log_opt:指定log_driver的一些选项

21)net:指定网络模式

22)pid:”hostname”设置PID模式=主机PID模式,这个属性一设置就会打通主机和容器之间的PID进程空间,有这个属性的容易被允许操作主机上的其他容器。

23)ports:指定向主机暴露的端口。

24)security_opt: 重载默认的label

   Security_opt:

- label:user:user

-label:role:ROLE

25)ulimits:重载容器默认的ulimit属性

26)volumes,volume_driver:volumes和docker run中的-v是一个意思,都是将主机的某个目录映射过去。

27)volumes_from:从其他服务或者容器中加载volumn。

   变量替换:

   在docker-compose中可以使用shell中的环境变量,如

     Db:

       Image :”postgres:${POSTGRES_VERSION}”

当你需要在你的docker-compose指定不要去解析这个环境变量的时候,用这个写法:

   Command: “$$VAR_NOT_INTERRPLOTED_BY_COMPOSE”


3.3 gotomycloud项目的docker-compose文件


tomcat:

  image: 192.168.4.12:80/brank_tomcat

  ports:

    - "8080:8080"

  links:

    - mysqlhost

  tty: true

  stdin_open: true

 

mysqlhost:

  image: 192.168.4.12:80/brank_mysql

  ports:

    - "3306:3306"

  tty: true

  stdin_open: true



4. 添加catalog


4.1 git的搭建

1. 【主机 192.168.4.29】创建工作目录,存放入工作代码  ,例如/home/catalog

2. 初始化成git仓库, cd /home/catalog && git init

3.  git add * && git commit -ma 'iniitial'

4.  git daemon --verbose --export-all --base-path=/home --reuseaddr --enable=receive-pack /home/catalog

     这时候git服务器就启动了.  可以将git daemon写成系统服务,来实现,如果有多个仓库就直接在命令后跟添加仓库的路径,但仓库要在--base-path指定的目录下,如:

git daemon --verbose --export-all --base-path=/home --reuseaddr --enable=receive-pack /home/catalog /home/anothercatalog

5. 在客户机可以通过:   git clone git://192.168.4.29/catalog 来获取/home/catalog中的代码,将会在本生成一个catalog  的目录,其中包含了clone下来的源代码.


4.2新加gotomycloud的catalog


Rancher catalog 服务定义了一套配置文件的格式,只需按照格式来添加配置文件,catalog服务通过git会自动把它加到rancher-server的容器的/var/lib/cattle/DATA/library/templates这个目录下

 

catalog目录结构如下:

-- templates

  |-- mycatalog

  |   |-- 0

  |   |   |-- docker-compose.yml

  |   |   |-- rancher-compose.yml

  |   |   |--README.md

  |   |-- 1

  |   |   |-- docker-compose.yml

  |   |   |-- rancher-compose.yml

|   |   |--README.md

  |   |-- catalogIcon-cloudflare.svg

  |   |-- config.yml


1. 在templates目录下创建一个文件夹,名字就用要添加的应用的名字

2. 在mycatalog下创建名字为0的文件夹,里面放上docker-compose和rancher-compose两个配置文件,还有一个README.md文件。如果应用有多个版本,可以继续创建名字为1的文件夹

3. 为应用添加一张logo图片,格式可以是svg和png,图片的命名catalogIcon-appname的格式。

4. 创建一个名字为config.yml的文件

name: Cloudsoar GoToMyCloud Web

description: |

   Cloudsoar GoToMyCloud Web project

version: 1.0.0-rancher

category: clustering

 

5. 修改README.md文件,格式如下:

第一行为应用的名字,“### Info:”下输入应用的一些说明,“### Usage:”下输入应用的一些使用方法

 

6、修改rancher-compose.yml文件,需要添加一些catalog的配置

其中questions:下定义了一些可供用户更改的变量,如上面定义了一个名叫scale的变量,变量类型是字符串,默认值是1。定义好的变量可在docker-compose和rancher-compose中直接使用,如${scale}。

 

7. 把创建好的catalog提交到创好的git 服务器中


4.3发布catalog


1. 在Rancher网页上点击Admin > Setting

 

2. 点击Add Catalog URL添加一个catalog的URL

3. 将创建好的git服务器地址填上git clone git://192.168.4.29/catalog

做完这步设置后,过一会儿再看catalog就能看到新加的gotomycloud工程了如下:

4.4测试发布的catalog


测试内容包含两个方面:

1)测试发布出来的是否可以正常工作。

2)指定在某台主机上运行是否可以指定成功并工作正常。


三. 项目总结



1. 心得体会


1. 尽量不要在容器内部存放任何和项目相关的数据,这样容器崩溃的时候,数据还能找回来

2. 搭建registry的话,如果registry是在容器里面跑,一定要做-v的映射,让数据存到主机上

3. 镜像的制作,最好将镜像分为三类,一类是基础镜像,如ubuntu等;第二类是服务镜像,就是在基础镜像的基础上把相关的服务软件装好;第三类是应用镜像,就是把根据具体部署的项目通过copy配置文件等做相关的镜像。

4. catalog创建的时候,就指定了scale了,这个时候创建的stack在运行后,scale和在哪些机器上运行的schedule就不能再改了。

5. ranche中如果在某台主机上删除某个stack里面的container,它会重新自动创建出来,所以正确的删除某个statck 里面的container的做法应该是删除服务。

6. 目前搭建的registry不是很好用,看不到谁什么时候提交了什么镜像,没有镜像的提交说明等,用docker search 也查不到。

7. 使用docker rmi 命令删除镜像的时候,如果已经有基于该镜像启动的容器存在,则无法直接删除,需要首先删除容器。

8. docker commit的时候只能够选用正在运行的容器



2. 问题清单


1、写的docker-compose加到rancher 的catalog后,启动服务报某行有错误。

   通常的原因都是语法不对,docker-compose的语法是YAML的格式,在:后面要有个空格,在-后面也要有个空格,还有就是要注意缩进。

2、自己添加的catalog的docker-compose在catalog的详情界面上, Preview按钮,显示不出来docker-compose和rancher-compose。

  经过测试确认rancher-compose中如果没有question的字段,就会出现这个问题。

3、catalog里面发布的镜像,在某一台机器上部署后,用curl 10网段的IP可以访问到网页,但是在别的主机上使用telnet 8080都一直有问题,换了另外两台主机测试又没有问题。

4、关于rancher-compose的关键字有哪些,目前还没有找到相关的文档。

5、在公司的局域网里,跨网段的的主机可以添加成功,但是Network-agent启动不了

6、局域网里同一个网段的有一台机器addhost一直失败,日志提示一直是curl rancherServerIP:8080/V0失败。换了一台机器就可以了。


温馨提示:


云舒网络携手Rancher Labs推出【Rancher | 实战群】,在线为您分享Docker技术干货,更有往期回顾精选期刊等你拿!

本群汇集了Rancher中国最强技术精英团队及业内技术派高人,宗旨是为了大家拥有更专业的平台交流Rancher实战技术,实时与Rancher创始团队面对面!同时欢迎各位分享自己的经验、疑难问题,我们将定期邀请分享嘉宾做各类话题分享及回顾,共同实践研究Docker容器生态圈。
对Rancher和Docker技术感兴趣、或对本文中细节需继续探讨的朋友,欢迎加入本群参与讨论!


加群方法:


1.关注【云舒网络】公众号

2.留言”我要加群“


     


云舒网络官方微信二维码