docker學(xué)習(xí)筆記

devops:運(yùn)維人員會(huì)在項(xiàng)目開發(fā)期間就介入到開發(fā)過(guò)程中,了解開發(fā)人員使用的系統(tǒng)架構(gòu)和技術(shù)路線,從而制定適當(dāng)?shù)倪\(yùn)維方案。而開發(fā)人員也會(huì)在運(yùn)維的初期參與到系統(tǒng)部署中,并提供系統(tǒng)部署的優(yōu)化建議暇检。


image.png
image.png

DevOps的實(shí)施,促進(jìn)開發(fā)和運(yùn)維人員的溝通婉称,增進(jìn)彼此的理(gan)解(qing)块仆。

docker 學(xué)什么

  • docker概述
  • docker安裝
  • docker命令
  • docker鏡像构蹬!
  • 容器數(shù)據(jù)卷!;诰荨庄敛!
  • DockerFile
  • Docker網(wǎng)絡(luò)原理
  • IDEA整合daocker
  • Docker Compose
  • Docker Swarm(簡(jiǎn)化版K8S)
  • CI/CD jenkins

docker概述

image.png
docker為什么出現(xiàn)?

項(xiàng)目階段:開發(fā)-上線 兩套環(huán)境蜜暑!
應(yīng)用環(huán)境铐姚、應(yīng)用環(huán)境
開發(fā) | 運(yùn)維

問(wèn)題:我在我電腦上可以運(yùn)行! 版本更新導(dǎo)致服務(wù)不可用肛捍!這十分考驗(yàn)運(yùn)維
解決:開發(fā)即運(yùn)維
吐槽:java后端作為全棧真的累隐绵,要會(huì)前端,要會(huì)后臺(tái)拙毫、要會(huì)運(yùn)維依许、還要會(huì)架構(gòu)

問(wèn)題:環(huán)境配置麻煩,每一個(gè)機(jī)器都要部署環(huán)境(集群redis缀蹄、ES峭跳、hadoop)部署麻煩,且不能跨平臺(tái)H鼻啊蛀醉!windos,最后發(fā)布到linux
發(fā)布一個(gè)jar很簡(jiǎn)單,需要的環(huán)境(redistribution衅码、nysqk拯刁,jdk,ES,tomcat)可能一天都部署不好
傳統(tǒng)解決方案:開發(fā)人員提供jar,運(yùn)維來(lái)部署
現(xiàn)在解決:發(fā)布一個(gè)項(xiàng)目(jar + 環(huán)境)逝段,項(xiàng)目帶上環(huán)境安裝打包垛玻。開發(fā)部署上線,一套流程做完

docker給上面問(wèn)題提出了解決方案!
java -> jar => 打包項(xiàng)目帶上環(huán)境(鏡像) =》Docker倉(cāng)庫(kù) =》下載發(fā)布的鏡像 =》直接運(yùn)行

docker的思想來(lái)自于集裝箱
系統(tǒng)上運(yùn)行多個(gè)應(yīng)用奶躯,多個(gè)應(yīng)用之前可能產(chǎn)生沖突(端口沖突帚桩、配置沖突...)

docker將應(yīng)用打包裝箱,每個(gè)箱子互相隔離

docker的歷史

docker為什么火

相比于虛擬機(jī)技術(shù)嘹黔,十分的輕巧

聊聊docker
docker是基于go語(yǔ)言開發(fā)的账嚎,開源項(xiàng)目
官網(wǎng):https://www.docker.com/
倉(cāng)庫(kù)地址:https://registry.hub.docker.com/

docker能做什么

容器化技術(shù)
容器化技術(shù)不是模擬的一個(gè)完整的操作系統(tǒng)
容器之間互相隔離

devOps

  • 更快速的交付和部署(docker打包鏡像部署,一鍵運(yùn)行)
  • 更便捷的升級(jí)和擴(kuò)縮容
    -更簡(jiǎn)單的系統(tǒng)運(yùn)維(使用docker之后儡蔓,開發(fā)測(cè)試環(huán)境都是高度一致的)
    -更高效的計(jì)算資源利用(docker是內(nèi)核級(jí)別的虛擬化醉锄,可以在一個(gè)物理機(jī)上運(yùn)行很多個(gè)容器,高效使用服務(wù)齊性能U阒怠!)

