1. 程式人生 > >Rancher及Docker快速上手指南(三)

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 <[email protected]>

# 定義工作目錄(定義變數)

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.  [[email protected] ~]# service docker restart  

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

3.  [[email protected] ~]# service docker stop  

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

5.  [[email protected] ~]# 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管理介面:選擇容器管理的【執行命令列】操作