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管理介面:選擇容器管理的【執行命令列】操作