Rancher及Docker快速上手指南(三)

......续接上一篇文章。

六、镜像库及应用

Rancher还有很多功能,在这里都不细说了,因为这是一篇快速上手指南,讲到这已经差不多了。但是还得补充下更重要的内容,上一篇通篇讲的都是使用Rancher拉取公共镜像来创建容器或应用,那么如何创建和使用我们自已的私有镜像,这也是初学者必须掌握的。

1. Rancher添加镜像库

Rancher基础架构菜单下有一个添加镜像库的功能,除了DockerHub的公有镜像库不用添加,其他的公有或私有镜像库都应该添加(就算是DockerHub私有镜像也需要添加账号密码配置),这样在用Rancher添加容器时,就能够把搜索镜像的范围从DockerHub扩展到其他镜像库了。

2. 公网镜像库

一、基于DockerHub的账号

1)首先得在DockerHub上注册个账号(没翻墙估计注册不了):https://hub.docker.com

假如账号是rexentest

2)然后将本地镜像(以alpine示例)打上tag标签,可以通过docker pull alpine:3.4下载个镜像到本地。

docker tag alpine:3.4 rexentest/alpine:3.4

3)然后登录DockerHub

docker login

#输入用户名和密码

4)push镜像到DockerHub上

docker push rexentest/alpine:3.4

5)如果要下载这个新的镜像,必须用新名称rexentest/alpine:3.4

Docker pull rexentest/alpine:3.4

二、基于阿里云的账号

阿里云镜像主页:https://dev.aliyun.com/search.html

方法基本同上,也需求注册账号,建立自己的镜像管理中心,我已经建了一个:

registry.cn-hangzhou.aliyuncs.com/rexen/

1)为了加快下载速度,建议使用阿里云的加速地址(以下是华东1区专用的地址):

sudo tee/etc/docker/daemon.json <<-'EOF'

{

  "registry-mirrors":["https://j8zppnv0.mirror.aliyuncs.com"]

}

EOF

sudo systemctldaemon-reload

sudo systemctlrestart docker

2)登录阿里云镜像库:

sudo docker login--username=smooth00 registry.cn-hangzhou.aliyuncs.com

密码:******

3)推送镜像到镜像库:

sudo docker tag 镜像Idregistry.cn-hangzhou.aliyuncs.com/rexen/镜像名:镜像版本号

sudo docker pushregistry.cn-hangzhou.aliyuncs.com/rexen/镜像名:镜像版本号

这样就完成了镜像的上传,通过页面能够查到我下上传的镜像:

4)镜像下载(pull)

docker pullregistry.cn-hangzhou.aliyuncs.com/rexen/镜像名:镜像版本号

5)在Rancher直接可以使用该镜像,名称得完整如下:

registry.cn-hangzhou.aliyuncs.com/rexen/镜像名:镜像版本号

在Rancher中使用阿里云的镜像,首先需要在基础架构à镜像库中添加镜像库地址及授权账号,如下所示:

3. 自建镜像库

创建内网私有镜像库也可以用容器的方式创建,也挺简单,但是要创建带公有证书的https镜像库就不容易了,以下提供一个创建http访问的私有镜像库方案。

1)在Rancher界面的主机如172.16.1.37面板上,添加容器,选择镜像registry:2

配置对外端口4000(可任意),但内部端口一定是要5000

2)添加卷

参数 /opt/data/registry:/var/lib/registry  冒号前为主机下的文件目录,冒号后为容器中的文件目录。

在创建前需要到172.16.1.37中创建/opt/data/registry目录,并给予读写权限:

chmod +777 /opt/data/registry

说明:添加卷的目的是因为容器一旦删除,容器里的所有东西就消失了,而卷可以让宿主机和容器共享这个目录,到时候容器删除后目录还在,里面保存的镜像也会存在。

3)调度规则

按照默认的指定本机调度

4)点击创建,完成容器的创建。

直接浏览器访问 http://172.16.1.37:4000/v2 显示{} 表示正常

5)将私有镜像库加到Rancher的镜像库里

基础架构à镜像库à添加镜像,选择Custom,输入地址172.16.1.37:4000

点击创建,完成私有镜像库的添加。

6)在各个需要上传和下载镜像的主机里配置私有镜像库的http访问方式

由于docker的push和pull镜像都必须以https访问,所以我们需要做以下配置

在/etc/docker下,创建daemon.json文件,写入:

{"insecure-registries":["192.168.163.131:5000"]}

重启Docker:

systemctl restart docker.service

