docker安装部署 是部署在物理机上么

docker1.12安装配置及使用笔记
时间: 16:41:16
&&&& 阅读:2622
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&官方安装手册地址:使用的操作系统是是ubuntu14.04,按照官方的推荐的配置(其他操作系统,多少有点区别请参考官方文档)。安装步骤如下:1、检查内核版本uname&-r&#把linux内核升级到3.10以上2、apt的证书验证和keyapt-get&update
apt-get&install&apt-transport-https&ca-certificates
apt-key&adv&--keyserver&hkp://p80.pool.sks-keyservers.net:80&--recv-keys&AADBF09D3、添加源vim&/etc/apt/sources.list.d/docker.list
deb&https://apt.dockerproject.org/repo&ubuntu-trusty&main
apt-get&update
apt-get&purge&lxc-docker&#如果已经安装了,或者安装的是更老的docker.io卸载掉
apt-get&install&linux-image-extra-$(uname&-r)&linux-image-extra-virtual&#安装aufs存储必须包4、安装dockerapt-get&install&docker-engine
service&docker&start5、配置国内镜像&&&&&&&&关于docker一定要按照官方安装文档来,特别是ubuntu14.04默认apt安装的是1.9比较老的版本,如果使用国内镜像就会报什么乱七八糟的的错误,升级到最新版,问题解决curl&-sSL&https://get.daocloud.io/daotools/set_mirror.sh&|&sh&-s&http://8db7f41f.m.daocloud.io
#检查下是否成功添加了一行:DOCKER_OPTS="$DOCKER_OPTS&--registry-mirror=http://8db7f41f.m.daocloud.io"
vim&/etc/default/docker6、Docker常用命令讲解a.镜像:镜像位置:/var/lib/docker/aufsdocker&commit&&&&&&&&&&&&&#容器名&centos:v1&,创建镜像,-a作者信息&-m镜像信息
docker&&version&&&&&&&&&&&#查看版本
docker&&search&centos&&&&&#搜索可用docker镜像
docker&&images&&&&&&&&&&&&#查看当前docker所有镜像
docker&&pull&&centos&&&&&&#下载镜像(会把所有相关tag都下载下来,建议还是加上:tag少下载点)
docker&&push&&名称+tag&&&&#上传镜像
cat&&&centos.tar&|&docker&import&&-&&centos6&&#Docker导入镜像
docker&&export&&id&&&&cenos6.tar&&&&&&&&&&&&&&#Docker导出镜像
docker&rmi&&images&&&&&&&&#删除镜像,最好是仓库名+TAG(如果要多个就空格开就行),这样其他标签相同id的文件就不会删除(只是删除标签),如果要删除所有标签同一个id,那就
直接输入id,就会都删除&b.容器部分:docker&&run&&&centos&echo&"hello&word"&&#在docker容器中运行hello&world!
docker&&run&&centos&yum&install&ntpdate&#在容器中安装ntpdate的程序
docker&&ps&-l&&&&&&&&&&&&&&&&&&&&&&&&&&&#命令获得最后一个容器的id
docker&&ps&&-a&&&&&&&&&&&&&&&&&&&&&&&&&&#查看所有的容器。
docker&commit&容器名称&&&&&&&&&&&&&&&&&&#提交刚修改的容器,例如:
docker&run&-i&-t&centos&/bin/bash&&&&&&&#在容器里启动一个/bin/bash&shell环境,可以登录进入操作,其中-t&表示打开一个终端的意思,-i表示可以交互输入。
docker&run&-d&-i&-t&centos&/bin/bash&&&&#在后台启动,退出要ctrl+P、Q才能继续后台,不能exit,exit就相当于关闭容器
docker&attach&CONTAINER&ID&&&&&&&&&&&&&&#进入在后台启动后的这个容器
docker&run&&-d&&centos:v1&&/bin/bash&&&&#-d表示在后台启动,以daemon方式启动。
docker&run&-d&-p&80:80&-p&8022:22&centos:latest&/usr/bin/sshd&-D&#端口映射
docker&port&容器名&&&&&&&&&&&&&&&&&&&&&&#查看端口映射情况
docker&stop&容器名&&&&&&&&&&&&&&&&&&&&&&#正常关闭容器
docker&kill&容器名&&&&&&&&&&&&&&&&&&&&&&#直接kill掉进程
docker&start&&id&&&&&&&&&&&&&&&&&&&&&&&&#&启动某个容器,也可以改为docker&start&-i&容器名称
docker&rm&&id&&&&&&&&&&&&&&&&&&&&&&&&&&&#删除容器d.排bug常用:docker&inspect&id&&&&&&&&&&&&&&&&&#查看容器、镜像状态
docker&logs&-tf&--tail&10&容器名&&#最近10行容器内部运行情况
docker&top&容器名&&&&&&&&&&&&&&&&&#查看运行中容器的进程&7、Docker独立IP及容器互联Ubuntu部分apt-get&install&bridge-utils&&&&#安装brctl安装包
service&docker&stop&&&&&&&&&&&&&#停止docker
ifconfig&docker0&down&&&&&&&&&&&#停止网卡
brctl&show&&&&&&&&&&&&&&&&&&&&&&#查看物理机上有哪些网桥
brctl&delbr&docker0&&&&&&&&&&&&&#删除docker的默认网桥
brctl&addbr&br0&&&&&&&&&&&&&&&&&#自定义网桥
ifconfig&br0&192.168.180.22&netmask&255.255.255.0&&&&#给网桥指定IP和子网
vim&/etc/default/docker&&&&&&&&&#修改docker启动桥接
DOCKER_OPTS="$DOCKER_OPTS&-b=br0"
service&docker&start&&&&&&&&&&&&#启动docker
brctl&show&&&&&&&&&&&&&&&&&&&&&&#查看是否生效Centos部分service docker stopifconfig docker0 downbrctl delbr docker0cd /etc/sysconfig/network-scripts/vi ifcfg-eth0DEVICE=eth0BOOTPROTO=noneONBOOT=yesTYPE=EthernetBRIDGE="br0"BOOTPROTO=staticvi ifcfg-br0DEVICE="br0"ONBOOT=yesNM_CONTROLLED=noBOOTPROTO=staticTYPE=bridgeIPADDR=192.168.1.165NETMASK=255.255.255.0GATEWAY=192.168.1.1DNS=192.168.1.50vi /etc/sysconfig/dockerother_args="-b=br0"service docker start[ ~]# ps -ef|grep dockerroot&&&&& 5502&&&& 1& 0 01:23 pts/3&&& 00:00:00 /usr/bin/docker -d -b=br0root&&&&& & 0 01:47 pts/3&&& 00:00:00 grep dockerservice network restart可能会报以下错误:Shutting down interface eth0:&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [& OK& ]Shutting down loopback interface:&&&&&&&&&&&&&&&&&&&&&&&&& [& OK& ]Bringing up loopback interface:&&&&&&&&&&&&&&&&&&&&&&&&&&& [& OK& ]Bringing up interface br0:& Determining if ip address 192.168.1.161 is already in use for device br0...&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [& OK& ]Bringing up interface eth0:& Error: Connection activation failed: Master connection not found or invalid&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [FAILED]解决方法:此时,当前网卡也是可以通信的,但是通过网络管理工具修改IP之后,当前修改操作是不会生效的。那如何消除这个提示呢?其实,问题的原因是RedHat自己开发的NetworkManager管理工具和/etc/sysconfig/network-scripts/ifcfg-ethx配置不同步造成的。如果要消除这个提示,请关闭NetworkManager服务即可:chkconfig NetworkManager off& service NetworkManager stop& Stopping NetworkManager daemon:&&&&&&&&&&&&&&&&&&&&&&&&&&& [& OK& ]此时,再重新加载network服务即可:service network restartShutting down interface br0:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [& OK& ]Shutting down loopback interface:&&&&&&&&&&&&&&&&&&&&&&&&& [& OK& ]Bringing up loopback interface:&&&&&&&&&&&&&&&&&&&&&&&&&&& [& OK& ]Bringing up interface br0:& Determining if ip address 192.168.1.161 is already in use for device br0...&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [& OK& ]Bringing up interface eth0:& device eth0 is already
can‘t enslave it to bridge br0.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [& OK& ]&&&&&&&&&&&&&&&& 8、为容器手动配置静态ip&&&&&&&&&&&&&&&& 安装新的 iproute 包:wget yum localinstall iproute-2.6.32-130.el6ost.netns.2.x86_64.rpm安装pipework:git clone &&&& cp ~/pipework/pipework /usr/local/bin/启动Docker容器:docker run -itd --net=none jdeathe/centos-ssh:latest /bin/bashdocker exec -it &CONTAINER ID& /bin/bash& /这样你就进到这个container 里面了,这个bash退出也不会影响之前 docker run 启动的 bash/pipework br0 &CONTAINER ID& 9、制作可以ssh登录的本地Docker镜像安装制作CentOS镜像的工具:yum -y install febootstrap制作CentOS镜像文件centos6-image目录:febootstrap -i bash -i wget -i yum -i iputils -i iproute -i man -i vim-minimal -i openssh-server -i openssh-clients centos6 centos6-image制作Docker镜像,镜像名字是centos6-base:cd centos6-image && tar -c .|docker import - centos6-base制作可以ssh登陆的Docker镜像,名字是centos6-ssh:docker build -t centos6-ssh 经过前面的六个步骤,一个可以登陆的本地docker镜像就制作好了。用户名是:root,密码是:123456&&&&&&&&&&&&本文出自 “” 博客,请务必保留此出处标签:&&&&&&&&&
&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!金钱鳘又称黄唇鱼,目前已经接近濒危灭绝的状态。
赴日游客越来越多,国内游客成为黑心商家的肥肉。
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
  如今正是计算机技术蓬勃发展的时代,Docker由前几年的初入门径,到现在不断受到广大技术爱好者的追捧,短短几年,围绕Docker的创业公司也陆续出现,因它涉及的生态圈涵盖了内核、操作系统、虚拟化、云计算、DevOps等热门领域,所以目前成为了很受关注的技术之一。
  笔者目前正在建设的大数据平台中,恰好需要使用Docker技术来实现多租户的业务需求,所以在此和大家浅谈下我们在项目中是如何实际应用Docker技术的。
  至于何为Docker,其实它就是一个开源的容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
  具体来说,想要理解Docker,只要清楚其原理,其主要构件即可。Docker的主要部件有:
  1、Docker 镜像
  Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。
  2、Docker 仓库
  Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。
  3、Docker 容器
  Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。
  Docker中不同用户的进程就是通过 pid namespace 隔离开的,且不同 namespace 中可以有相同 PID。具有以下特征:
  l每个 namespace 中的 pid 是有自己的 pid=1 的进程(类似 /sbin/init 进程)
  l每个 namespace 中的进程只能影响自己的同一个 namespace 或子 namespace 中的进程
  l因为 namespace 允许嵌套,父 namespace 可以影响子 namespace 的进程,所以子 namespace 的进程可以在父 namespace 中看到,但是具有不同的 pid
  4、Docker“组件间”关系
  1)主机:运行容器的机器
  2)镜像:文件的层次结构,以及包含如何运行容器的元数据, Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上
  3)容器:一个从镜像中启动,包含正在运行的程序的进程
  4)Registry(镜像仓库):存放镜像的地方,如Docker Hub
  5)Volumn(卷):将物理机的文件夹挂载到容器内部.与openstack的volumn不一样,openstack中的卷是块存储,不能共享。而这里的volumn可以共享。
  6)Dockerfile:Docker 可以通过 Dockerfile 的内容来自动构建镜像。Dockerfile 是一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据 Dockerfile 的内容构建镜像。
  简单了解Docker的原理和组件后,会有一个大概的认识,在实际项目中,有时会遇到容器销毁复制后,其中存储的业务数据等可能会消失,在我们目前项目中,采用了共享磁盘的方式解决此问题:
  如上图,我们部署多个应用的容器后,其数据库、日志等存储可持久化到其他的共享磁盘上,这样当容器出现异常销毁后,我们只要重新部署新的容器,指向共享磁盘,就能解决数据丢失的问题。
  Docker在对外提供服务时,应用在容器中都是有自己的IP及端口的,此时我们可以做端口映射,这样外部访问时,就能没差别的访问到容器中的应用。
  Docker在实际应用方面,确实节省了很多开发人员的工作,它保证了开发与生产环境的一致,部署方便快捷,同时降低运维成本。在后续的项目应用中,我们还会继续研究Docker相关技术,如何最大化发挥出实际的应用价值,后续将会持续分享。
  -------------------------------------------------------------------------------------------------------------------
  文章为原创,欢迎点赞或收藏。如有大数据爱好者,欢迎共同探讨。
  关于IDEADATA:IDEADATA专注于从数据到信息的有效管理与应用,是领先的商业信息服务技术提供商,是数据仓库及大数据技术和应用的先行实践者。
  微信关注:IDEADATA大数据
  新浪微博:iDEADATA大数据视界
  公司官网:.cn
  原文链接:
  作者: IDEADATA
  著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