docker安裝

docker的基本組成

image.png
鏡像(image)

鏡像是一種輕量級(jí)檩小、可執(zhí)行的獨(dú)立軟件包开呐、用來(lái)打包軟件運(yùn)行環(huán)境和基于運(yùn)行環(huán)境開發(fā)的軟件,它包含運(yùn)行某個(gè)軟件所需的所有內(nèi)容、包括代碼筐付、運(yùn)行時(shí)卵惦、庫(kù)、環(huán)境變量和配置文件
所有的應(yīng)用瓦戚,直接打包docker鏡像沮尿,就可以直接運(yùn)行
如何得到鏡像:

  • 從遠(yuǎn)程倉(cāng)庫(kù)拉取
  • 拷貝
    -自己制作一個(gè)鏡像DockerFile
容器(container)
倉(cāng)庫(kù)(repository)

存放鏡像的地方
倉(cāng)庫(kù)分為共有倉(cāng)庫(kù)和私有倉(cāng)庫(kù)
docker hub(默認(rèn)國(guó)外)
阿里云等都有容器服務(wù)(配置鏡像加速)

1. 卸載舊的版版本

$ sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine

2. 安裝yum-utils軟件包(提供yum-config-manager實(shí)用程序)并設(shè)置穩(wěn)定的存儲(chǔ)庫(kù)。
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo (默認(rèn)國(guó)外的)

##修改為阿里云鏡像地址
$ sudo yum-config-manager \
    --add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 安裝docker引擎

更新 yum makecache fast

$ sudo yum install docker-ce docker-ce-cli containerd.io
docker-ce:社區(qū)版(推薦使用)
docker-ee:企業(yè)版
默認(rèn)安裝最新版本

我安裝的版本sudo yum install docker-ce-18.09.3-3.el7 docker-ce-cli-18.09.9-3.el7 containerd.io

啟動(dòng)docker较解、測(cè)試

$ sudo systemctl start docker
docker version查看是否安裝成功

卸載docker

卸載docker引擎 sudo yum remove docker-ce docker-ce-cli containerd.io 刪除docker 鏡像畜疾,容器,自定義配置文件等: sudo rm -rf /var/lib/docker

阿里云鏡像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://3x9xdpne.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

docker權(quán)限配置

通常我們使用Docker的時(shí)候都是使用的root印衔,官方說(shuō)法如下

The docker daemon binds to a Unix socket instead of a TCP port. By default that Unix socket is owned by the user root and other users can access it with sudo. For this reason, docker daemon always runs as the root user.
To avoid having to use sudo when you use the docker command, create a Unix group called docker and add users to it. When the docker daemon starts, it makes the ownership of the Unix socket read/writable by the docker group.

docker序綁定到Unix套接字而不是TCP端口啡捶。默認(rèn)情況下,Unix套接字是由root用戶擁有的奸焙,其他用戶可以使用sudo訪問(wèn)它瞎暑。因此,docker守護(hù)程序始終以root用戶身份運(yùn)行与帆。為了避免在使用docker命令時(shí)必須使用sudo了赌,請(qǐng)創(chuàng)建一個(gè)名為docker的Unix組并將用戶添加到其中。 docker守護(hù)程序啟動(dòng)時(shí)玄糟,它將使docker組可以讀取/寫入U(xiǎn)nix套接字的所有權(quán)勿她。

創(chuàng)建docker組

sudo groupadd docker

將當(dāng)前用戶加入docker組

sudo gpasswd -a ${USER} docker

重啟docker服務(wù)

sudo service docker restart
或 sudo systemctl restart docker

更新用戶組

newgrp docker #更新用戶組

docker底層原理

docker怎么工作?
docker是一個(gè)CS結(jié)構(gòu)的系統(tǒng)茶凳,docker的守護(hù)進(jìn)程運(yùn)行在主機(jī)上嫂拴,通過(guò)socket從客戶端訪問(wèn),dockerServer接收到docker-client的指令贮喧,執(zhí)行命令


