提到容器平臺,最先接觸的即是LXC(Linux Container),是2010年剛剛接觸虛擬化平臺的時候,當時開源解決方案是xen的天下(後來KVM才後來者居上),且性能各方面都不弱,價值當時還不是移動互聯網時代,業務量遠遠沒有那麼大,大部分公司都是物理機部署應用,用虛擬化平臺的公司也是寥寥無幾,可想而知,沒有業務,沒有場景,那就沒有技術的用武之地了,因此,LXC生而偉大而用不逢時,Docker之因此可以青出於藍而勝於藍,取得如此大的成功的緣由仍是歸咎於移動互聯網帶來的流量大爆炸,普通基於物理機,虛擬機甚至雲主機(雖然彈性伸縮應該是雲主機的特性,可是當時國內看起來根本沒有作到的,比起AWS來,差距之大,只能意會)的業務架構已經不能知足目前的應用場景了。html
關於Docker,在2013年的時候就開始接觸了,當時在一家作私有云解決方案的公司裏面以Openstack/Cloudstack私有云管理平臺+VMWare/Xen/KVM等虛擬化平臺在各大行業進行雲平臺的推廣與實施,Docker當時對咱們而言就是個實驗室裏面的Demo產品,並無做過多的關注。java
後來於2014年在騰訊遊戲任職業務運維,中心有一個部門就已經專門研究Docker技術,我也跟着湊了一把熱鬧,只是當時比較火的仍是雲主機,並且騰訊雲當時纔剛剛起步,加之當時維護的更多的仍是端遊業務,考慮到遊戲的穩定性,當時內部使用虛擬機的場景都不是很是多,更不用提Docker容器技術的大規模應用了,本着業務運維以業務穩定爲第一原則,加之業務運維的職責不在於基礎架構的研究,因此就沒再深刻了。node
直到2015年,一個運維朋友問我後面什麼比較火,我就隨口一答:Docker之後確定會流行的,你去看看吧,因而他就去了DaoCloud,Docker在後面的幾年真的就火起來了,一時間Docker正在以星星之火能夠燎原之勢在整個中國掀起了一陣風,國內比較知名的DaoCloud,靈雀雲等創業公司發展得很是迅猛,且資本不斷進入,大公司也紛紛佈局,如阿里雲,騰訊雲等,更不用說如今還有更多運維公司進場想分一杯羹了。linux
2016年,我跟另一個朋友選擇了開發自動化運維平臺做爲創業方向,如今想來,應該抓着Docker一塊兒作的,因爲自動化運維平臺更多仍是聚焦在運維層面的工做,若是須要實現持續集成/持續發佈等工做支撐還須要作大量的設計,且成本不菲,算不得真正的DevOps整套解決方案,而有了Docker,這一切變得就簡單多了,也變得瓜熟蒂落了許多。nginx
固然,創業方向雖然不是容器雲方向,可是在作運維平臺項目的時候,我本身都會不斷關注Docker發展以及客戶的Docker訴求,現在Docker+K8S已經成爲了一個運維的技能標配,也是更多企業選擇業務架構設計的底層架構,做爲一個技術人,咱們不得不去正視Docker在將來的更大的發展,加之本人從2018年開始轉作區塊鏈架構設計與開發工做,接觸到的Hyperledger Fabric在進行模塊啓動的時候也是經過Docker實現,更加堅決了將Docker技術研究完全的決心。git
因爲時間有限,概念性的東西你們本身有不清楚的能夠自行翻閱相關資料,本文主要將這幾天學習到的東西進行整理並經過實戰分享,在從此的學習與工做中,我會更多的把重心放在區塊鏈架構與Docker的整合之上,將最好的技術整合在一塊兒,爲業務提供最好的架構設計與服務支撐。github
本文描述的就是一個測試環境(操做系統:CentOS7U5 X64),測試代碼用的是JAVA的開源博客系統solo(https://github.com/b3log/solo),經過域名的方式進行角色的劃分,你們在本身的實際環境中根據實際用途進行不一樣主機不一樣角色的劃分。
web
角色 | IP地址 | 訪問域名 | 部署服務 |
---|---|---|---|
Git版本控制器 | 172.16.222.180 | git.brucefeng.com | Git |
Docker主機 | 172.16.222.180 | docker01.brucefeng.com | Docker|docker-compose |
Docker倉庫註冊服務器 | 172.16.222.180 | reg.brucefeng.com | Docker主機服務+Harbor |
Jenkins服務器(Master) | 172.16.222.180 | jenkins.brucefeng.com | JDK|Tomcat|Jenkins |
Jenkins客戶端(Slave) | 172.16.222.180 | docker01.brucefeng.com | JDK|Tomcat|Maven |
須要在服務器與本身用於訪問域名的機器上面都進行/etc/hosts的解析配置redis
####1.概念簡述docker
Git是一個開源的分佈式版本控制系統,是Linus Torvalds(Linux之父)爲了幫助管理Linux內核開發而開發的一個開放源碼的版本控制軟件。
(1) 安裝git並建立用戶
# yum install git -y ; useradd git ; echo git123|passwd --stdin git
注意: 相似安裝以前的yum源配置等基礎運維操做本文都不會贅述,下文如此。
(2) 建立倉庫
# su - git # 切換至git用戶 $ mkdir solo.git ; cd solo.git $ git --bare init #初始化倉庫
此時能夠經過git clone命令訪問這個倉庫了,目前沒有代碼數據
# git clone git@git.brucefeng.com:/home/git/solo.git
####3. 將項目傳至私有倉庫
將solo項目從https://github.com/b3log/solo獲取到以後提交至剛剛建立的git倉庫(私有倉庫)
(1) 從github.com拉取代碼
$ git clone https://github.com/b3log/solo.git
(2) 添加至私有倉庫
$ cd solo $ git remote remove origin $ git remote add origin git@git.brucefeng.com:/home/git/solo.git
(3) 提交至私有倉庫
$ git add . $ git commit -m "All Solo Files To Local Git Server" $ git push origin master
至此,咱們已經將solo項目成功傳至咱們建立的本地git倉庫中solo.git
###三.安裝Docker CE
CentOS安裝Docker的官方文檔
https://docs.docker.com/install/linux/docker-ce/centos/
# yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
# yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
# yum install docker-ce
本身根據須要能夠再配置一個Docker加速器(國內鏡像源),Daocloud跟阿里雲都有,本身決定便可。
# systemctl start docker #啓動docker # systemctl stop docker #中止docker
Compose 是一個用戶定義和運行多個容器的 Docker 應用程序。在 Compose 中你可使用 YAML 文件來配置你的應用服務。而後,只須要一個簡單的命令,就能夠建立並啓動你配置的全部服務。
使用 Compose 基本會有以下三步流程:
(1)直接下載
# curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
(2) 添加可執行權限
# chmod +x /usr/local/bin/docker-compose # ln -s /usr/local/bin/docker-compose /usr/bin/
(3) 查看版本
# docker-compose version
返回結果
docker-compose version 1.18.0, build 8dd22a9 docker-py version: 2.6.1 CPython version: 2.7.13 OpenSSL version: OpenSSL 1.0.1t 3 May 201
或者經過pip工具進行安裝
pip install -U -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose
# docker pull centos:7
(1) 建立Dockerfile文件 Dockfile-tomcat-85
FROM centos:7 MAINTAINER git.brucefeng.com ENV TOMCAT_VERSION=8.5.32 ENV TOMCAT_MIRROR=http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/ ENV JDK_MIRROR=http://172.16.222.182:8888/jdk-8u181-linux-x64.tar.gz ENV JAVA_HOME /usr/local/jdk RUN yum install wget curl unzip iproute net-tools -y && \ yum clean all && \ rm -rf /var/cache/yum/* RUN wget ${TOMCAT_MIRROR}/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz && \ tar zxf apache-tomcat-${TOMCAT_VERSION}.tar.gz && \ mv apache-tomcat-${TOMCAT_VERSION} /usr/local/tomcat && \ rm -rf apache-tomcat-${TOMCAT_VERSION}.tar.gz /usr/local/tomcat/webapps/* && \ mkdir /usr/local/tomcat/webapps/ROOT && \ echo "${TOMCAT_VERSION} INSTALL DONE" > /usr/local/tomcat/webapps/ROOT/status.html && \ sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/urandom"' /usr/local/tomcat/bin/catalina.sh && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN wget ${JDK_MIRROR} && \ tar zxf jdk-8u181-linux-x64.tar.gz && \ mv jdk1.8.0_181 /usr/local/jdk && \ rm -rf jdk-8u181-linux-x64.tar.gz ENV PATH $PATH:/usr/local/tomcat/bin ENV PATH $PATH:/usr/local/jdk/bin WORKDIR /usr/local/tomcat EXPOSE 8080 CMD ["catalina.sh","run"]
(2) 構建docker鏡像
鏡像名: tomcat-85
docker build -t tomcat-85 -f Dockfile-tomcat-85 .
(3) 建立容器進行測試
docker container run -d --name=tomcat-1 -p 8888:8080 tomcat-85
這一步務必作好,在後面Jenkins的Pipline中會用到
###四.配置Harbor服務器
以上咱們經過docker pull命令都是從公網拉取的鏡像文件,爲了方便企業內部開發須要,咱們有必要搭建一套Docker的私有倉庫管理經常使用鏡像。
VMWare Harbor是咱們經常使用的也是比較優秀的Docker私有倉庫開源解決方案,項目地址爲:https://github.com/vmware/harbor/,關於項目介紹以及特性相關內容可自行查閱。
Harbor的安裝有多種方式,在線安裝|離線安裝|OVA安裝,爲了不由網絡穩定性帶來的問題,咱們採用離線安裝的方式進行Harbor的安裝(所需的Docker與Docker-Compose上文已經安裝完畢,此處再也不寫安裝配置)
https://github.com/vmware/harbor/releases
選擇 Harbor offline installer
https://storage.googleapis.com/harbor-releases/release-1.5.0/harbor-offline-installer-v1.5.2.tgz
Harbor能夠經過兩種方式進行部署,HTTP與HTTPS,本文直接經過HTTPS的方式進行部署,你們能夠參考官方文檔的配置:https://github.com/vmware/harbor/blob/master/docs/configure_https.md
(1) 建立CA證書
# mkdir /tmp/ssl ; cd /tmp/ssl #建立一個ssl目錄,存放證書文件 # openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
設置這兩處便可
Country Name (2 letter code) [XX]:CN Common Name (eg, your name or your server's hostname) []:brucefeng.com
生成文件
ca.crt ca.key
(2) 生成證書籤名
# openssl req -newkey rsa:4096 -nodes -sha256 \ -keyout brucefeng.com.key \ -out brucefeng.com.csr
注意:
Country Name (2 letter code) [XX]:CN Common Name (eg, your name or your server's hostname) []:brucefeng.com
生成文件
brucefeng.com.csr brucefeng.com.key
(3) 生成註冊證書
# openssl x509 -req -days 365 -in brucefeng.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out brucefeng.com.crt
返回結果
Signature ok subject=/C=CN/L=Default City/O=Default Company Ltd Getting CA Private Key
所有的生成文件
brucefeng.com.crt brucefeng.com.csr brucefeng.com.key ca.crt ca.key ca.srl
(1) 解壓文件
# tar zxvf harbor-offline-installer-v1.5.2.tgz # mv /tmp/ssl harbor/ #將ssl目錄拷貝進harbor目錄下
(2)修改配置
# cd harbor # vim harbor.cfg
須要修改的參數以下
hostname = reg.brucefeng.com ui_url_protocol = https ssl_cert = ./ssl/reg.brucefeng.com.crt ssl_cert_key = ./ssl/reg.brucefeng.com.key harbor_admin_password = 123456
注意: 本人發現harbor的安裝腳本有BUG,hostname必須是直接修改,不能註釋後修改,不然報錯!
以下爲錯誤配置
# hostname = reg.mydomain.com hostname = reg.brucefeng.com
(3) 生成用於安裝的配置文件
#./prepare
(4) 安裝並啓動Harbor
#./install.sh
(5)查看運行狀態
# docker-compose ps
返回結果
Name Command State Ports ------------------------------------------------------------------------------------------ harbor-adminserver /harbor/start.sh Up harbor-db /usr/local/bin/docker-entr ... Up 3306/tcp harbor-jobservice /harbor/start.sh Up harbor-log /bin/sh -c /usr/local/bin/ ... Up 127.0.0.1:1514->10514/tcp harbor-ui /harbor/start.sh Up nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp redis docker-entrypoint.sh redis ... Up 6379/tcp registry /entrypoint.sh serve /etc/ ... Up 5000/tcp
訪問連接:https://reg.brucefeng.com/harbor/projects 用戶名:admin 密碼: 123456 密碼是咱們在配置文件harbor.cfg中配置的harbor_admin_password參數值
(1) 建立項目
建立新項目名稱:bruce-test
(2) 建立用戶
建立新用戶爲:bruce-test-user
(3) 關聯項目與用戶
填寫剛剛建立的新用戶:
Name:bruce-test-user
Role角色:Project Admin
(1) 拷貝證書文件
# mkdir /etc/docker/certs.d/reg.brucefeng.com/ # cp /tmp/ssl/reg.brucefeng.com.crt /etc/docker/certs.d/reg.brucefeng.com/
(2) 測試登陸
此處用的測試帳戶仍未以前建立的brucefeng,項目按照以前建立的幾個項目進行操做
$ docker login -u brucefeng -p password(自定義的密碼) reg.brucefeng.com
返回結果
Login Succeeded
認證成功,能夠經過命令行進行數據交互。
以Harbor上的fabric項目爲例進行鏡像的上傳與下載操做
(1) 將本地鏡像打標籤
命令格式
docker tag SOURCE_IMAGE[:TAG] reg.brucefeng.com/fabric/IMAGE[:TAG]
本文以centos7鏡像爲例測試
# docker tag docker.io/centos:7 reg.brucefeng.com/fabric/centos:v1.0
查看當前的centos7鏡像
# docker image ls |grep centos
返回結果
docker.io/centos 7 49f7960eb7e4 7 weeks ago 200 MB reg.brucefeng.com/fabric/centos v1.0 49f7960eb7e4 7 weeks ago 200 MB
(2) 推送(上傳)鏡像
# docker push reg.brucefeng.com/fabric/centos:v1.0
(3) 拉取(下載)鏡像
# docker image rm reg.brucefeng.com/fabric/centos:v1.0
# docker pull reg.brucefeng.com/fabric/centos:v1.0
Jenkins下載地址:https://jenkins.io/download/
本文經過Jenkins.war包啓動Jenkins服務,而Slave須要經過maven工具進行代碼構建,因此此處須要配置JDK|Tomcat|Maven環境
# tar zxf jdk-8u181-linux-x64.tar.gz # tar zxf apache-tomcat-8.5.32.tar.gz # tar zxf apache-maven-3.5.4-bin.tar.gz # mv jdk1.8.0_181 /usr/local/jdk # mv apache-tomcat-8.5.32 /usr/local/tomcat # mv apache-maven-3.5.4 /usr/local/maven3.5
# vim /etc/profile
添加以下信息
JAVA_HOME=/usr/local/jdk PATH=$PATH:$JAVA_HOME/bin export JAVA_HOME PATH
# source /etc/profile # java -version #檢查環境變量是否配置成功,查看java版本
返回結果
java version "1.8.0_181" Java(TM) SE Runtime Environment (build 1.8.0_181-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
(1) 部署Jenkins包
# rm -rf /usr/local/tomcat/webapps/ROOT # unzip jenkins.war -d /usr/local/tomcat/webapps/ROOT # cd /usr/local/tomcat/bin ; ./startup.sh
(2) 獲取Jenkins初始化密碼
# tailf ../logs/catalina.out #查看日誌信息 # cat /root/.jenkins/secrets/initialAdminPassword //查看Jenkins初始化密碼
登陸地址: http://jenkins.brucefeng.com:8080
按照默認的方式進行安裝便可,此處不深刻。
Master/Slave至關於Server和agent的概念。Master提供web接口讓用戶來管理job和slave,job能夠運行在master本機或者被分配到slave上運行。一個master能夠關聯多個slave用來爲不一樣的job或相同的job的不一樣配置來服務。
(1) 建立認證方法
點擊Add credentials 建立新的憑據
能夠選擇多種認證方式,通常咱們能夠採用ssh的用戶名跟密碼或者祕鑰登陸,此處我選擇祕鑰登陸。
(2) 新建Slave節點
Jenkins-Manage Jenkins-Manage Node-New Node
注意配置項
- Labels:docker01.brucefeng.com #用於標識Slave的標籤
- Remote root directory: /var/jenkins_home #用於指定經過jenkins構建的項目路徑
- JavaPath: /usr/local/jdk/bin/java #並不是JAVA_HOME的配置項
####6.配置Docker主機與Git服務器免密登陸
經過ssh-keygen與ssh-copy-id密碼實現
New Item 類型選擇Pipeline,進行參數化設置
選擇字符串參數
定義參數名爲Tag,用於傳入項目代碼版本號
關於Pipline就是一條任務流水線,便於分階段執行與排錯
腳本內容以下
node ("docker01.brucefeng.com") { //指定Slave的標籤 // 拉取代碼,$Tag引用用戶交互輸入的tag stage('Git Checkout'){ checkout([$class: 'GitSCM', branches: [[name: '$Tag']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'git@git.brucefeng.com:/home/git/solo.git']]]) } // 代碼編譯 stage('Mavin Build') { sh ''' export JAVA_HOME=/usr/local/jdk /usr/local/maven3.5/bin/mvn clean package -Dmaven.test.skip=true ''' } // 項目打包到鏡像並推送至鏡像倉庫 stage('Build and Push Image'){ sh ''' REPOSIROTY=reg.brucefeng.com/jenkins/solo:$Tag cat > Dockerfile << EOF FROM reg.brucefeng.com/libray/tomcat-85:latest RUN rm -rf /usr/local/tomcat/webapps/ROOT COPY target/*.war /usr/local/tomcat/webapps/ROOT.war CMD ["catalina.sh","run"] EOF docker build -t $REPOSIROTY . docker login -u brucefeng -p Cpic@1234 reg.brucefeng.com docker push $REPOSIROTY ''' } //根據$Tag做爲鏡像版本號 stage('Deploy to Docker'){ sh ''' REPOSIROTY=reg.brucefeng.com/jenkins/solo:$Tag docker rm -f blog-solo|true docker image rm $REPOSIROTY |true docker login -u brucefeng -p Cpic@1234 reg.brucefeng.com docker container run -d --name blog-solo -p 88:8080 $REPOSIROTY ''' } }
# vim solo/src/main/resources/latke.properties
修改內容
# Browser visit domain name serverHost=docker01.brucefeng.com # Browser visit port, 80 as usual, THIS IS NOT SERVER LISTEN PORT! serverPort=88
# git add . # git commit -m "modify latke.properties" # git tag 1.0.1 # git push origin 1.0.1
選擇Build with Patameters
填寫Tag:1.0.1
發佈成功返回日誌
Digest: sha256:dc45052ad607de3757d330c389071bcbd985dd9981aba1c4f8196d05265c62a8 Status: Downloaded newer image for reg.brucefeng.com/jenkins/solo:1.0.0 c639e3bd71ca3935486c9f49bb8ba414031dc85927664f2c0d5d8d7b5eef4066 [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline Finished: SUCCESS
經過瀏覽器訪問http://docker01.brucefeng.com:88
更多內容,後續再聊。