......续接上一篇文章。
Rancher还有很多功能,在这里都不细说了,因为这是一篇快速上手指南,讲到这已经差不多了。但是还得补充下更重要的内容,上一篇通篇讲的都是使用Rancher拉取公共镜像来创建容器或应用,那么如何创建和使用我们自已的私有镜像,这也是初学者必须掌握的。
Rancher基础架构菜单下有一个添加镜像库的功能,除了DockerHub的公有镜像库不用添加,其他的公有或私有镜像库都应该添加(就算是DockerHub私有镜像也需要添加账号密码配置),这样在用Rancher添加容器时,就能够把搜索镜像的范围从DockerHub扩展到其他镜像库了。
一、基于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中使用阿里云的镜像,首先需要在基础架构à镜像库中添加镜像库地址及授权账号,如下所示:
创建内网私有镜像库也可以用容器的方式创建,也挺简单,但是要创建带公有证书的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
这个不属于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),这种方式方便版本化追踪管理,所以我们要求创建镜像一定是这么做。
镜像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
由于是在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管理界面:选择容器管理的【执行命令行】操作