image.png

docker為什么比VM快筒狠?

  1. docker有比虛擬機(jī)更少的抽象層


    image.png
  2. docker利用的是宿主機(jī)的內(nèi)核,VM需要加載Guest OS

docker常用命令

幫助命令

docker version           #顯示docker版本信息
docker info              #顯示docker的系統(tǒng)信息箱沦,包括鏡像和容器的數(shù)量
docker 命令 --help       #幫助命令

幫助文檔地址:https://docs.docker.com/reference/

鏡像命令

docker images           #查看所有本地主機(jī)上的鏡像
docker search           #搜索鏡像辩恼,默認(rèn)是搜索DockerHub
docker pull                #拉取鏡像
docker rmi                #刪除鏡像
docker rmi -f $(docker images -aq)  #刪除全部鏡像

容器命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 新建容器并啟動(dòng)
參數(shù)說(shuō)明:
--name="XXX" 容器名字
-d 以后臺(tái)方式運(yùn)行
-it 使用交互方式運(yùn)行,進(jìn)入容器查看內(nèi)容
-P 指定容器端口: -p 主機(jī)端口:容器端口(常用)
????????? -P 容器端口
?????????容器端口
?????????-p 隨機(jī)指定端口

docker run -it centos /bin/bash   #啟動(dòng)并進(jìn)入容器
docker ps   #列出當(dāng)前正在運(yùn)行的容器
docker ps  -a  #列出當(dāng)前正在運(yùn)行的容器 + 歷史運(yùn)行過(guò)的容器
docker ps  -n=?    #顯示最近創(chuàng)建的容器
docker rm   容器id #刪除容器
docker start 容器id  #啟動(dòng)一個(gè)已經(jīng)創(chuàng)建的容器
docker restart 容器id #重啟容器
docker stop 容器id  #停止當(dāng)前正在運(yùn)行容器
docker kill 容器id  #強(qiáng)制停止當(dāng)前容器

常用其他命令

常見的坑:
docker容器使用后臺(tái)運(yùn)行谓形,就必須要有前臺(tái)進(jìn)程灶伊,docker發(fā)現(xiàn)沒(méi)有應(yīng)用,就會(huì)自動(dòng)停止

docker run -d  鏡像名  #docker ps發(fā)現(xiàn)容器停止了寒跳,
docker logs  -tf --tail n 容器id  #查看容器日志
docker top 容器id[ps options]      #查看容器中的進(jìn)程信息!!!!!!
docker inspect [OPTIONS] NAME|ID [NAME|ID...]#查看鏡像元數(shù)據(jù)!!!!!!!!!!!!!!!!!!
docker  exec -it 容器id   bashshell  #進(jìn)入當(dāng)前正在運(yùn)行的容器(進(jìn)入容器后開啟一個(gè)新的終端)F溉!童太!
docker attach 容器id     #進(jìn)入當(dāng)前正在運(yùn)行的容器(進(jìn)入容器正在執(zhí)行的終端)C追P赝辍!
docker cp 容器id:容器內(nèi)路徑   宿主機(jī)路徑#從容器內(nèi)拷貝文件到宿主機(jī)
docker stats         #查看cpu的狀態(tài)

小結(jié)

image.png

docker可視化

  • portainer
  • ranch(CI/CD使用)G讨赊窥!

portainer

docker圖形化界面管理工具
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

docker鏡像加載原理

UnionFS(聯(lián)合文件系統(tǒng),UFS)

