360報危險網(wǎng)站深圳營銷型網(wǎng)站定制
......續(xù)接上一篇文章。
六、鏡像庫及應(yīng)用
Rancher還有很多功能,在這里都不細說了,因為這是一篇快速上手指南,講到這已經(jīng)差不多了。但是還得補充下更重要的內(nèi)容,上一篇通篇講的都是使用Rancher拉取公共鏡像來創(chuàng)建容器或應(yīng)用,那么如何創(chuàng)建和使用我們自已的私有鏡像,這也是初學者必須掌握的。
1. Rancher添加鏡像庫
Rancher基礎(chǔ)架構(gòu)菜單下有一個添加鏡像庫的功能,除了DockerHub的公有鏡像庫不用添加,其他的公有或私有鏡像庫都應(yīng)該添加(就算是DockerHub私有鏡像也需要添加賬號密碼配置),這樣在用Rancher添加容器時,就能夠把搜索鏡像的范圍從DockerHub擴展到其他鏡像庫了。
2. 公網(wǎng)鏡像庫
一、基于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
方法基本同上,也需求注冊賬號,建立自己的鏡像管理中心,我已經(jīng)建了一個:
registry.cn-hangzhou.aliyuncs.com/rexen/
1)為了加快下載速度,建議使用阿里云的加速地址(以下是華東1區(qū)專用的地址):
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中使用阿里云的鏡像,首先需要在基礎(chǔ)架構(gòu)à鏡像庫中添加鏡像庫地址及授權(quán)賬號,如下所示:
3. 自建鏡像庫
創(chuàng)建內(nèi)網(wǎng)私有鏡像庫也可以用容器的方式創(chuàng)建,也挺簡單,但是要創(chuàng)建帶公有證書的https鏡像庫就不容易了,以下提供一個創(chuàng)建http訪問的私有鏡像庫方案。
1)在Rancher界面的主機如172.16.1.37面板上,添加容器,選擇鏡像registry:2
配置對外端口4000(可任意),但內(nèi)部端口一定是要5000
2)添加卷
參數(shù) /opt/data/registry:/var/lib/registry? 冒號前為主機下的文件目錄,冒號后為容器中的文件目錄。
在創(chuàng)建前需要到172.16.1.37中創(chuàng)建/opt/data/registry目錄,并給予讀寫權(quán)限:
chmod +777 /opt/data/registry
說明:添加卷的目的是因為容器一旦刪除,容器里的所有東西就消失了,而卷可以讓宿主機和容器共享這個目錄,到時候容器刪除后目錄還在,里面保存的鏡像也會存在。
3)調(diào)度規(guī)則
按照默認的指定本機調(diào)度
4)點擊創(chuàng)建,完成容器的創(chuàng)建。
直接瀏覽器訪問 http://172.16.1.37:4000/v2 顯示{} 表示正常
5)將私有鏡像庫加到Rancher的鏡像庫里
基礎(chǔ)架構(gòu)à鏡像庫à添加鏡像,選擇Custom,輸入地址172.16.1.37:4000
點擊創(chuàng)建,完成私有鏡像庫的添加。
6)在各個需要上傳和下載鏡像的主機里配置私有鏡像庫的http訪問方式
由于docker的push和pull鏡像都必須以https訪問,所以我們需要做以下配置
在/etc/docker下,創(chuàng)建daemon.json文件,寫入:
{"insecure-registries":["192.168.163.131:5000"]}
重啟Docker:
systemctl?restart?docker.service
如果重啟的是172.16.1.37里的docker,那么registry容器也將被停止,所以需要進入Rancher相應(yīng)的主機界面里,啟動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容器所在主機需要拷貝相關(guān)證書,否則也訪問不了。具體安裝見公司知識庫里我的另一篇文章:
http://172.16.1.9:8090/pages/viewpage.action?pageId=21529682
4. 創(chuàng)建自有鏡像
這個不屬于Rancher的功能,但是這塊事關(guān)鏡像創(chuàng)建的標準化和可維護化,用Dockerfile來創(chuàng)建鏡像已經(jīng)成為業(yè)內(nèi)的標準,所以強烈建議研發(fā)人員學會編輯Dockerfile。
創(chuàng)建鏡像的方法一般是兩種:
1)第一種:就是在正在使用的容器下,進行配置修改和在容器內(nèi)安裝軟件(比如安裝一個JDK,具體操作方式可以用docker run命令或是進入容器內(nèi)部命令窗口),然后再將本次修改的容器直接打成新的鏡像包,使用如下命令:
docker commit 當前容器ID 新的鏡像名
這種方式是最簡單的鏡像創(chuàng)建方式,但是也是最不值得倡導(dǎo)的方式,因為這種方式會導(dǎo)致多次版本迭代后鏡像冗余越來越大,可維護性變差,最后逼的又得從基礎(chǔ)鏡像開始。不像Dockerfile那樣通過RUN、ADD、COPY、CMD等命令就能持續(xù)構(gòu)建。
2)第二種:就是前面說的用Dockerfile指令來創(chuàng)建,這種方式能快速構(gòu)建規(guī)范的鏡像文件(只要使用了高質(zhì)量的指令來創(chuàng)建,那么鏡像的質(zhì)量就會很高),而且將Dockerfile上傳到SVN或GitHub上進行版本管理,再結(jié)合jenkins就能實現(xiàn)自動化構(gòu)建和部署。以下是我以tomcat為基礎(chǔ)做的一個簡單Dockerfile:
# First docker file frombolingcavalry# VERSION 0.0.1# Author: bolingcavalry# 基礎(chǔ)鏡像FROM tomcat:7.0.88-jre8# 作者# MAINTAINER zgh <zhengguanghua@rexen.com.cn># 定義工作目錄(定義變量)ENV WORK_PATH /usr/local/tomcat/confENV WEB_PATH /usr/local/tomcat/webapps# 定義要替換的文件名ENV USER_CONF_FILE_NAME tomcat-users.xml# 定義要替換的server.xml文件名ENV SERVER_CONF_FILE_NAME server.xml# 定義要發(fā)布的war包文件名ENV WEB_APP rfzf.war# 刪除原文件tomcat-users.xmlRUN rm $WORK_PATH/$USER_CONF_FILE_NAME# 復(fù)制文件tomcat-users.xmlCOPY ./$USER_CONF_FILE_NAME $WORK_PATH/# 刪除原文件server.xmlRUN rm $WORK_PATH/$SERVER_CONF_FILE_NAME# 復(fù)制文件server.xmlCOPY ./$SERVER_CONF_FILE_NAME $WORK_PATH/# 復(fù)制war包到wepapps目錄下COPY ./$WEB_APP $WEB_PATH/
這個Dockerfile實現(xiàn)的是在tomcat7基礎(chǔ)鏡像(默認從docker Hub拉取)中發(fā)布人防執(zhí)行平臺的war包,并配置tomcat-users.xml和server.xml文件,然后將需要發(fā)布的文件與Dockerfile放在一起發(fā)布:
執(zhí)行以下命令生成新的鏡像:
docker build -t mytomcat-zgh:0.0.1 .
如果是Dockerfile在github上,也可以直接調(diào)用生成鏡像,舉例:
docker build github.com/creack/docker-firefox
說明:由于Dockerfile指令很好學(懂點shell的人都沒問題,關(guān)鍵是如何提高質(zhì)量,避免創(chuàng)建過多l(xiāng)ayer),這種方式方便版本化追蹤管理,所以我們要求創(chuàng)建鏡像一定是這么做。
5. 鏡像的傳輸
鏡像images不是簡單的一個文件,所以沒辦法直接拷貝復(fù)制到別的機器上,目前鏡像的傳遞方式有兩種,一種是以鏡像庫的形式(包括公網(wǎng)鏡像庫或自建鏡像庫),一種是通過save和load命令的鏡像備份和加載方式。如下:
(一)、push和pull方式
1)首先得獲取鏡像庫的操作權(quán)限(除非自建不帶賬號登錄的鏡像庫),以阿里云為例:
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 pull registry.cn-hangzhou.aliyuncs.com/[命名空間]/[倉庫名]:[鏡像版本號]
3)從鏡像庫Pull:dockerpull [IP或域]:[端口]/[倉庫名或鏡像名]:[鏡像版本號]
如果鏡像是設(shè)置成公有性質(zhì)的,pull就不需要先登錄賬號和密碼了。
以阿里去為例:
sudo docker pull registry.cn-hangzhou.aliyuncs.com/[命名空間]/[倉庫名]:[鏡像版本號]
(二)、save和load方式
我們推薦用上面的方式,但如果鏡像不通過鏡像庫的push和pull,如何遷移到別的服務(wù)器上呢,方法如下:
1)save 鏡像
docker save 鏡像ID > /home/dockerfile/dockerimage1.0.tar
如果導(dǎo)出目錄不存在,需要事先創(chuàng)建。然后把這個生成的tar文件傳到別的服務(wù)器上
2)load鏡像
docker load < /home/dockerfile/dockerimage1.0.tar
因為生成的鏡像名為none,需要更改為你希望的鏡像名:tag版本號
docker tag $(docker images|grep none|awk '{print $3 }') 鏡像名:tag版本號
這樣就把tar中的鏡像加載到本地的鏡像列表里,通過docker images就能看到
注意:有很多人在頻繁操作鏡像和容器后,本地會出現(xiàn)大量的none鏡像和exited狀態(tài)的容器,我們建議要么用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|grep none|awk '{print $3 }'|xargs docker rmi
七、附Docker常用命令
由于是在Rancher平臺下部署和管理Docker,其實不用記太多命令,就記住以下幾個:
(1)Docker服務(wù)啟動命令
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
其它的命令可以上網(wǎng)搜索的到,就不一一列出。
(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管理界面:選擇容器管理的【執(zhí)行命令行】操作