Docker簡介
Docker是一個開源的應(yīng)用容器引擎,開發(fā)者可以打包自己的應(yīng)用到容器里面座硕,然后遷移到其他機器的docker應(yīng)用中弛作,可以實現(xiàn)快速部署。
簡單的理解华匾,docker就是一個軟件集裝箱化平臺映琳,就像船只、火車蜘拉、卡車運輸集裝箱而不論其內(nèi)部的貨物一樣萨西,軟件容器充當(dāng)軟件部署的標(biāo)準(zhǔn)單元,其中可以包含不同的代碼和依賴項旭旭。
按照這種方式容器化軟件谎脯,開發(fā)人員和 IT 專業(yè)人員只需進行極少修改或不修改,即可將其部署到不同的環(huán)境持寄,如果出現(xiàn)的故障源梭,也可以通過鏡像,快速恢復(fù)服務(wù)稍味。Docker優(yōu)勢
1.特性優(yōu)勢Docker基本概念
Client(客戶端):是Docker的用戶端废麻,可以接受用戶命令和配置標(biāo)識,并與Docker daemon通信模庐。
Images(鏡像):是一個只讀模板烛愧,含創(chuàng)建Docker容器的說明,它與操作系統(tǒng)的安裝光盤有點像赖欣。
Containers(容器):鏡像的運行實例屑彻,鏡像與容器的關(guān)系類比面向?qū)ο笾械念惡蛯ο蟆?br>
Registry(倉庫):是一個集中存儲與分發(fā)鏡像的服務(wù)。最常用的Registry是官方的Docker Hub 顶吮。
Docker改變了什么社牲?
Docker改變了云服務(wù),使云服務(wù)的共融共通的理想逐步成為了可能悴了。并且Docker 已經(jīng)是云策略的一部分搏恤,許多開發(fā)者正在計劃使用 Docker 將業(yè)務(wù)遷移到云端违寿。另外,為了避免被云服務(wù)供應(yīng)商綁定熟空,Docker成為很多開發(fā)者的首選藤巢。
Docker改變了產(chǎn)品交付,為產(chǎn)品的整個生命周期提供了一整套的解決方案和流程息罗。
Docker改變了開發(fā)方式掂咒,提供了簡化的環(huán)境配置、封裝的運行環(huán)境以及統(tǒng)一的環(huán)境迈喉。并且提供了快速部署的方式绍刮。
Docker改變了測試,多版本測試變得極為方便挨摸,快速構(gòu)建測試環(huán)境也變得更加簡單并且無需開發(fā)人員干預(yù)或者搭建孩革。
Docker改變了運維,環(huán)境的一致性讓運維變得更加簡單得运,同時熱更新的支持讓運維不再需要半夜加班部署更新膝蜈,更新可以隨時進行。當(dāng)出現(xiàn)重大問題時熔掺,還能快速回滾到指定版本饱搏。
Docker改變了架構(gòu),自動化擴容支持讓架構(gòu)變得更加簡單瞬女,分布式系統(tǒng)也更加易于搭建和支持窍帝。同時遺留的單體應(yīng)用也很易于轉(zhuǎn)變?yōu)楝F(xiàn)代應(yīng)用努潘。總之诽偷,在某種程度上,Docker改變了產(chǎn)品開發(fā)中的一些游戲規(guī)則疯坤。雖然Docker是一項技術(shù)报慕,但是它也帶來了新的思維,新的流程和工作方法压怠,Docker在推動行業(yè)的發(fā)展眠冈,Docker已經(jīng)在改變世界,并且在逐步的變?yōu)槭聦崱?/p>
Docker安裝使用
操作系統(tǒng):CentOS 7
1菌瘫、安裝依賴
yum install -y yum-utils device-mapper-persistent-data lvm2
2蜗顽、添加軟件源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 指定阿里云鏡像源
3、安裝docker-ce(對系統(tǒng)內(nèi)核有一定要求雨让,centos6不支持)
yum clean all yum makecache fast # 重新生成緩存
yum -y install docker-ce docker-ce-cli containerd.io
4雇盖、設(shè)置自啟并啟動
systemctl enable docker
systemctl start docker
5、查看版本
docker version
運行示例:Nginx
1栖忠、搜索并下載鏡像
docker search nginx
docker pull nginx
2崔挖、啟動一個容器并映射端口到本地
docker run -d -p 8080:80 --name Nginx nginx # 參數(shù)詳解見下文
Docker常用命令
1.鏡像控制
搜索鏡像:docker search [OPTIONS] TERM
上傳鏡像:docker push [OPTIONS] NAME[:TAG]
下載鏡像:docker pull [OPTIONS] NAME[:TAG]
提交鏡像:docker commit [OPTIONS] CONTAINER NAME[:TAG]
構(gòu)建鏡像:docker build [OPTIONS] PATH
刪除鏡像:docker rmi [OPTIONS] IMAGE [IMAGE...]
增加鏡像標(biāo)簽:docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
查看所有鏡像:docker images [OPTIONS] [REPOSITORY[:TAG]]
2.容器控制
啟動/重啟容器:docker start/restart CONTAINER
停止/強停容器:docker stop/ kill CONTAINER
刪除容器:docker rm [OPTIONS] CONTAINER [CONTAINER...]
重命名容器:docker rename CONTAINER CONTAINER_NEW
進入容器:docker attach CONTAINER
執(zhí)行容器命令:docker exec CONTAINER COMMAND
查看容器日志:docker logs [OPTIONS] CONTAINER
查看容器列表:docker ps [OPTIONS]
3.容器啟動
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-d : 后臺運行容器,并返回容器ID
-i:以交互模式運行容器狸相,通常與 -t 同時使用
-t:為容器重新分配一個偽輸入終端薛匪,通常與 -i 同時使用
-v:綁定掛載目錄
--name="mycontainer": 為容器指定一個名稱
--net="bridge": 指定容器的網(wǎng)絡(luò)連接類型,支持如下:
bridge / host / none / container:<name|id>
-p/-P :端口映射脓鹃,格式如圖:
4.其他命令
查看docker信息:docker info
docker命令幫助:docker run --help
復(fù)制文件到容器:docker cp custom.conf Nginx:/etc/nginx/conf.d/
更新容器啟動項:docker container update --restart=always nginx
查看docker日志:tail -f /var/log/messages
更多可以參考官網(wǎng):https://docs.docker.com/engine/reference/commandline/cli/
Docker鏡像構(gòu)建
1.Docker commit(1運行2修改3保存)
#運行容器
docker run -dit -p 8080:80 --name Nginx nginx
#修改容器(這里我只是做個演示逸尖,所以就復(fù)制一下文件,具體修改需要根據(jù)你實際情況)
docker cp custom.conf Nginx:/etc/nginx/conf.d/
#將容器保存為新的鏡像
docker commit Nginx zwx/nginx
2.Dockerfile(1編寫2構(gòu)建)
#編寫Dockerfile文件
vim Dockerfile
#執(zhí)行Dockerfile文件
docker build -t zwx/nginx . #后面有個點瘸右,代表當(dāng)前目錄下dockerfile文件
Docker本地倉庫
1冷溶、拉取鏡像倉庫
docker search registry
docker pull registry
2、啟動鏡像服務(wù)
docker run -dit \
--name=Registry \ # 指定容器名稱
-p 5000:5000 \ # 倉庫默認(rèn)端口是5000尊浓,映射到宿主機逞频,這樣可以使用宿主機地址訪問
--restart=always \ # 自動重啟,這樣每次docker重啟后倉庫容器也會自動啟動
--privileged=true \ # 增加安全權(quán)限栋齿,一般可不加
-v /usr/local/my_registry:/var/lib/registry \ # 把倉庫鏡像數(shù)據(jù)保存到宿主機
registry
3苗胀、注冊https協(xié)議(需要通過本地倉庫下載鏡像,均需要配置)
vim /etc/docker/daemon.json # 默認(rèn)無此文件瓦堵,需自行添加基协,有則追加一下內(nèi)容。
{ "insecure-registries":[" xx.xx.xx.xx:5000"]
} #指定ip地址或域名
4菇用、新增tag指明倉庫地址
docker tag zwx/nginx x.xx.xx.xx:5000/zwx/nginx # 如果構(gòu)建時已經(jīng)指定倉庫地址澜驮,則可以省略
5、上傳鏡像到本地倉庫
docker push x.xx.xx.xx:5000/zwx/nginx
6惋鸥、查看本地倉庫
curl -XGET http://x.xx.xx.xx:5000/v2/_catalog
Docker與圖形管理工具Portainer
1.簡介 Portainer是Docker的圖形化管理工具杂穷,提供狀態(tài)顯示面板、應(yīng)用模板快速部署卦绣、容器鏡像網(wǎng)絡(luò)數(shù)據(jù)卷的基本操作(包括上傳下載鏡像耐量,創(chuàng)建容器等操作)。
事件日志顯示滤港、容器控制臺操作廊蜒、Swarm集群和服務(wù)等集中管理和操作、登錄用戶管理和控制等功能溅漾。功能十分全面山叮,基本能滿足中小型單位對容器管理的全部需求。2.安裝使用
#搜索并下載鏡像
docker search portainer
docker pull portainer/portainer
#單機方式運行
docker run -d \
-p 9000:9000 \ # portainer默認(rèn)端口是9000添履,映射到本地9000端口屁倔,通過本地地址訪問
--restart=always \ # 設(shè)置自動重啟
-v /var/run/docker.sock:/var/run/docker.sock \ # 單機必須指定docker.sock
--name Prtainer portainer/portainer
訪問http://localhost:9000,首次登陸需要注冊用戶,給admin用戶設(shè)置密碼缝龄,然后單機版選擇local連接即可汰现。
Docker與集群管理工具Swarm
1.簡介
Swarm是Docker官方提供的一款集群管理工具挂谍,其主要作用是把若干臺Docker主機抽象為一個整體,并且通過一個入口統(tǒng)一管理這些Docker主機上的各種Docker資源瞎饲。2.安裝使用
Swarm 在 Docker 1.12 版本之前屬于一個獨立的項目口叙,在 Docker 1.12 版本發(fā)布之后,該項目合并到了 Docker 中嗅战,成為 Docker 的一個子命令妄田。
啟動swarm集群只需要執(zhí)行初始化命令即可:
docker swarm init \ # 默認(rèn)初始化節(jié)點為管理節(jié)點
--advertise-addr xx.xx.xx.xx \ #指定使用的ip
--listen-addr xx.xx.xx.xx:2377 #指定監(jiān)聽ip和port,默認(rèn)為2377
設(shè)置manager節(jié)點
docker swarm join-token manager #獲取管理節(jié)點token驮捍,放入下面命令
docker swarm join \
--advertise-addr xx.xx.xx.xx \
--listen-addr xx.xx.xx.xx:2377 \
--token SWMTKN-1-29ynh5uyfiiospy4fsm4pd4xucyji2rn0oj4b4ak4s7a37syf9-ajkrv2ctjr5cmxzuij75tbrmz \
xx.xx.xx.xx:2377
設(shè)置worker節(jié)點
docker swarm join-token worker #獲取工作節(jié)點token疟呐,放入下面命令
docker swarm join \
--advertise-addr xx.xx.xx.xx \
--listen-addr xx.xx.xx.xx:2377 \
--token SWMTKN-1-29ynh5uyfiiospy4fsm4pd4xucyji2rn0oj4b4ak4s7a37syf9-ajkrv2ctjr5cmxzuij75tbrmz \
xx.xx.xx.xx:2377
查看節(jié)點
docker node ls
創(chuàng)建服務(wù)
docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
--detach , -d: 指定容器運行于前臺還是后臺,默認(rèn)為false
--name: 服務(wù)名稱
--network: 網(wǎng)絡(luò)連接
--publish , -p: 端口映射
--env , -e: 設(shè)置環(huán)境變量
--tty , -t: 分配tty設(shè)備东且,該可以支持終端登錄
--mount: 文件掛載
--replicas: 指定任務(wù)數(shù)量
對比K8s究竟有何異同?
- a)出生不同
Google根據(jù)其在Linux上容器管理經(jīng)驗启具,改造到docker管理上,就是kubernetes珊泳。他的在許多方面表現(xiàn)良好,最重要的是構(gòu)造于Google多年的寶貴經(jīng)驗只上鲁冯。
kubernetes并不是為了docker寫的,kubernetes把集群帶到了一個全新的高度,代價是學(xué)習(xí)曲線比較陡色查。docker-swarm 使用了一個不同的方式,它是docker原生的集群工具薯演。
最方便的部分是它暴露了docker標(biāo)準(zhǔn)的編程接口,意味著你之前一直在使用的任何與docker溝通的工具(docker CLI, docker compose等)秧了,都可以無縫的在docker swarm上使用跨扮。
- b)安裝配置不同
安裝設(shè)置swarm非常簡單,簡單明了并且很靈活验毡。我們需要做的就是安裝一個服務(wù)發(fā)現(xiàn)工具衡创,然后在所有的節(jié)點上安裝swarm容器。
相比較而言米罚,kubernetes的安裝就有點復(fù)雜晦澀了钧汹。不同的操作系統(tǒng)上安裝都不同丈探。每個操作系統(tǒng)都有自己的獨立安裝指令录择。
- c)運行方式不同
使用Swarm和使用容器沒有什么不同。比如碗降,你習(xí)慣于使用Docker CLI(命令行接口)隘竭,你可以繼續(xù)使用幾乎相同的命令。
如果你習(xí)慣于使用Docker Componse來運行容器讼渊,你可以繼續(xù)在Swarm集群中使用动看。不管你之前習(xí)慣于怎么使用容器,你仍舊可以使用爪幻,只是在更大級別的集群中使用菱皆。
Kubernetes要求你去學(xué)習(xí)它自己的CLI(命令行接口)和配置须误。你不能使用你之前創(chuàng)建的docker-compose.yml配置,你必須要去新建與Kubernetes對應(yīng)的配置仇轻。
你也不能使用之前學(xué)習(xí)的Docker CLI(命令行接口)京痢。你必須要去學(xué)習(xí) Kubernetes CLI(命令行接口)
最后,當(dāng)需要在Docker Swarm 和 Kubernetes做出選擇時篷店,可以考慮如下幾點:
- 你是否想依賴于Docker自己來解決集群的問題祭椰。如果是,選擇Swarm疲陕。如果某些功能在Docker中不支持方淤,那它也非常可能在Swarm中找不到蹄殃,因為Swarm是依賴于Docker API的携茂。
- 另外一方面,如果你想要一個工具可以解決Docker的限制诅岩,Kubernetes將是不錯的選擇邑蒋。Kubernetes不是基于Docker,而是基于Google多年對于管理容器的經(jīng)驗按厘。它是按照自己的方式來行事医吊。
Docker運維流程圖
Docker配置管理
- 1.用了容器以后,還需要配置管理嗎逮京?
起初我們跟Docker官方一樣卿堂,屬于理想主義派。天真的認(rèn)為容器就應(yīng)該是inmutable的懒棉,當(dāng)需要配置變更的時候草描,重新構(gòu)建鏡像重新部署。
基于這一思路策严,我們在cSphere中添加了個鏡像自動構(gòu)建模塊穗慕,用戶可以配置代碼倉庫的地址。服務(wù)的配置文件保存于Git或者SVN庫中妻导,需要配置變更時逛绵,向版本庫中Push一下,自動通過hook觸發(fā)鏡像構(gòu)建倔韭,并自動完成線上容器的重建术浪。
通過這套系統(tǒng),用戶可以非常方便的批量更新線上的服務(wù)寿酌,并不局限于配置文件的變更胰苏,代碼的變更也天生支持。經(jīng)過實際使用醇疼,這套系統(tǒng)能夠很好的滿足開發(fā)和測試環(huán)境的需求硕并,提升工作效率法焰。
但是,在生產(chǎn)環(huán)境中使用的時候倔毙,我們發(fā)現(xiàn)這種流程其實并不那么完美壶栋,主要表現(xiàn)在:鏡像構(gòu)建和部署雖然自動化了,但構(gòu)建是針對VCS中的某個倉庫的普监,改一行配置就得整體重新構(gòu)建一下贵试,在更新容器時還需要把鏡像重新分發(fā)到所有機器上,配置變更速度太慢凯正。這種方式的配置變更會涉及到服務(wù)的重啟毙玻,這在生產(chǎn)環(huán)境某些場景下是不可接受的 ,有可能引起短暫的服務(wù)中斷廊散。
- 2.應(yīng)用配置文件應(yīng)該需要做到什么桑滩?
Docker應(yīng)用配置文件能夠保持能夠支持針對不同環(huán)境作出更改。另外配置文件支持在線更改允睹,重啟就生效运准。一般分為以下兩種方式。
a)Docker環(huán)境變量
需要在制作鏡像的時候就需要提前想好缭受,有哪些參數(shù)是部署容器的時候會經(jīng)常更改胁澳, 然后把這些參數(shù)抽出來做成容器的環(huán)境變量,然后在部署的容器的時候填入不同的參數(shù)即可米者。但是如果后續(xù)發(fā)現(xiàn)有一些參數(shù)不同場景下部署的時候也會修改韭畸,那就需要再重新制作鏡像了。
b)應(yīng)用配置文件
上述的管理方式不太靈活蔓搞,靈活的管理方式是將配置文件和鏡像剝離開胰丁,這樣就不會被鏡像給綁定了。