聯(lián)合文件系統(tǒng)(Union File System):2004年由紐約州立大學(xué)石溪分校開發(fā)狸页,它可以把多個(gè)目錄(也叫分支)內(nèi)容聯(lián)合掛載到同一個(gè)目錄下锨能,而目錄的物理位置是分開的。UnionFS允許只讀和可讀寫目錄并存芍耘,就是說(shuō)可同時(shí)刪除和增加內(nèi)容址遇。UnionFS應(yīng)用的地方很多,比如在多個(gè)磁盤分區(qū)上合并不同文件系統(tǒng)的主目錄齿穗,或把幾張CD光盤合并成一個(gè)統(tǒng)一的光盤目錄(歸檔)傲隶。另外纱注,具有寫時(shí)復(fù)制(copy-on-write)功能UnionFS可以把只讀和可讀寫文件系統(tǒng)合并在一起声滥,虛擬上允許只讀文件系統(tǒng)的修改可以保存到可寫文件系統(tǒng)當(dāng)中。

docker鏡像分層

docker鏡像的結(jié)構(gòu)就像花卷一樣府喳,是一層一層的脖卖,比如tomcat鏡像乒省,它有450M左右,但我們實(shí)際的tomcat卻很小畦木,為什么tomcat鏡像那么大呢袖扛,是因?yàn)椋瑃omcat鏡像的最里面是kernel內(nèi)核十籍,外面的一層是centos鏡像蛆封,再外面可能是jdk鏡像,最外面才是暴露出來(lái)的tomcat鏡像勾栗,所以這么大惨篱,docker這么做的好處就是可以實(shí)現(xiàn)鏡像資源的共享,所有層的鏡像都會(huì)在本地緩存一份围俘,再次下載相同的鏡像的時(shí)候砸讳,直接拿來(lái)使用就可以了。

commit鏡像

docker commit    -m="提交的描述細(xì)膩些"   -a="作者"  容器id   目標(biāo)鏡像名:[tag]   #提交容器成為一個(gè)新的副本

容器數(shù)據(jù)卷

思考: docker將應(yīng)用和環(huán)境打包成一個(gè)鏡像界牡,如果數(shù)據(jù)都在容器中簿寂,如果容器刪除,數(shù)據(jù)將會(huì)丟失
需求:數(shù)據(jù)庫(kù)數(shù)據(jù)可以存儲(chǔ)在本地
解決:容器間可以有一個(gè)數(shù)據(jù)共享的技術(shù)宿亡。docker容器中產(chǎn)生的數(shù)據(jù)常遂,同步到本地

這就是卷技術(shù),將容器內(nèi)的目錄挽荠,掛載到宿主機(jī)上烈钞,實(shí)現(xiàn)容器的持久化和同步操作泊碑,容器間可以實(shí)現(xiàn)數(shù)據(jù)共享

使用數(shù)據(jù)源

方式一:直接使用命令掛載 -v

docker run -it -v 主機(jī)目錄:容器內(nèi)目錄
eg:  docker run -it -v ~/docker_practice/v_test:/home --name nginx02 nginx /bin/bash

docker volume inspect ###查看數(shù)據(jù)卷

具名掛載、匿名掛載

docker run -it -v 容器內(nèi)目錄  --name nginx02 nginx /bin/bash    #匿名掛載


docker run -it -v ${name}:/home --name nginx02 nginx /bin/bash  #具名掛載

所有的docker容器內(nèi)的卷毯欣,沒(méi)有指定目錄的情況下都是在var/lib/docker/volumes/xxx/_data

方式二 使用Dockerfile
Dockerfile用來(lái)構(gòu)建doucker鏡像的構(gòu)建文件,是一個(gè)腳本臭脓,通過(guò)這個(gè)腳本酗钞,可以生產(chǎn)一個(gè)鏡像

方式三 數(shù)據(jù)卷容器 --volumes-from

docker run -it --name  ${name} --volumes-from  容器  鏡像

DockerFile

構(gòu)建步驟

  1. 編寫一個(gè)dockerfile文件
  2. docker build 構(gòu)建一個(gè)鏡像
  3. docker run 運(yùn)行鏡像
  4. docker push 發(fā)布鏡像(dockerbub、阿里云鏡像来累、私有倉(cāng)庫(kù))

基礎(chǔ)知識(shí)
1.每個(gè)保留關(guān)鍵字(指令)都必須大寫
2.執(zhí)行從上到下順序執(zhí)行
3.#表示注釋
每一個(gè)指令都會(huì)創(chuàng)建提交一個(gè)新的鏡像層砚作,并提交