如果重启的是172.16.1.37里的docker,那么registry容器也将被停止,所以需要进入Rancher相应的主机界面里,启动registry。

7)上传镜像到私有库

需要将本地的镜像改名,如:

将mytomcat:0.0.1进行改名:

docker tag mytomcat:0.0.1 172.16.1.37:4000/tomcat7

改完名后,就可以直接push上传了

docker push 172.16.1.37:4000/tomcat7

curl http://172.16.1.37:4000/v2/_catalog或直接查看页面也能看到上传到镜像

8)下载镜像

docker pull 172.16.1.37:4000/tomcat7

就能够从私有库中拉取镜像。

通过Rancher也能将该镜像添加成容器,Rancher能自动从私有库下载(前提是Rancher镜像库添加了172.16.1.37:4000链接)

除了http访问的镜像库,https自有证书访问的镜像库也是可以搭建的,由于是自有证书,docker容器所在主机需要拷贝相关证书,否则也访问不了。具体安装见公司知识库里我的另一篇文章:

http://172.16.1.9:8090/pages/viewpage.action?pageId=21529682

4. 创建自有镜像

这个不属于Rancher的功能,但是这块事关镜像创建的标准化和可维护化,用Dockerfile来创建镜像已经成为业内的标准,所以强烈建议研发人员学会编辑Dockerfile。

创建镜像的方法一般是两种:

1)第一种:就是在正在使用的容器下,进行配置修改和在容器内安装软件(比如安装一个JDK,具体操作方式可以用docker run命令或是进入容器内部命令窗口),然后再将本次修改的容器直接打成新的镜像包,使用如下命令:

docker commit 当前容器ID 新的镜像名

这种方式是最简单的镜像创建方式,但是也是最不值得倡导的方式,因为这种方式会导致多次版本迭代后镜像冗余越来越大,可维护性变差,最后逼的又得从基础镜像开始。不像Dockerfile那样通过RUN、ADD、COPY、CMD等命令就能持续构建。

2)第二种:就是前面说的用Dockerfile指令来创建,这种方式能快速构建规范的镜像文件(只要使用了高质量的指令来创建,那么镜像的质量就会很高),而且将Dockerfile上传到SVN或GitHub上进行版本管理,再结合jenkins就能实现自动化构建和部署。以下是我以tomcat为基础做的一个简单Dockerfile:

# First docker file frombolingcavalry  

# VERSION 0.0.1  

# Author: bolingcavalry  

# 基础镜像  

FROM tomcat:7.0.88-jre8  

# 作者  

# MAINTAINER zgh   

# 定义工作目录(定义变量)  

ENV WORK_PATH /usr/local/tomcat/conf  

ENV WEB_PATH /usr/local/tomcat/webapps  

# 定义要替换的文件名  

ENV USER_CONF_FILE_NAME tomcat-users.xml  

# 定义要替换的server.xml文件名  

ENV SERVER_CONF_FILE_NAME server.xml  

# 定义要发布的war包文件名  

ENV WEB_APP rfzf.war  

# 删除原文件tomcat-users.xml  

RUN rm $WORK_PATH/$USER_CONF_FILE_NAME  

# 复制文件tomcat-users.xml  

COPY  ./$USER_CONF_FILE_NAME $WORK_PATH/  

# 删除原文件server.xml  

RUN rm $WORK_PATH/$SERVER_CONF_FILE_NAME  

# 复制文件server.xml  

COPY  ./$SERVER_CONF_FILE_NAME $WORK_PATH/  

# 复制war包到wepapps目录下  

COPY ./$WEB_APP $WEB_PATH/  

这个Dockerfile实现的是在tomcat7基础镜像(默认从docker Hub拉取)中发布人防执行平台的war包,并配置tomcat-users.xml和server.xml文件,然后将需要发布的文件与Dockerfile放在一起发布:

执行以下命令生成新的镜像:

docker build -t mytomcat-zgh:0.0.1 .

如果是Dockerfile在github上,也可以直接调用生成镜像,举例:

docker build github.com/creack/docker-firefox

说明:由于Dockerfile指令很好学(懂点shell的人都没问题,关键是如何提高质量,避免创建过多layer),这种方式方便版本化追踪管理,所以我们要求创建镜像一定是这么做。

5. 镜像的传输

镜像images不是简单的一个文件,所以没办法直接拷贝复制到别的机器上,目前镜像的传递方式有两种,一种是以镜像库的形式(包括公网镜像库或自建镜像库),一种是通过save和load命令的镜像备份和加载方式。如下:

