欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-07 13:09:36
...
......续接上一篇文章。

六、镜像库及应用

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

1. Rancher添加镜像库

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

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

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/镜像名:镜像版本号

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

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

4)镜像下载(pull)

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

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

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

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

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

3. 自建镜像库

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

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

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

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

2)添加卷

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

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

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

chmod +777 /opt/data/registry

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

3)调度规则

按照默认的指定本机调度

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

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)上传镜像到私有库

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

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

将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或直接查看页面也能看到上传到镜像

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

8)下载镜像

docker pull 172.16.1.37:4000/tomcat7

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

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

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

除了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 <aaa@qq.com>

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

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放在一起发布:

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

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

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.  [aaa@qq.com ~]# service docker restart  

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

3.  [aaa@qq.com ~]# service docker stop  

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

5.  [aaa@qq.com ~]# 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管理界面:选择容器管理的【执行命令行】操作