image.png
/**
*dockerfile命令
*/
FROM    XXXX    //基礎(chǔ)鏡像
MAINTAINER     //j鏡像作者,姓名+郵箱
RUN                   //鏡像構(gòu)建的時(shí)候需要運(yùn)行的命令
ADD                   //拷貝文件到鏡像中
WORKDIR          //鏡像的工作目錄
VOLUME           //掛載的目錄
EXPOSE           //暴露端口
CMD                 //指定容器啟動(dòng)的時(shí)候要運(yùn)行的命令嘹锁,只有最后一個(gè)會(huì)生效葫录,可被替代
ENTRYPOINT     //指定容器啟動(dòng)的時(shí)候要運(yùn)行的命令,可以追加命令
ONBUILD      //當(dāng)構(gòu)建一個(gè)被繼成的dockerfile领猾,會(huì)運(yùn)行ONBUILD的指令
COPY           //類似ADD命令米同,將文件拷貝到鏡像中
ENV             #構(gòu)建的時(shí)候設(shè)置環(huán)境變量
image.png

docker build -f xxx -t name:tag .

dockse history 鏡像 #查看鏡像制作步驟

發(fā)布鏡像

發(fā)布到dockerhub

  1. 注冊(cè)賬號(hào)
    2.在我們服務(wù)器上提交自己的鏡像
    3.登陸 docker login
    4.提交鏡像docker push

發(fā)布到阿里云鏡像
1.登陸阿里云,找到容器鏡像服務(wù)
2.創(chuàng)建一個(gè)命名空間
3.創(chuàng)建一個(gè)容器鏡像倉(cāng)庫(kù)

4.
image.png

docker網(wǎng)絡(luò)

理解docker0
每啟動(dòng)一個(gè)docker容器摔竿,docker就會(huì)給docker容器分配一個(gè)ip面粮,我們只要安裝了docker,就會(huì)有一個(gè)網(wǎng)卡docker0继低,橋接模式熬苍,使用的是evth-pair技術(shù)

evth-pair技術(shù)
就是一對(duì)的虛擬設(shè)備接口,一端連著協(xié)議袁翁,一端彼此相連
evth-pair充當(dāng)一個(gè)橋梁柴底,連接各種虛擬網(wǎng)絡(luò)設(shè)備
openStack,docker容器粱胜、ovs的連接柄驻,都是使用的evth-pair技術(shù)

image.png

docker Compose 容器編排

docker swarm 集群部署

CI/CD jenkins 流水線

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市年柠,隨后出現(xiàn)的幾起案子凿歼,更是在濱河造成了極大的恐慌,老刑警劉巖冗恨,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件答憔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡掀抹,警方通過(guò)查閱死者的電腦和手機(jī)虐拓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)傲武,“玉大人蓉驹,你說(shuō)我怎么就攤上這事城榛。” “怎么了态兴?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵狠持,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瞻润,道長(zhǎng)喘垂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任绍撞,我火速辦了婚禮正勒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘傻铣。我一直安慰自己,他們只是感情好非洲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布怪蔑。 她就那樣靜靜地躺著里覆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缆瓣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天隧甚,我揣著相機(jī)與錄音,去河邊找鬼渡冻。 笑死戚扳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帽借。 我是一名探鬼主播超歌,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼巍举,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起梦皮,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤桃焕,失蹤者是張志新(化名)和其女友劉穎覆旭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體型将,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡七兜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年腕铸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铛碑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涛菠,死狀恐怖撇吞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情迄薄,我是刑警寧澤煮岁,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站冶伞,受9級(jí)特大地震影響色罚,放射性物質(zhì)發(fā)生泄漏戳护。R本人自食惡果不足惜瀑焦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一梗肝、第九天 我趴在偏房一處隱蔽的房頂上張望巫击。 院中可真熱鬧,春花似錦坝锰、人聲如沸顷级。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)翔冀。三九已至,卻和暖如春搬瑰,著一層夾襖步出監(jiān)牢的瞬間计福,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留说订,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像埂伦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膊毁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容