(一)、push和pull方式

1)首先得获取镜像库的操作权限(除非自建不带账号登录的镜像库),以阿里云为例:

sudo docker login --username=用户名 registry.cn-hangzhou.aliyuncs.com

然后提示输入密码,完成登录。

2)Push镜像到库:

先是tag成指定格式的镜像名(只要是自建的镜像都必须tag成指定格式):

docker tag [镜像名]:[tag号] [IP或域]:[端口]/[仓库名或镜像名]:[镜像版本号]

然后push新的镜像:

docker push [IP或域]:[端口]/[仓库名或镜像名]:[镜像版本号]

以阿里云为例:

sudo docker tag [镜像ID] registry.cn-hangzhou.aliyuncs.com/[命名空间]/[仓库名]:[镜像版本号]

sudo docker pullregistry.cn-hangzhou.aliyuncs.com/[命名空间]/[仓库名]:[镜像版本号]

3)从镜像库Pull:dockerpull [IP或域]:[端口]/[仓库名或镜像名]:[镜像版本号]

如果镜像是设置成公有性质的,pull就不需要先登录账号和密码了。

以阿里去为例:

sudo docker pull registry.cn-hangzhou.aliyuncs.com/[命名空间]/[仓库名]:[镜像版本号]

(二)、save和load方式

我们推荐用上面的方式,但如果镜像不通过镜像库的push和pull,如何迁移到别的服务器上呢,方法如下:

1)save 镜像

docker save 镜像ID > /home/dockerfile/dockerimage1.0.tar

如果导出目录不存在,需要事先创建。然后把这个生成的tar文件传到别的服务器上

2)load镜像

Docker load < /home/dockerfile/dockerimage1.0.tar

因为生成的镜像名为none,需要更改为你希望的镜像名:tag版本号

docker tag $(dockerimages|grep none|awk '{print $3 }') 镜像名:tag版本号

这样就把tar中的镜像加载到本地的镜像列表里,通过docker images就能看到

注意:有很多人在频繁操作镜像和容器后,本地会出现大量的none镜像和exited状态的容器,我们建议要么用tag改名镜像,要么直接都批量清除了:

docker ps -a | grep"Exited" | awk '{print $1 }'|xargs docker stop

docker ps -a | grep"Exited" | awk '{print $1 }'|xargs docker rm

docker images|grepnone|awk '{print $3 }'|xargs docker rmi

七、附Docker常用命令

由于是在Rancher平台下部署和管理Docker,其实不用记太多命令,就记住以下几个:

(1)Docker服务启动命令

1. [root@localhost ~]# service docker restart  

2. Redirecting to /bin/systemctl restart docker.service  

3. [root@localhost ~]# service docker stop  

4. Redirecting to /bin/systemctl stop docker.service  

5. [root@localhost ~]# service docker start  

6. Redirecting to /bin/systemctl start docker.service  

(2)Docker查看当前运行的容器

docker ps

(3)Docker查看本地镜像

docker images

(4)Docker搜索镜像(默认是DockerHub)

docker search 镜像名

(5)Docker删除容器(得先dockerstop 容器ID)

docker rm 容器ID

(6)Docker删除镜像(得先docker rm 容器ID)

docker rmi 镜像ID

(7)往容器中拷贝文件

docker cp/home/testfile 容器ID:/home/

(8)将容器中文件拷出:

docker cp 容器ID:/home/testfile/home/

(9)在容器中安装新的程序

docker runimage_name apt-get install -y app_name

其它的命令可以上网搜索的到,就不一一列出。

(10)进入docker容器的方式

使用dockerattach:sudo docker attach 容器ID

使用SSH:在镜像(容器)中安装SSH Server,运行时开启22端口映射

使用nsenter:将nsenter安装到主机中,通过sudo docker inspect 容器ID

使用exec:sudo docker exec -it 容器ID /bin/bash

使用Rancher管理界面:选择容器管理的【执行命令行】操作

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容

  • 0. 前言 docker是什么?docker是用GO语言开发的应用容器引擎,基于容器化,沙箱机制的应用部署技术。可...
    sessionboy阅读 3,846评论 2 49
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,740评论 0 7
  • 一 、什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国...
    Blazzer阅读 3,130评论 0 13
  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,511评论 15 147
  • 我估计我是得了抑郁情绪了,但是是不是抑郁症不好说,是不是抑郁神经症也不好说,抑郁情绪、抑郁症、抑郁神经症是由区别的...
    一点点先生阅读 205评论 0 0