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

0.154字数 3217阅读 210

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

六、镜像库及应用

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管理界面:选择容器管理的【执行命令行】操作

推荐阅读更多精彩内容