搜狐公众平台官方账号
生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者
搜狐网教育频道官方账号
全球最大华文占星网站-专业研究星座命理及测算服务机构
IDEADATA专注于从数据到信息的有效管理与应用,是领先...
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:Docker部署Jenkins并发布Web服务_服务器应用_Linux公社-Linux系统门户网站
你好,游客
Docker部署Jenkins并发布Web服务
作者:Michael Redlich ,译者 张卫滨
工作需要,需要搭建Jenkins,用maven编译java项目,打包发布docker镜像,同时用tomcat部署web服务。这样会大大的节省开发人员和测试人员的时间,也为发布产品提供方便,所以构建了这样的一个系统,相对来说比较简单,只是对于初次接触的人来说,还是有些小坑需要去克服的,记录一下自己的搭建过程。
1.登陆虚拟机
物理机自然是资源有限了,所以申请了一台虚拟机(memory 4G, swap 10G,disk 200G),带有界面的,方便操作。
用putty连接上之后,安装vnc
yum install tigervnc tigervnc-server -y
然后设置分辨率
vncserver -geometry
关闭防火墙,开始不知道,所以尝试多次都连接不上
systemctl stop firewalld.service
用 VNC Viewer登陆。
2.安装docker,pull所用到的image
系统为7.2,安装docker步骤:
下载image,如果已经有了相关的image的tar包,只需load进去即可。
docker pull jenkins
docker pull tomcat
docker pull registry
docker pull /gavincook/jenkins
因为官方的jenkins比较大,并且不知道root密码,所以最后用的时速云的jenkins,大小为488M。 因为要发布web服务,所以需要tomcat。 因为要把生成的image保存,所以在本地搭建了一个registry。
3.搭建本地registry
docker run -d -p
-v /home/registry:/tmp/registry --name cwebtools_registry --restart=always registry
需要修改/usr/lib/systemd/system/docker.service这个配置文件,以便能通过内网的IP访问到registry
ExecStart=/usr/bin/docker -H unix:///var/run/docker.sock --insecure-registry 10.104.1.199:5000
其余细节,不再赘述。
4.部署Jenkins
docker run -d -p 8002:80 --restart=always --name cwebtools_jenkins 10.104.1.199:5000/cwebtools_jenkins --httpPort=80
这里用的是8002端口,可以根据实际情况设置不同的端口号。
启动成功后,可以通过10.104.1.199:8002访问jenkins。
先设置Configure Global Security,启用相应的安全策略,开放用户注册,添加管理员策略,关闭匿名用户等。 注册了一个用户:cwebtools,并给此用户设置了管理员权限。
注:最初想在jenkins的container里面安装jdk和docker,后来想到可以在slave节点安装,所以这个container就相对比较纯净,除了jenkins,不再安装其他的模块。
添加节点,取名为cwebtools,开始是连接不上的,在宿主机安装ssh,并启动服务,即可连接上这个节点。
rpm -qa |grep ssh //检查是否装了SSH包
yum install openssh-server //安装
chkconfig --list sshd //检查SSHD是否在本运行级别下设置为开机启动
chkconfig --level 2345 sshd on
//如果没设置启动就设置下
systemctl restart sshd.service
//重新启动
netstat -antp |grep sshd
//看是否启动了22端口
安装必要的插件,比如svn,maven,slave等,如果网速和控件允许的话,也可以把所有的插件都安装上。
系统设置,主要是设置jdk和maven路径,在安装了jdk和maven之后再设置。 这里设置为: JAVA_HOME=/usr/local/java MAVEN_HOME=/usr/local/maven
5.在宿主机安装jdk和maven
因项目需求,这里安装的jdk为1.7版本,maven版本没有要求,我安装的是3.3.9。 通过WinSCP,把jdk和maven拷贝到宿主机,按照习惯放在了/usr/local/目录下。
注:maven需要权限,所以要给maven的bin下文件设置执行权限。 jdk1.7需要设置JAVA_HOME,设置完后,需要重启系统,才能生效,如果之前有其他版本的jdk,还需要卸载以前的jdk。 过程如下:
java -version
rpm -qa | grep java
yum -y remove java java-1.8.0-openjdk-1.8.0.101-3.b13.el7_2.x86_64
设置环境变量/etc/profile文件最后添加
export JAVA_HOME=/usr/java/java
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
这里遇到了一个很大的坑,费了很长时间,但不知是何原因,如果设置JAVA_HOME=/usr/java/jdk1.7.0_79,是不行的。文件夹只有改为java名字,slave才能连接上。
java文件夹下的bin和jre下的bin都要赋上执行权限,否则会报错:permission denied。
6.新建一个jenkins新任务
1.选择一个自由风格的项目,名字为cwebtools。 2.丢弃旧的构建。可根据需求自由设置,天数设置为10,构建个数20。 3.设置子节点的label:cwebtools。 4.设置svn的网址,用户名以及密码。 5.设置构建触发器,设为早晨8点和中午12点编译一次。 6.添加3个maven构建步骤(因为有3个maven项目),因为是maven项目,Goals设为clean install,POM设为pom文件的绝对路径,这里可以用全局变量WORKSPACE。 7.添加编译后脚本
REGISTRY_URL=10.104.1.199:5000
cp -r $WORKSPACE/cwebpdf/target/pdftools /home/cwebtools1.2/cwebtools
docker build -t $REGISTRY_URL/cwebtools:1.2 /home/cwebtools1.2
docker push $REGISTRY_URL/cwebtools:1.2
if docker ps -a | grep -i cwebtools_12;then
docker rm -f cwebtools_12
docker run -d -p
-v /home/cwebtools_data/input:/home/cwebtools/input \
-v /home/cwebtools_data/output:/home/cwebtools/output \
-v /home/cwebtools_data/logs:/home/cwebtools/logs \
--name cwebtools_12 \
--restart=always \
$REGISTRY_URL/cwebtools:1.2
MYTIME=`date +%y%m%d_%R`
cp $WORKSPACE/cwebpdf/target/pdftools.war /home/backup/pdftools_20$MYTIME.war
8.这里实现的功能,把编译结果cp到cwebtools文件夹中,build一个image,push到registry中,删除原来的container,启动新的container,并且挂载3个volumes存放数据,同时会把生成的jar包拷贝到备份目录backup下,做一个备份,以便查阅。
9.点击构建,如果顺利的话,第一次编译大概需要2-3小时,因为需要下载maven和jdk的包,之后的编译加上部署,在1-2分钟以内。
7.大功告成
至此,搭建成功,当代码有更新时,只需要点击构建,然后就可以在网页打开最新的cwebtools服务。
大家若有什么问题,欢迎留言交流。
局域网内利用GitLab+Jenkins自动生成GitBook并发布(Nginx)&
Linux+Git+Maven+Jenkins+Neuxs自动化编译环境搭建
CentOS6安装Jenkins&
使用Jenkins配置Git+Maven的自动化构建
Jenkins+Maven+Git搭建持续集成和自动化部署的配置手记
Jenkins的分布式构建及部署&&节点&
Jenkins 的详细介绍:Jenkins 的下载地址:&
本文永久更新链接地址:
相关资讯 & & &
& (05月09日)
& (05月01日)
& (05月10日)
& (05月02日)
& (04月13日)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
匿名 发表于 没看懂实战 | 如何在裸机中自动安装部署CoreOS和Kubernetes_Docker_传送门
实战 | 如何在裸机中自动安装部署CoreOS和Kubernetes
王鹏(Tad)
先介绍一下背景随着光音业务规模的上升,线上业务产品的数量及服务器的采购量也越来越大。当达到一定数量级后,就不能使用常规的维护方法来解决这些问题。以前,一旦业务量上去,我们就不得不停下手头的开发工作,部署业务所需要的环境及线上调试,到最后,只有特别熟悉业务和代码的同事才能胜任此工作。为了解决这些问题,我们从前年开始就关注了LXC,并试着小规模地使用了一段时间,但是由于LXC本身存在一系列的问题,比如内核版本的限制及二次开发困难,没能大规模地推广。后来随着Docker的发展及火热,我们也接触到了CoreOS,它的AB分区升级特性特别吸引人。使用后才发现,跟宣传写的不一样,还是需要重启服务器才能升级内核的,但是总的来说,结合Fleet的使用,可以动态地把业务迁到其它服务器,来达到平滑升级的目的,因此还是非常不错的。我是从开发转到基础平台维护岗位的,所以希望用开发的方式来解决运维的问题,并想通过改变运维的方式的来加快业务研发的速度。但是真正专职做平台开发后,才意识到搭建整个运维体系是多么困难的事。所以,为了更快地构建我们的平台,业务的选型首选开源框架,然后再它的基础上,根据业务的需要做二次开发。借着Google的名气以及相对完善的生态圈,我们最终选择了Kubernetes + CoreOS + Docker,做为整个平台编排调度的基础。我们每次采购机器,一般都是几百个节点,所以整个平台的部署就非常头疼,特别是CoreOS和Kubernetes,必须借助梯子才能安装和更新,让人非常不爽。前期的大部分时间都浪费在这上面了!于是,写了一个简单的Yoo-Installer工具来解决这些问题,现在分享给大家。由于想呈现最简单便捷的安装方式,结果没把握好时间,这次的分享准备不足,所以你们可以多提问,我多分享一些采过的坑。项目代码我放到GitHub(/Goyoo/yoo-installer)上了,代码还在不断完善中,如果有问题,可以直接在上面提Issue。另外,我们组的一个同事赵文来也贡献Kubernetes-client 的Nodejs版本,一并分享给大家:/Goyoo/node-Kubernetes-client,希望能跟大家一起打造美好的Docker生态圈。下面介绍Yoo-Installer是如何工作的它共分为DHCP Service、TFTP Service、HTTP Service,其中HTTP Service 里包括了CoreOS的引导,安装到硬盘,Kubernetes的安装及其它服务脚本的初始化。PXE引导收到DHCP广播,获取IP使用TFTP进行通信,传输CoreOS的基础IMGAGE在内存启动CoreOS系统系统启动成功后,下载脚本,执行安装Kubernetes及其它相关服务。在这里需要分享几个点:服务器的IP。在安装服务器前,应该确定好服务器的IP,因为IP在后面的安装是一个非常重要的变量。比如etcd的service IP,Kubernetes的Master IP都需要写入到配置里的。我们是这样做的:我们的服务器是高密度刀片服务器,都配有管理模块。通过一些简单的API调用,就可以得到所有的网卡mac信息,与KVM的IP保持一定的逻辑关系,这样就可以保证服务器的IP有序,便于日后的管理与维护。(可以参考Yoo-installer项目的app/utils/IPMI/dhcpMacList.js,通过这段代码得到dhcpd所需要的配置格式,直接使用即可)。CoreOS集群的安装方式我们专门做了一个菜单,以满足各种场景部署的需要。在Yoo-Installer里,我分了6个菜单,适合四种使用场景。分别对应于官方的CoreOS集群架构Docker Dev Environment on LaptopSmall ClusterEasy Development/Testing ClusterProduction Cluster with Central Services参考:CoreOS Cluster Architectures(/os/docs/latest/cluster-architectures.html)第一种,就是开发环境的方式。我们在开发时,可以使用这种方式来开发。小规模集群的方式。每个节点都安装了etcd服务,任何一个节点故障都不会影响整体服务。开发测试集群。这种方式的优点是不用额外部署etcd服务,需要几个节点来测试,就加入几个,非常灵活。但是不是高可用的架构。因为如果etcd死了,整体集群就不能工作了。所以,非常适合开发测试使用。线上生产环境集群架构。这种基本上就可以做到高可用了。不同服务资源之间可以使用Meta信息进行标识。这些代码是如何实现的呢主要是通过cloud-config-url参数的设置来改变不同的启动脚本,如cloud-config-url=http://192.168.1.10/config/develop-etcd/pxe.yml。注意,这里面有一个技巧。默认的话,CoreOS是没有密码的。有时安装时会出现一些问题,我会在启动参数里加上coreos.autologin标记,这样引导后,就可以直接进入系统,然后查找问题了。详见代码:/Goyoo/yoo-installer/blob/master/app/tftp/pxelinux.cfg/default。这样,我们就能顺利启动系统了。启动后,我们需要安装系统到硬盘,下载并安装Kubernetes,并初始化一些系统环境等等。这样是怎么做的呢?先看代码这里我们在cloud-config-url里自定义了一个服务,叫setup.service。等系统启动后,会下载相应的脚本:pxe.sh。详见代码(/Goyoo/yoo-installer/blob/master/app/views/script/pxe.ejs)。脚本分为几个部分:同步系统时间,新机器可能时钟有问题,这样会导致CoreOS不能正常安装,硬盘分区,这个要根据自己的机器情况进行处理。系统的安装。离线下载已经准备好的Kubernetes,并放到相应的系统目录里。其它脚本。通知Yoo-Installer已经安装完成并重启。那么,我们对于Kubernetes是如何自动处理的呢。在CoreOS里,有一个Cloud-init文件,在每次系统启动时,它便会自动执行。我们利用了这个文件,自动搭建了Kubernetes的服务。比如这个Central的YAML文件。在这个配置文件里,有以下几个部分hostname: 配置后,方便识别。ssh_authorized_keys: 可以设置一个跳板机的key,方便管理。update: CoreOS版本更新策略及更新版本设置。Fleet: Fleet的服务。units: 具体的systemd units文件配置,这里面包括了etcd、Fleet、Flannel、Docker、kube api server、kube controller manage、kube scheduler、kube-register等服务的配置。这些服务的配置会自动创建相应的service文件。我们也可以直接写文件,比如DNS的配置,『search localhost』 ,我在coreos-init里就没找到对应的功能配置key,只有写文件了。这里有几个需要注意的地方服务器不建议用DHCP动态分配IP,就算是MAC绑死的也不好。我们出过一次故障,DHCP服务异常,导致业务网络中断。关于cloud-init文件, CoreOS 提供了coreos-cloudinit的方法,可以做validate 。如果自己修改了init文件,最好检验一下,不然只有重启后才能发现问题。coreos-cloudinit不加validate参数,还可以执行,像写文件之类的操作,直接就可以看到结果。关于CoreOS自动下载更新。像我们这样自建机房的,最郁闷了,不像一些国外的公有云那么方便,直接可以下载更新。怎么做呢?首先,你要有个梯子,然后通过专门设置update 的service,加上ALL_PROXY,就可以自动更新了!为了更便捷的使用Yoo-Installer,我计划做二个版本,一个是VM版本的,下载后,直接可以用,另一个是Docker版本的。由时准备不足,没有做完,但是因为我自己也需用,所以我会继续完善!这里要吐个嘈。我在封装DHCPD时,因为桥接的问题,Docker里面的广播根本发不出来。如果您有高招,请告诉我,我会请你吃饭哦~对于Yoo-Installer,为了便于使用,我们专门做了一个UI,功能还不丰富,希望大家能积极提意见,欢迎PR。Q& AQ:我有一个问题,刚好刚才问了一个Kubernetes创建pod,要从gcr.io下载image,被墙了,这个你们怎么解决呢?A: 这个有二个方法。1. 使用国外的服务器下载好一个tar包,然后下过来,load进来。2. 修改tag,在里Google好像有这个镜像,下载好后,修改成gc.io的tag。我在项目里放了一个tar包。Q: CoreOS的pxe是什么?A:PXE功能是由主板提供的吧。Q:节点=服务器?梯子?A:我们有几个管理服务器,做为节点进行proxy。如果需要的话,就在特定的程序变量里加ALL_PROXY。这样做,也不会影响正常的网络。Q:网络模型怎么选?桥接,同网段大网?OpenvSwitch?A: 我们目前用的是Flannel,这个是CoreOS自带的。DockOneDockOne,新圈子,新思路,新视野。
觉得不错,分享给更多人看到
Docker 微信二维码
分享这篇文章
Docker 最新头条文章
Docker 热门头条文章}

我要回帖

更多关于 docker 物理机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信