自動化部署
個人介紹

張長志
專職大數據架構師
擅長android,Linux三劍客,Shell高級編程,自動化運維之kickstart/cobbler/rpm定制/yum倉庫搭建/zabbix監控,大數據整套架構(hadoop,spark,hive,flink),給中國聯通和其他大型公司多次企業內訓,目前主要從事大數據和go語言開發和分享,服務過廣告、電商、電信行業
自動化部署
1.編寫代碼,修改代碼
2.提交代碼到git/svn/gitlab
3.jenkins自動檢測到git/gitlab/svn代碼更新,從git/gitlab/svn拉取最新代碼
4.jenkins自動編譯
5.jenkins自動打成能運行的war/jar包或者其他語言可以運行的對應的包
6.jenkins自動上傳可以運行的包到docker宿主機目錄
7.jenkins自動構建web容器鏡像,包含項目代碼demo
8.jenkins自動啟動鏡像,編程容器,映射端口
9.最后就有項目運行界面
10.測試人員可以安裝這種運行在測試服務器進行測試
12.運維人員就可以用同樣的部署運行在生成服務器上面
docker 的廣泛使用和docker的好處
1)區分開發 測試 運維的分工,出現問題不會互相推卸責任
2)可以合理利用服務器資源,不會像vmware的使用那么龐大
3)可以快速使用docker實現mysql redis nginx 的機器和負載均衡
4)方便實現自動化部署
5)k8s
docker目標
掌握Docker基礎知識,能夠理解docker鏡像和容器的概念
完成docker安裝和啟動
掌握docker鏡像與容器相關的命令
掌握Tomcat mysql nginx等軟件的部署
掌握docker遷移和備份相關的命令
能夠運行dockefile編寫創建容器的腳本
能夠搭建與使用dock所有倉庫
虛擬化
在計算機中,虛擬化是一種資源管理技術,是講計算機各種實體資源,比如服務器,網絡,內存以及存儲等,給與抽象,轉換后呈現出來,打破實體機構間的不可分割的障礙,使用戶可以比原來更好的利用這些資源,這些資源的新虛擬部分是不受現有的資源的架設方式,地域或者物理狀態的限制,一般所指的虛擬化資源包括計算能力和存儲能力。
在實際生產中,虛擬技術主要解決高性能的物理硬件過剩和老的舊的設備硬件能力過低的重新組裝使用,透明化底層物理硬件,從而最大化的利用物理硬件對資源充分利用
虛擬化技術包括:軟件虛擬化,內存虛擬化 硬件虛擬化 網絡虛擬化 桌面虛擬化 服務虛擬化 虛擬化等
什么是docker
docker是一個開源的項目,是在2013年,最初由dotcloud公司內部的一個業余的項目發展起來的,它基于google公司推出go語言實現的,docker項目加入linux基金會,遵循了apche2.0協議,項目公布在github上面。
docker項目目標是實現輕量級的操作系統虛擬化解決方案,docker的基礎是linux容器(LXC)技術
在LXC基礎上docker進行了進一步開發,讓用戶不需要關心容器的管理,使用戶操作簡單,用戶操作docker就像操作一個快速輕量級的虛擬機一樣簡單。
為何選擇docker
(1)上手快
用戶只需要幾分鐘,就可以把自己的程序“docker化”,隨后,就可以創建容器來運行程序。大多數docker容器只需要1秒就可以啟動。由于去除了管理程序開銷,docker容器擁有很高的性能,同時一臺宿主機可以運行多個容器,使用戶可能的利用系統資源
(2)職責劃分明確
使用docker,開發人員只需要關心容器中運行的程序,而運維人員只需要關心如何管理容器。docker設計目的就是要加強開發人員寫代碼的開發環境與應用部署的環境要一致。從而降低那種“開發時一切正常,肯定是運維的問題(測試是正常的,上線后出現了就歸結于運維問題)”
(3)快速高效的生命周期
docker的目標之一,就是縮短代碼開發測試部署,上線運行的周期,讓你的程序具備可移植性,易于構建,并易于協作(通俗講,docker就像一個盒子,里面可以裝很多物件,如果需要這些物件可以直接從盒子里拿走,而不要從該盒子一件件去取)
(4)鼓勵使用面向服務架構
docker鼓勵使用微服務,docker推薦單個容器只運行一個應用程序或者進程。這就形成了一個分布式的應用程序模型。在這種模型下,應用程序和服務可以表示為一系列的互聯容器(可以在一個容器里運行多個程序)
容器和虛擬化比較
上圖比較了docker和傳統的虛擬機不同之處,可以見容器在操作系統層次上虛擬化,直接復用本地的操作系統,而傳統的方式則在硬件上實現。與傳統的相比,docker優勢在于啟動快,體積小。
Docker 組件
docker服務器與客戶端
Docker是一個客戶端-服務器(c/s)架構程序,docker客戶端只需要向docker服務器或者守護進程發出請求,服務器或者守護進程將完成所有的工作并返回結果。Docker提供了一個命令行工具Docker以及一套RESTful api操作。你可以在同一臺宿主機上運行docker守護進程和客戶端。也可以從本地docker客戶端連接到運行另一臺宿主機的遠程docker守護進程
docker鏡像與容器
容器與鏡像的關系類似于面向對象中的對象與類。
docker組件說明
Docker安裝與啟動
安裝Docker
Docker官方建議在Ubuntu中安裝,因為Docker基于Ubuntu發布的,而且一般Docker出現的問題Ubuntu是最先更新或者打補丁的,在很多版本的centos中不支持更新最新的一些補丁。
但是企業里面大部分使用是centos系統,因此我們開發也使用centos,但是我們建議使用centos7以上的版本,在centos6中,安裝前需要安裝很多其他環境以及docker的補丁包。
前期準備 centos7的系統,上面可以上外網
1)yum包更新到最新
sudo?yum?update
2)安裝需要的軟件包,yum-util提供了yum-config-manager功能,其他倆個是devicemapper的驅動依賴
sudo?yum?install?-y?yum-utils?device-mapper-persistent-data?lvm2
3)yum 源設置阿里云
sudo?yum-config-manager?--add-repo?http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4)安裝docker
yum list docker-ce --showduplicates | sort -r //查看版本
sudo yum install docker-ce
sudo yum install <版本> # sudo yum install docker-ce-17.12.0.ce
5)安裝后查看docker版本
docker?-v
設置docker 倉庫的國內鏡像
ustc是老牌的linux鏡像提供者,不要需要注冊直接使用
1)編輯文件
nano?/ect/docker/daemon.json
2)在該文件輸入內容
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
docker的啟動與停止
systemctl命令是系統服務管理指令
啟動docker:
systemctl?start?docker
停止docker
systemctl?stop?docker
重啟docker
systemctl?restart?docker
查看docker狀態
systemctl?status?docker
開機啟動
systemctl?enable?docker
查看docker概要信息
docker?info
查看docker幫助文檔
docker?--help
運行第一個程序
docker?run?hello-world
docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "process_linux.go:293: copying bootstrap data to pipe caused \"write init-p: broken pipe\"": unknown.
linux版本太低需要升級
參考文檔
https://www.cnblogs.com/8000cabbage/p/7965489.html
升級linux內核方法
1)啟用 elrepo倉庫
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
2)查看當前當前可以使用的linux內核
yum?--disablerepo="*"?--enablerepo="elrepo-kernel"?list?available
3)安裝linux新的內核版本
yum?--enablerepo=elrepo-kernel?install?kernel-ml
4)reboot
5)查看當前版本
uname?-a
6)設置默認內核,啟動項
nano /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
docker 命令
鏡像相關的命令
查看鏡像
docker?images
REPOSITORY:鏡像的名稱
TAG:鏡像的標簽
IMAGE ID:鏡像ID
CREATED :創建日期(不是獲取該鏡像的日期)
SIZE:鏡像大小
這些鏡像都是存儲在Docker宿主機的/var/lib/docker目錄下。
搜索鏡像
https://hub.docker.com/
如果我們想通過命令的方式查詢鏡像,可以通過命令搜索
docker?search?鏡像名稱(mysql)
NAME:倉庫名稱
DESCRIPTION:鏡像的描述
STARS :用戶評價,反應一個鏡像受歡迎的程序
OFFICI:是否官方
拉取鏡像
拉取鏡像就是從中央倉庫https://hub.docker.com 拉取鏡像到本地
docker?pull?鏡像名稱
例如我們想要myql
docker?pull?mysql
刪除鏡像
安裝鏡像ID刪除鏡像
docker?rmi?鏡像ID
前期是根據當前創建的容器要關閉
刪除所有鏡像
docker?rmi?`docker?images?-q`
容器相關的命令
創建容器和啟動容器
創建容器命令:docker run
對應參數說明:
-i :表示運行容器
-t:表示容器啟動后進入該容器執行命令,加入倆個參數后,容器創建就能登錄進去,分配一個偽終端
-name:為創建的容器命名
-v:表示目錄映射關系(前面是宿主機目錄,后者是容器的目錄)可以使用多個-v做多個目錄或者文件的映射,注意:最好使用目錄映射,在宿主機上修改文件,然后共享到容器中
-d :在run后面加-d參數,則會創建一個守護進程在后臺運行(這樣創建后就不會自動登錄容器,如果只加-it就會在創建容器中進入容器)
-p :表示端口映射,前者是宿主機端口,后者是容器的銀蛇端口,可以使用多個-p做多個端口的映射
(1)交互式的創建容器
docker?run?-it(-i?-t)?--name=容器名稱?鏡像名稱:標簽?/bin/bash
退出當前容器
exit
(2) 后臺啟動容器的進程
docker?run?-d?--name=容器名稱??鏡像名稱:標簽
(3) 登錄守護進程容器的方式
docker?exec?-it?容器名稱(或者容器ID)?/bin/bash?案例:docker?exec?-it?mycentos2?/bin/bash
查看容器
查看正在運行的容器
docker?ps
查看所有的容器
docker?ps?-a
查看最后一次運行的容器
docker?ps?-l
查看停止的容器
docker?ps?-f?status=exited
停止與啟動容器
停止容器:
docker?stop?容器名稱(或者容器ID)
啟動容器:
docker?start?容器名稱(或者容器ID)
文件拷貝
如果我們需要將文件拷貝容器內可以使用cp命令
docker?cp?需要拷貝的文件或者目錄?容器名稱:容器目錄
也可以將文件從容器拷貝出來
docker?cp?容器名稱:容器目錄?需要拷貝的文件或目錄
目錄掛載
我們可以在創建容器的時候,將宿主機的目錄與容器的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而影響容器。
創建容器 添加-v參數 宿主機目錄:容器目錄
docker?run?-di?-v?/usr/local/myhtml:/usr/local/myhtml?--name=mycentos3?centos
可以共享多個目錄,可以出現權限不足。 selinux權限去掉,--privileged=true來解決目錄沒有權限的問題
查看容器的ip
我們可以通過以下命令查看容器的運行各種參數
docker?inspect?容器名稱(容器ID)
也可以執行執行命令輸出ip
docker?inspect?--format='{{.NetworkSettings.IPAddress}}'?容器名稱(容器ID)
刪除容器
docker?rm?容器名稱(容器ID)
注意:刪除image
docker rmi imageid ?前期是根據這個image的容器要刪除
docker rm 容器名稱 ?刪除容器 要先停止對應的容器
應用部署
mysql 部署
1)拉取mysql鏡像
docker?pull?centos/mysql-57-centos
2)創建容器
docker?run?-id?--name=mysql?-p?33306:3306?-e?MYSQL_ROOT_PASSWORD=123456??centos/mysql-57-centos
-p 代表端口映射,宿主機端口:容器運行端口
-e 添加環境變量MYSQL_ROOT_PASSWORD 是root的登錄密碼
3)遠程連接mysql
宿主機端口(192.168.154.201:33306) root 123456
tomcat部署
1)拉取鏡像
docker?pull?tomcat
2)創建容器
-p創建地址映射
docker?run?-id?--name=mytomcat?-p?9000:8080?-v?/usr/local/webapps:/usr/local/tomcat/webapps?tomcat
3)在/usr/local/webapps 創建1.html
hello?world
4)訪問
192.168.154.201:9000/1.html
Nginx部署
1)拉取鏡像
docker?pull?nginx
2)創建Nginx容器
docker?run?-id?--name=myNginx?-p?80:80?nginx
redis部署
1)拉取鏡像
docker?pull?redis
2)創建容器
docker?run?-id?--name=myredis?-p?6379:6379?redis
遷移和備份
容器保存為鏡像
我們通過命令將容器保存為鏡像
docker?commit?mycentos3?mycentos3_1
鏡像備份
我們需要通過命令將鏡像打成tar文件
docker?save?-o?mycentos3.tar?mycentos3_1
鏡像的恢復與遷移
1)刪除mycentos3_1對應的鏡像,然后恢復
docker?load?-i?mycentos3.tar
-i 輸入文件
執行后再次查看,可以看到鏡像已經恢復了
DockerFile
什么是DockerFile
DockerFile是由一系列命令和參數構成的腳本,這些命令用于基礎鏡像并最終創建一個新的鏡像
1、對于開發人員:可以為開發團隊提供一個完全一致的開發環境
2、對于測試人員:可以直接拿開發時構建的鏡像或者通過Dockerfile文件構建一個新的鏡像開始工作
3、對于運維人員:在部署時,可以實現應用的無縫移植
DockerFile常用的命令
使用docker部署一個Golang
1)安裝docker (已經安裝)
2)mkdir myDocker
3)cd myDocker && touch Dockerfile
4)Dockerfile寫入腳本
5)編寫mian.go 放入到myDocker下
package main
import (
"net/http"
"fmt"
)
func myHandler(w http.ResponseWriter,r *http.Request) ?{
fmt.Fprintln(w,"hello go")
}
func myHelloHandler(w http.ResponseWriter,r *http.Request) ?{
fmt.Fprintln(w,"hello")
}
func main() ?{
http.HandleFunc("/hello",myHelloHandler)
http.HandleFunc("/go",myHandler)
//net/http
http.ListenAndServe(":8080",nil)
}
6)構建鏡像
docker?build?-t?zczdocker?.?出現successfully?build?...?說明構建成功
7)docker images 查看創建的鏡像
8)docker run -p 8080:8080 -d zczdocker
9)本機http://192.168.154.201:8080/hello 返回hello
使用Dockerfile部署jdk
1)mkdir dockerjdk8
2)將jdk對應的jar包拷貝到dockerjdk8中
3)touch Dockerfile
4)nano Dockerfile
FROM?centos?MAINTAINER?zcz?WORKDIR?/usr?RUN?mkdir?/usr/local/java?ADD?jdk-8u144-linux-x64.tar.gz?/usr/local/java/?ENV?JAVA_HOME?/usr/local/java/jdk1.8.0_144?ENV?JRE_HOME?$JAVA_HOME/jre?ENV?PATH?$JAVA_HOME/bin:$PATH
5)執行命令構建鏡像
docker?build?-t='jdk1.8'?.
注意jdk1.8后面的空格和點不能省略
6)查看鏡像是否構建完成
docker?images
7)運行鏡像
docker?run?-it?--name=myjdk1.8?jdk1.8
SpringBoot整合docker的部署
1)創建springboot項目
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication {
@RequestMapping("/")
public String home(){
return "hello Docker world";
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2) 打成jar包
3)上傳jar包到linux上面
4)創建文件夾dockerspringboot
5)編寫dockefile
FROM?java?VOLUME?/tmp?ADD?demodocker-0.0.1-SNAPSHOT.jar?app.jar?RUN?sh?-c?'touch?/app.jar'?ENV?JAVA_OPTS=""?ENTRYPOINT?[?"sh","-c","java?$JAVA_OPTS?-Djava.security.egd=file:/dev/./urandom?-jar?/app.jar"]
$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom為了縮短Tomcat啟動時間添加一個系統屬性指向"/dev/urandom"
6)執行編譯
docker?build?-t?dockerspringboot?.
7)查看
docker?images
8)運行
docker?run?-d?-p?8080:8080?dockerspringboot?--name=myspringdocker
9) 訪問用你docker所在ip
http://192.168.154.201:8082/
私庫的搭建與配置
1)拉取私有倉庫的鏡像
docker?pull?registry
2)啟動私有倉庫容器
docker?run?-di?--name=registry?-p?5000:5000?registry
3)打開瀏覽器輸入地址
http://192.168.154.201:5000/v2/_catalog
看到私有庫搭建成功并且內容為空
其他服務進行信任配置
1)修改daemon.json
nano /etc/docker/daemon.json
{"insecure-registries":["192.168.154.201:5000"]}
此步驟是讓docker添加信任私有倉庫
2)重啟docker服務
systemctl?restart?docker
3)鏡像上傳到私有倉庫
(1) 標記此鏡像為私有倉庫鏡像
docker?tag?dockerspring?192.168.154.201:5000/dockerspring
(2) 在此啟動私服容器
docker?start?registry
(3) 上傳標記的鏡像
docker?push?192.168.154.201:5000/dockerspring
(4)查看
其他服務器下載
docker?pull?192.168.154.201:5000/dockerspring
docker?run?-d?-p?8083:8080?192.168.154.201:5000/dockerspring?--name=myspringsifu
Docker Compose
Docker Compose 簡介
Docker compose 是一種用于通過使用單個命令創建和啟動Docker應用程序的工具。我們可以使用它來配置應用程序的服務。
它是開發,測試和升級環境的利器。
它提供以下命令來管理應用程序的整個生命周期:
啟動,停止和重建服務
查看運行服務的狀態
流式運行服務的日志輸出
在服務上運行一次性命令
要是實現Docker compose,需要包括以下步驟:
將應用程序環境變量放在Docker文件中公開訪問。(docker-compose放在環境變量)
echo?$PATH
在docker-compose.yml 文件中提供和配置服務名稱,以便天它們可以在隔離環境中一起運行
運行docker-compose將啟動并運行整個應用程序
Docker Compose 安裝
curl?-L?https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname?-s`-`uname?-m`?-o?/usr/local/bin/docker-compose
以下進取
給docker-compose權限
chmod?+x?/usr/local/bin/docker-compose
第二種安裝方式
1)下載docker-compose-Linux-x86_64
2)上傳到linux中
3)echo $PATH
4)把下載文件放在/usr/local/bin
5)chmod +x /usr/local/bin/docker-compose
6)查看版本
docker-compose?version
Docker compose 實戰
1)創建一個docker-compose.yml配置文件
version:?'3'?services:???mysql:?????restart:?always?????image:?mysql?????container_name:?mysql?????ports:???????-?33306:3306?????environment:???????MYSQL_ROOT_PASSWORD:?123456
version 指定腳本語法解析器版本
services:要啟動的服務列表
+ restart:啟動方式,這里 always 表示總是啟動,即使服務器重新啟動了也會立即啟動
image : 鏡像的名稱,默認從Docker hub下載
container_name:容器名稱,可以隨便起,不要重復
ports:映射端口
environment:環境變量
mysql:服務器名稱,可以隨便起,不重復即可
2) 運行
docker-compose?up
-d 后臺運行
3)docker ps 會看到進程
4)驗證mysql開啟
docker?exec?-it?mysql?mysql?-uroot?-p123456
Docker Compose命令
前臺運行
docker-compose?up
后臺運行
docker-compose?up?-d
啟動
docker-compose?start
停止
docker-compose?stop
停止并移除容器
docker-compose?down
容器 Docker
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。