Docker為什么出現(xiàn)?
一款產(chǎn)品:開(kāi)發(fā)到上線需要兩套環(huán)境沾乘!
而一套環(huán)境配置是十分麻煩的怜奖!尤其是集群環(huán)境!費(fèi)事費(fèi)力翅阵!
發(fā)布一個(gè)項(xiàng)目:需要(jar+(Redis+mysql+jdk+es))歪玲。而且不能進(jìn)行跨平臺(tái)!
那么引入一個(gè)問(wèn)題掷匠?
項(xiàng)目和環(huán)境能不能一塊發(fā)布滥崩?
可以的!開(kāi)發(fā)打包部署上線讹语,一套流程做完钙皮!就是Docker提出了解決方案!
Docker運(yùn)行的步驟
java -- jar(環(huán)境) ---打包項(xiàng)目帶上環(huán)境(鏡像) ---(Docker倉(cāng)庫(kù):商店) --- 下載我們的鏡像 ---直接運(yùn)行即可!
本質(zhì):所以的技術(shù)都是因?yàn)槌霈F(xiàn)了一些問(wèn)題短条,我們才需要去學(xué)習(xí)导匣。
Docker概述
Docker的歷史
2010年,幾個(gè)搞it的年輕人茸时,在美國(guó)成立了一個(gè)公司 dotCloud贡定。做一些pass的云計(jì)算服務(wù),LXC有關(guān)的容器操作屹蚊。他們把自己的技術(shù)厕氨,容器化技術(shù)命名Docker。
剛誕生的時(shí)候汹粤,沒(méi)人關(guān)注命斧,后來(lái)快堅(jiān)持不住了,就在2013年的時(shí)候開(kāi)源了嘱兼!
2014年4月9日国葬,Docker1.0發(fā)布!
Docker為什么這么火芹壕?因?yàn)檩p巧汇四。
虛擬機(jī):我們?cè)陔娔X上裝一個(gè)vm軟件,可以虛擬出一個(gè)或多個(gè)操作系統(tǒng)踢涌。
虛擬機(jī)也是屬于虛擬化技術(shù)通孽,Docker容器技術(shù),也是一種虛擬化技術(shù)睁壁!
vm:linux centos原生鏡像(就基本是一臺(tái)電腦) 隔離需要開(kāi)啟多個(gè)虛擬機(jī)背苦! 幾個(gè)G
docker:隔離,鏡像(只需要核心的環(huán)境潘明,jdk+mysql+需要的環(huán)境)十分的小巧行剂!幾個(gè)M KB 秒級(jí)啟動(dòng)!
Docker官方:https://www.docker.com/
Docker Hub官方:https://hub.docker.com/(類似于GitHub)
Docker能干什么钳降?
之前的虛擬技術(shù)
虛擬機(jī)技術(shù)缺點(diǎn):
1厚宰、資源占用十分多
2笆怠、冗余步驟多
3铸鹰、啟動(dòng)很慢吠昭!
現(xiàn)在的容器技術(shù)
比較Docker和傳統(tǒng)的虛擬技術(shù)的不同:
- 傳統(tǒng)虛擬機(jī)沟沙,虛擬出一條硬件某弦,運(yùn)行一個(gè)完整的操作系統(tǒng)苛谷,然后在這個(gè)系統(tǒng)中安裝和運(yùn)行軟件讹躯。
- 容器中的應(yīng)用直接運(yùn)行在宿主機(jī)的內(nèi)容顶考,容器自己是沒(méi)有內(nèi)核的凌唬,也沒(méi)有虛擬我們的硬件并齐,所以輕便了
- 每個(gè)容器間是隔離的漏麦,每個(gè)容器間都有自己的一套文件系統(tǒng),互不影響况褪。
DevOps(開(kāi)發(fā)撕贞,運(yùn)維)
應(yīng)用更快速的交付和部署
傳統(tǒng):一堆幫助文檔,安裝測(cè)試
Docker:打包鏡像测垛,一鍵測(cè)試
更便捷的升級(jí)和擴(kuò)容
使用了Docker之后捏膨,我們部署應(yīng)用就和搭建積木一樣!
更簡(jiǎn)單的系統(tǒng)運(yùn)維
在容器化操作之后食侮,我們的開(kāi)發(fā)号涯,測(cè)試環(huán)境都是高度一致。
更高效的計(jì)算機(jī)利用資源
Docker是內(nèi)核級(jí)別的虛擬化锯七,可以再一個(gè)物理機(jī)上運(yùn)行很多的容器實(shí)例链快。服務(wù)器的性能可以被壓榨到極致。
Docker安裝
這里發(fā)現(xiàn)安裝失敗..可以參考這個(gè)進(jìn)行安裝https://blog.csdn.net/weixin_45987569/article/details/108297022
Docker的基本組成
鏡像(image):
docker鏡像就好比是一個(gè)模板眉尸,可以通過(guò)這個(gè)模板創(chuàng)建容器服務(wù)域蜗,tomcat鏡像==>run-->tomcat容器(提供服務(wù)器)
通過(guò)這個(gè)鏡像可以創(chuàng)建多個(gè)容器。
容器(container):
Docker利用容器技術(shù)噪猾,獨(dú)立運(yùn)行一個(gè)或者一個(gè)組應(yīng)用霉祸,通過(guò)鏡像來(lái)創(chuàng)建的。
啟動(dòng)袱蜡,停止丝蹭,刪除,基本命令坪蚁。目前我們就可以把這個(gè)容器理解為一個(gè)簡(jiǎn)易的linux系統(tǒng)半夷。
倉(cāng)庫(kù):
Docker用倉(cāng)庫(kù)保存用戶創(chuàng)建的鏡像,倉(cāng)庫(kù)分共有和私有兩種迅细,Docker公司自己提供了倉(cāng)庫(kù)Docker Hub,可以在Docker Hub上創(chuàng)建賬戶淘邻,保存分享自己創(chuàng)建的鏡像茵典。當(dāng)然也可以架設(shè)私有倉(cāng)庫(kù)。
安裝Docker
環(huán)境準(zhǔn)備
1宾舅、Linux基礎(chǔ)
2统阿、Centos7
3、xshell連接服務(wù)器
查看系統(tǒng)內(nèi)核
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# uname -r
3.10.0-1062.12.1.el7.x86_64
安裝步驟
#如果已經(jīng)安裝筹我,先清除之前的
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
#安裝Docker
yum install -y yum-utils
#配置阿里云鏡像源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum軟件包索引
yum makecache fast
#安裝docker docker-ce社區(qū) ee企業(yè)版
yum install docker-ce-cli containerd.io
#啟動(dòng)docker
systemctl start docker
#使用docker version測(cè)試是否成功
docker version
如果安裝不成功扶平,無(wú)法啟動(dòng),可以嘗試百度中的其他方法蔬蕊!
我們可以發(fā)現(xiàn)结澄,我們的docker版本號(hào),也代表啟動(dòng)成功了!
#運(yùn)行鏡像hello-world
docker run hello-world
#查看鏡像源
docker images
卸載docker
#1麻献、卸載依賴
yum remove docker-ce docker-ce-cli containerd.io
#2们妥、刪除資源
rm -rf /var/lib/docker
# /var/lib/docker docker的默認(rèn)工作路徑
阿里云鏡像加速
登錄阿里云,找到容器鏡像加速(這部一定要加上勉吻,否則下載鏡像還是很慢<嗌簟)
配置使用:4個(gè)指令
我們對(duì)Docker進(jìn)行如上的四個(gè)配置,致使我們的docker下載鏡像時(shí)會(huì)更快惑惶!
回顧HelloWorld流程
首先先去本地尋找Docker鏡像,判斷如果有的話就去用藐唠,如果沒(méi)有就去下載到本地。
Docker是怎么工作的倒堕?
Docker是一個(gè) Client- Server結(jié)構(gòu)的系統(tǒng), Docker的守護(hù)進(jìn)程運(yùn)行在主機(jī)上涯雅。通過(guò) Socket從客戶端訪問(wèn)
Docker Server接收到 Docker-Client的指令,就會(huì)執(zhí)行這個(gè)命令!
Docker為什么比虛擬機(jī)快锈遥?
1钾唬、Docker有比虛擬機(jī)更少的抽象層
2檩坚、Docker用的是宿主機(jī)內(nèi)核沪猴,VM需要的是Guest OS岭参。
由以上兩點(diǎn):
- 新建一個(gè)容器的時(shí)候, docker不需要像虛擬機(jī)一樣重新加載一個(gè)操作系統(tǒng)內(nèi)核,避免引導(dǎo)尝艘。
- 虛擬機(jī)是加載 Guest os,分鐘級(jí)別的,而 docker是利用宿主機(jī)的操作系統(tǒng)嗎,省略了這個(gè)復(fù)雜的過(guò)程,秒級(jí)!
Docker的常用命令
幫助命令
#顯示docker的版本信息
docker version
#顯示docker詳細(xì)的信息
docker info
#萬(wàn)能命令
docker 命令 -help
docker官方幫助文檔:
https://docs.docker.com/engine/reference/commandline/ps/#show-both-running-and-stopped-containers
鏡像命令
查看鏡像
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 4cdbec704e47 6 weeks ago 98.2MB
hello-world latest bf756fb1ae65 4 months ago 13.3kB
#解釋
REPOSITORY 鏡像的倉(cāng)庫(kù)源
TAG 鏡像的標(biāo)簽
IMAGE ID 鏡像的id
CREATED 鏡像的創(chuàng)造時(shí)間
SIZE 鏡像的大小
#可選項(xiàng)
-a 代表 --all #列出所有的鏡像
-1 代表 --quite #只顯示鏡像的id
搜索鏡像
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9494 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3441 [OK]
#真實(shí)搜出來(lái)的很多演侯,這里只顯示兩個(gè)
#可選項(xiàng),通過(guò)搜索進(jìn)行過(guò)濾starts大于3000的
--filter=stars=3000
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker search mysql --filter=stars=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9494 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3441 [OK]
下載鏡像
#下載鏡像docker pull 鏡像名[:tag]
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker pull mysql
Using default tag: latest #如果這里不寫(xiě)版本號(hào),那么就是下載的最新版
latest: Pulling from library/mysql
5b54d594fba7: Pull complete
07e7d6a8a868: Pull complete
abd946892310: Pull complete
dd8f4d07efa5: Pull complete
076d396a6205: Pull complete
cf6b2b93048f: Pull complete
530904b4a8b7: Pull complete
fb1e55059a95: Pull complete
4bd29a0dcde8: Pull complete
b94a001c6ec7: Pull complete
cb77cbeb422b: Pull complete
2a35cdbd42cc: Pull complete
Digest: sha256:dc255ca50a42b3589197000b1f9bab2b4e010158d1a9f56c3db6ee145506f625#簽名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真實(shí)地址
#上面的命令等價(jià)于
docker pull docker.io/library/mysql:latest
#我們還可以指定下載版本背亥,mysql5.7
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
5b54d594fba7: Already exists #和以前共用的版本就不用下載了(聯(lián)合文件)
07e7d6a8a868: Already exists
abd946892310: Already exists
dd8f4d07efa5: Already exists
076d396a6205: Already exists
cf6b2b93048f: Already exists
530904b4a8b7: Already exists
a37958cbebcf: Pull complete
04960017f638: Pull complete
e1285def0d2a: Pull complete
670cb3a9678e: Pull complete
Digest: sha256:e4d39b85118358ffef6adc5e8c7d00e49d20b25597e6ffdc994696f10e3dc8e2
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
注意:下載的版本必須可以查詢到秒际,我們?cè)赿ocker hub進(jìn)行看到
刪除鏡像
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 e73346bdf465 11 hours ago 448MB
mysql latest a0d4d95e478f 11 hours ago 541MB
redis latest 4cdbec704e47 6 weeks ago 98.2MB
hello-world latest bf756fb1ae65 4 months ago 13.3kB
#刪除鏡像
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker rmi -f a0d4d95e478f
Untagged: mysql:latest
Untagged: mysql@sha256:dc255ca50a42b3589197000b1f9bab2b4e010158d1a9f56c3db6ee145506f625
Deleted: sha256:a0d4d95e478ff2962ede50c50b7dc2fc699382bcb94ad301e9c6805609f0939a
Deleted: sha256:4404a13192a5c458ee1c3160b910728fc3723687a5d4c6b83481d09d6cac6e7b
Deleted: sha256:2c91a02c5543a7b08784d159b4d749d0b8c82c1dcfd8567570e8350af2d76669
Deleted: sha256:9f5911321949d1869260b9fef13ba3bea465ea8db257fdcd0193ec68db2741b0
Deleted: sha256:60023f7e525ce09db7bc5c3941cf86caef06c5fbe0bf770efb648ef73f8e705e
Deleted: sha256:44d7b6c26325a1653b5052d8c15f9086a7a952f059e33763512a668848b6961c
#我們重新查看鏡像,可以發(fā)現(xiàn)已經(jīng)刪除
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 e73346bdf465 11 hours ago 448MB
redis latest 4cdbec704e47 6 weeks ago 98.2MB
hello-world latest bf756fb1ae65 4 months ago 13.3kB
#刪除多個(gè)鏡像
docker rmi -f 鏡像id 鏡像id 鏡像id 鏡像id
#刪除全部鏡像
#這里用到的思想就是docker images -aq顯示所有的id狡汉,進(jìn)行刪除娄徊,聯(lián)合刪除!
docker rmi -f $(docker images -aq)
容器命令
說(shuō)明:我們有了鏡像才可以創(chuàng)建容器轴猎,我們可以下載一個(gè)centos鏡像用來(lái)學(xué)習(xí)
docker pull centos
新建容器并啟動(dòng)
docker run是利用鏡像生成容器嵌莉,并啟動(dòng)容器,而docker start是啟動(dòng)一個(gè)之前生成過(guò)的容器
docker run [可選參數(shù)] image
#參數(shù)說(shuō)明
--name="Name" #容器名字 tomcat01 tomcat02,用來(lái)區(qū)分容器
-d #以后臺(tái)方式運(yùn)行
-it #使用交互方式運(yùn)行捻脖,進(jìn)入容器查看內(nèi)容
-p #指定容器的端口 -p 8080:8080
-p ip:主機(jī)端口:容器端口
-p 主機(jī)端口:容器端口(常用)
-p 容器端口
-p #隨機(jī)指定端口
#測(cè)試 啟動(dòng)容器
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker run -it centos /bin/bash
[root@9f938cd50b09 /]# ls #我們通過(guò)ls命令查看該centos容器下的文件夾
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#我們可以發(fā)現(xiàn)這和我們自己的linux文件少了很多锐峭,正是由于它是基礎(chǔ)版本的,所以沒(méi)有正式的多
[root@9f938cd50b09 /]# exit #從容器中退出系統(tǒng)
exit
#分別以3310和3311端口號(hào)運(yùn)行兩個(gè)tomcat容器
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker run -d -p 3310:8080 --name t1 diytomcat
b912b4f691004bddadc64b511dbed6afd9d7704c1887c1a7fc03fcd3a660722a
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker run -d -p 3311:8080 --name t2 diytomcat
2ee142c87ce1a6418c6f4a272e63aa95767718b445dfeef99b39824df25bf0c0
列出所有運(yùn)行的內(nèi)存
# 列出當(dāng)前正在運(yùn)行的容器
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#列出當(dāng)前正在運(yùn)行的容器+列出歷史運(yùn)行過(guò)的容器
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f938cd50b09 centos "/bin/bash" 14 minutes ago Exited (0) 11 minutes ago vigilant_agnesi
bb1c862ee8df centos "/bin/bash" 33 minutes ago Exited (0) 33 minutes ago myCentos
c0734cc4eb49 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago elegant_feynman
#只顯示容器的編號(hào)
docker -q
退出容器
exit #直接退出容器并且停止
ctrl + P + Q # 容器不停止退出可婶,后臺(tái)運(yùn)行
刪除容器
docker rm 容器id #刪除指定的容器沿癞,但是不能刪除正在運(yùn)行的容器,強(qiáng)制刪除rm -f
docker rm -f $(docker ps -aq) #刪除所有容器
docker rm -a -q|xargs docker rm #刪除所有容器(這個(gè)不正確矛渴,有錯(cuò)誤W笛铩)
啟動(dòng)和停止容器操作
docker start 容器id #啟動(dòng)容器
docker restart 容器id #重啟容器
docker stop 容器id #停止當(dāng)前正在運(yùn)行的容器
docker kill 容器id #強(qiáng)制停止當(dāng)前容器
docker stop $(docker ps -q) #停止全部運(yùn)行的容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq) #一條命令停止并刪除所有的容器
存在的幾個(gè)問(wèn)題:
docker run 和 docker start區(qū)別
docker run 只在第一次運(yùn)行時(shí)使用,將鏡像放到容器中具温,以后再次啟動(dòng)這個(gè)容器時(shí)蚕涤,只需要使用命令docker start 即可。docker run相當(dāng)于執(zhí)行了兩步操作:將鏡像放入容器中(docker create),然后將容器啟動(dòng)铣猩,使之變成運(yùn)行時(shí)容器(docker start)揖铜。
那么docker start 又和 docker restart有什么區(qū)別?
restart Restart a running container :翻譯 就是百重啟一度個(gè)問(wèn)正在運(yùn)行的答容器
start Start a stopped container :翻譯就是啟動(dòng)版一個(gè)暫停的容器
[docker run -it centos /bin/bash 后面的 bin/bash的作用]
首先达皿,docker run -it centos 的意思是天吓,為centos這個(gè)鏡像創(chuàng)建一個(gè)容器贿肩, -i和-t這兩個(gè)參數(shù)的作用是,為該docker創(chuàng)建一個(gè)偽終端龄寞,這樣就可以進(jìn)入到容器的交互模式汰规?(也就是直接進(jìn)入到容器里面)后面的/bin/bash的作用是表示載入容器后運(yùn)行bash ,docker中必須要保持一個(gè)進(jìn)程的運(yùn)行,要不然整個(gè)容器啟動(dòng)后就會(huì)馬上kill itself物邑,這樣當(dāng)你使用docker ps 查看啟動(dòng)的容器時(shí)溜哮,就會(huì)發(fā)現(xiàn)你剛剛創(chuàng)建的那個(gè)容器并不在已啟動(dòng)的容器隊(duì)列中。這個(gè)/bin/bash就表示啟動(dòng)容器后啟動(dòng)bash拂封。
表示當(dāng)前用戶使用的shell是/bin/bash茬射,所謂的shell你可以理解為操作系統(tǒng)和人之間交互的平臺(tái)。例如windows系統(tǒng)的桌面環(huán)境就是一個(gè)shell冒签。
bin目錄中基本上都是可執(zhí)行的命令在抛。
幾個(gè)啟動(dòng)容器問(wèn)題
https://www.cnblogs.com/doraman/p/12176888.html
常用其他命令
后臺(tái)啟動(dòng)容器:
# 命令 docker run -d 鏡像名
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker run -d centos
a85212f28e0b80f04ca85cb630a781de3a5e7a1e8f1ef5bdddb329303675b306
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#但是!我們發(fā)現(xiàn)問(wèn)題了萧恕!我們通過(guò)docker ps命令并沒(méi)有發(fā)現(xiàn)centos正在運(yùn)行
#原因刚梭?容器使用后臺(tái)進(jìn)行,就必須需要一個(gè)前臺(tái)進(jìn)程票唆,docker如果發(fā)現(xiàn)沒(méi)有應(yīng)用就會(huì)自動(dòng)停止朴读!
查看日志:
docker logs -f -t --tail 容器id
#自己編寫(xiě)一段shell腳本,不停的循環(huán)輸出szw
docker run -d centos /bin/sh -c "while true;echo szw;sleep 1;done"
#這時(shí)候再顯示日志
docker logs -f -t --tail 10 容器id
docker logs -f -t 容器id
#可選參數(shù) --tail number(顯示的條數(shù))走趋,不寫(xiě)上就輸出全部
查看容器進(jìn)程中的進(jìn)程id:
# 命令 docker top 容器id
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker top ff3d87da3618
UID PID PPID C STIME
root 9328 9311 0 14:12
查看鏡像的元數(shù)據(jù):
就是查看詳細(xì)的信息衅金。
#命令
docker inspect 容器id
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker inspect ff3d87da3618
[
{
"Id": "ff3d87da3618e8ded5980619aa2664b40e360e2a0063668144eba51afa6c35a8",
"Created": "2020-05-15T06:12:05.676704236Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 9328,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-05-15T06:12:06.064708089Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:470671670cac686c7cf0081e0b37da2e9f4f768ddc5f6a26102ccd1c6954c1ee",
"ResolvConfPath": "/var/lib/docker/containers/ff3d87da3618e8ded5980619aa2664b40e360e2a0063668144eba51afa6c35a8/resolv.conf",
進(jìn)入當(dāng)前正在運(yùn)行的容器:
#我們通常容器都是在后臺(tái)方式運(yùn)行的,需要進(jìn)入容器簿煌,修改一些配置
#命令
docker exec -it 容器id bashShell
#測(cè)試
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ff3d87da3618 centos "/bin/bash" 29 minutes ago Up 29 minutes zen_keller
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker exec -it ff3d87da3618 /bin/bash
[root@ff3d87da3618 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@ff3d87da3618 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 06:12 pts/0 00:00:00 /bin/bash
root 14 0 0 06:42 pts/1 00:00:00 /bin/bash
root 28 14 0 06:42 pts/1 00:00:00 ps -ef
#方式二氮唯,這種方式會(huì)執(zhí)行當(dāng)前容器正在執(zhí)行的代碼
docker attch 容器id
sudo docker run -p 3306:3306 --name newsql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-d mysql:latest
以上兩種方式的區(qū)別:
方式1:是新開(kāi)啟一個(gè)終端
方式2:是進(jìn)入容器中正在執(zhí)行的終端,不會(huì)啟動(dòng)新的進(jìn)程
從容器內(nèi)拷貝文件到自己主機(jī)上
docker cp
#我們?cè)赿ocker centos下的/home目錄下創(chuàng)建一個(gè)文件szw.java
[root@b58fcf3b7532 home]# touch szw.java
[root@b58fcf3b7532 home]# ls
szw.java
#退出docker中的centos
exit
#進(jìn)行拷貝
docker cp b58fcf3b7532:/home/szw.java /home
#拷貝是一個(gè)手動(dòng)過(guò)程,未來(lái)我們使用-V卷的技術(shù),可以實(shí)
小結(jié)
所有的命令總結(jié)圖:
練習(xí)
docker安裝nginx
#1姨伟、在docker hub中搜索ngix信息惩琉,可以看到詳細(xì)信息和幫助文檔
#2、下載鏡像
#3夺荒、啟動(dòng)鏡像
#意思就是新建一個(gè)Nginx容器瞒渠,命名為Nginx01,暴露服務(wù)器端口為3000映射內(nèi)部的80端口,-d后臺(tái)運(yùn)行
docker run -d --name nginx01 -p 3000:80 nginx
#4技扼、本機(jī)自測(cè)
curl localhost:3000
##5伍玖、再利用公網(wǎng)ip進(jìn)行訪問(wèn)
端口暴露詳解圖:
思考問(wèn)題:我們每次改動(dòng) nginx配置文件,都需要進(jìn)入容器內(nèi)部?十分的麻煩,我要是可以在容器外部提供一個(gè)映射路徑,達(dá)到在容器修改文件名,容器內(nèi)部就可以自動(dòng)修改?數(shù)據(jù)卷!
在docker中裝tomcat
#官方的使用
docker run -it --rm tomcat:9.0
#我們之前的啟動(dòng)都是后臺(tái),停止了容器之后,容器還是可以查到 docker run-it-rm,一般用來(lái)測(cè)試,用完及刪除
#但是我們不建議這樣使用!
docker pull tomcat:9.0
#啟動(dòng)運(yùn)行
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker run -d -p 3310:8080 --name tomcat01 tomcat:9.0
#測(cè)試發(fā)現(xiàn)剿吻,404
#發(fā)現(xiàn)問(wèn)題:1窍箍、linux命令少了,ll都沒(méi)有
#2、沒(méi)有webapps目錄下沒(méi)有文件
原因:阿里云鏡像的問(wèn)題仔燕,默認(rèn)是最小的鏡像,將一些不必要的全部都剔除掉
那么怎么解決魔招?
#首先進(jìn)入當(dāng)前運(yùn)行的這個(gè)mcat容器中
docker exec -it tomcat01 /bin/bash
我們可以發(fā)現(xiàn)晰搀,可以訪問(wèn)到了docker中的tomcat。
練習(xí):安裝ES
docker可視化工具
- portainer(先用這個(gè))
docker run -d -p 3310:9000 \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
--name prtainer-test \
docker.io/portainer/portainer
安裝好之后办斑,我們可以通過(guò)ip地址加上端口號(hào)訪問(wèn)我們的可視化工具外恕。
第一步看到的就是一個(gè)設(shè)置管理員密碼的操作,設(shè)置好以后乡翅,點(diǎn)擊local本地連接鳞疲。
就會(huì)顯示這個(gè)界面,再繼續(xù)點(diǎn)擊local蠕蚜,我們就可以了解我們本機(jī)關(guān)于docker的詳細(xì)信息了尚洽。
Docker鏡像詳解
鏡像是什么?
鏡像是一種輕量級(jí)靶累、可執(zhí)行的獨(dú)立軟件包,用來(lái)打包軟件運(yùn)行環(huán)境和基于運(yùn)行環(huán)境開(kāi)發(fā)的軟件,它包含運(yùn)行某個(gè)軟件
所需的所有內(nèi)容,包括代碼腺毫、運(yùn)行町庫(kù)、環(huán)境變量和配置文件挣柬。
所有的應(yīng)用,直接打包 docker鏡像,就可以直接跑起來(lái)!
Docker鏡像加載原理
UnionFS(聯(lián)合文件系統(tǒng))
UnionFS (聯(lián)合文件系統(tǒng)) : Union文件系統(tǒng)( UnionFS )是一種分層潮酒、 輕量級(jí)并且高性能的文件系統(tǒng),它支持對(duì)文件系
統(tǒng)的修改作為-次提交來(lái)一層層的疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下。
Union 文件系統(tǒng)是Docker鏡像的基礎(chǔ)邪蛔。鏡像可以通過(guò)分層來(lái)進(jìn)行繼承,基紆基礎(chǔ)鏡像(沒(méi)有父鏡像),可以制作各種具
體的應(yīng)用鏡像急黎。
特性: 一次同時(shí)加載多個(gè)文件系統(tǒng),但從外面看起來(lái),只能看到一個(gè)文件系統(tǒng),聯(lián)合加載會(huì)把各層文件系統(tǒng)疊加起來(lái),這
樣最終的文件系統(tǒng)會(huì)包含所有底層的文件和目錄。
注意:我們pull下載鏡像的時(shí)候侧到,看到的一層一層就是這個(gè)勃教!
言簡(jiǎn)意賅的就是說(shuō):我如果下載一個(gè)文件,之前存在的東西床牧,我不進(jìn)行下載了荣回,相同的東西作為底層,我只去下載上一層的東西就可了戈咳!
Docker鏡像加速原理
docker實(shí)際上由一層一層的文件系統(tǒng)組成心软,這種層級(jí)系統(tǒng)就是我們上面說(shuō)的UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引|導(dǎo)加載kernel, Linux剛啟動(dòng)時(shí)會(huì)加載bootfs文件系統(tǒng),在Docker鏡像的最底層是bootfs著蛙。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的 ,包含boot加載器和內(nèi)核删铃。當(dāng)bootfs加載完成之后整個(gè)內(nèi)核就都在內(nèi)存中了,此時(shí)內(nèi)存的使用權(quán)已由bootfs轉(zhuǎn)交給內(nèi)核,此時(shí)系統(tǒng)也會(huì)卸載bootfs.(就是我們?cè)陂_(kāi)機(jī)時(shí)候看到的引導(dǎo)!docker中就是省略了這個(gè)部分踏堡!)
rootfs (root file system) , 在bootfs之上猎唁。包含的就是典型Linux 系統(tǒng)中的/dev, /proc, /bin, /etc等標(biāo)準(zhǔn)目錄和文件。rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如Ubuntu , Centos等等顷蟆。(這個(gè)部分就是docker中需要下載的東西诫隅,他使用的bootfs實(shí)際上是本機(jī)的腐魂,這就導(dǎo)致了我們啟動(dòng)docker的時(shí)候基本都是秒級(jí)打開(kāi)的!)
有了以上兩個(gè)概念逐纬,我們就只到我們的docker下載的鏡像這么谢滓佟!并且打開(kāi)快豁生!
對(duì)于一個(gè)精簡(jiǎn)的0S ,布rootfs可以很小,只需要包含最基本的命令,工具和程序庫(kù)就可以了,因?yàn)榈讓又苯佑肏ost的kernel ,自己只需要提供rootfs就可以了兔毒。由此可見(jiàn)對(duì)于不同的linux發(fā)行版, bootfs基本是一致的, rootfs會(huì)有差別,因此不同的發(fā)行版可以公用bootfs。
分層理解
我們平常pull鏡像的時(shí)候甸箱,可以發(fā)現(xiàn)下載進(jìn)行都是一層一層的育叁。
就比如我們上面下載mysql的時(shí)候:
#我們還可以指定下載版本,mysql5.7
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
5b54d594fba7: Already exists #和以前共用的版本就不用下載了(聯(lián)合文件)
07e7d6a8a868: Already exists
abd946892310: Already exists
dd8f4d07efa5: Already exists
076d396a6205: Already exists
cf6b2b93048f: Already exists
530904b4a8b7: Already exists
a37958cbebcf: Pull complete
04960017f638: Pull complete
e1285def0d2a: Pull complete
670cb3a9678e: Pull complete
我們就可以看到他是一個(gè)一個(gè)文件下載的芍殖!也就一層一層的進(jìn)行下載豪嗽!如果本機(jī)內(nèi)之前存才的!就不進(jìn)行下載了豌骏。
特點(diǎn)
Docker鏡像都是只讀的昵骤,當(dāng)容器啟動(dòng)時(shí),一個(gè)新的可寫(xiě)層被加載到鏡像的頂部肯适!
這一層就是我們通常說(shuō)的容器層变秦。
當(dāng)我們?cè)诎炎约旱倪@個(gè)打包成一個(gè)鏡像的時(shí)候,別人操作的時(shí)候框舔,你的鏡像就又會(huì)變成了鏡像層 了蹦玫!
那么怎么發(fā)布我們自己的鏡像呢?
Commit鏡像
#我們都知道刘绣,我們?cè)趐ull官方下的tomcat的webapps下沒(méi)有文件的樱溉!
#我們每次下載后都需要給webapps下都需要進(jìn)行復(fù)制webapps.list
#非常麻煩!那么我們是不是可以根據(jù)自己的容器配置一個(gè)進(jìn)行呢纬凤?就用到了以下的命令福贞。
docker commit 提交容器稱為一個(gè)新的副本
#命令和git原理
docker commit -m="描述的信息" -a="作者" 容器id 目標(biāo)進(jìn)行名:[Tag]
實(shí)戰(zhàn)測(cè)試
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker commit -m="szwTomcat" -a="szw" 29f9b0ebc838 szwtomcat:1.0
sha256:84a932e22a55ef6a2a15b75d1360ded2303c9552db85c7bc91e8a081e6e8f772
注意:轉(zhuǎn)化為的鏡像名不能含有大寫(xiě)!
我們可以看到szwtomcat的大小比之前的tomcat大小少停士,這就是因?yàn)槲覀冃陆ǖ溺R像包含了之前鏡像和容器層的原因挖帘!所以大小變大了!
容器數(shù)據(jù)卷
什么是容器數(shù)據(jù)卷恋技?
docker理念回顧
如果數(shù)據(jù)都在容器中拇舀,那么如果我們刪除容器,數(shù)據(jù)就會(huì)丟失蜻底!需求:數(shù)據(jù)可持續(xù)化骄崩!
容器之間可以有一個(gè)數(shù)據(jù)共享技術(shù)!Docker容器產(chǎn)生數(shù)據(jù),同步到本地要拂!
這就是卷技術(shù)抠璃!目錄的掛載!
總結(jié)一句話:容器的持久化和同步操作脱惰!容器間可以進(jìn)行數(shù)據(jù)共享鸡典!
使用容器數(shù)據(jù)卷
方式1:直接使用名來(lái)來(lái)掛載
docker run -it -v 主機(jī)目錄:容器內(nèi)目錄
#測(cè)試
[root@iZ2zeeqh1fctjw2bhzgjnaZ home]# docker run -it -v /home/test:/home centos /bin/bash
#使用docker inspect查看信息
[root@iZ2zeeqh1fctjw2bhzgjnaZ home]# docker inspect 7de2961f9101
詳細(xì)信息截圖:(我們可以發(fā)現(xiàn)兩者進(jìn)行了掛載)
#我們?cè)龠M(jìn)行測(cè)試一下是不是真正綁定了
#1、還可以再進(jìn)行一個(gè)測(cè)試枪芒,先停止容器運(yùn)行
#2、在服務(wù)器上修改同步的文件
#3谁尸、運(yùn)行容器舅踪,查看綁定的目錄
我們發(fā)現(xiàn),文件依然進(jìn)行了同步良蛮!
好處抽碌!我們以后修改只需要在本地修改就可以了,容器內(nèi)會(huì)自己進(jìn)行同步决瞳!
實(shí)戰(zhàn)測(cè)試mysql
思考:mysql的數(shù)據(jù)持久化問(wèn)題货徙!
#獲取鏡像
docker pull mysql:5.7
#先參照docker hub中的幫助
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#參數(shù)詳細(xì)
-d 后臺(tái)運(yùn)行
-p端口映射
-v卷掛載
-e環(huán)境配置
--name 容器名字
docker run -d -p 3310:3306 -v /home/mysq/conf:/etc.mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 --name mysql01 mysql:5.7
#我們可以通過(guò)docker ps發(fā)現(xiàn)這個(gè)容器正在運(yùn)行
#外部測(cè)試:我們可以用可視化工具去連接服務(wù)器的端口,輸入面進(jìn)行測(cè)試皮胡,測(cè)試成功則代表了設(shè)置成功痴颊!
#下圖,配置文件放在了mysq路徑下屡贺。蠢棱。。甩栈。
我們外部測(cè)試使用Navicat進(jìn)行測(cè)試連接:
#我們?cè)谶@個(gè)Navicat中新創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)test泻仙,然后去服務(wù)器綁定容器的位置去查看數(shù)據(jù)庫(kù)test。
我們可以根據(jù)下圖發(fā)現(xiàn)量没!該數(shù)據(jù)庫(kù)存在這個(gè)data文件中
#我們?cè)龠M(jìn)行測(cè)試玉转!將容器刪除,看看掛載在本地的數(shù)據(jù)卷還會(huì)不會(huì)存在殴蹄?
具名和匿名掛載
#匿名掛載
#就是在掛載的時(shí)候究抓,只寫(xiě)了容器內(nèi)的路徑,并沒(méi)有寫(xiě)容器外的路徑袭灯!
docker run -d -P --name nginx01 -v /etc/nginx nginx
#用下面這個(gè)鏡像查看本地的卷
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker volume ls
DRIVER VOLUME NAME
local 5a5341c46b2ef49d9e496c7017beff66c86d6f6f3f0e2594143a8b9a18f9f6c9
local 7e147bcd894d89adce362efa62bc96f9522f3c47a1675e1b4d875ab85e1735d4
local 10cff4d870ab1c1062dc8cfb86b982d41a326f47453851ac0e664c48b638a228
local 063c2e58b4011356e35ad30961c7aac5f997c37d3692c2d4b22c5ffc26525b6c
local 158b76b3fc9cd28e759c6c8b0040c75316b16be424b5ce0b2288a532c556eacb
local b5b9277a857841d04079d967bd6ba25dda5ed4550ac349e506587d6bf8634918
local ba9b9e208e1b5e6c5470b45f2ba823b4388b0ef5bbe19f403ce73c13fca3690c
#上面的這些數(shù)據(jù)是真實(shí)存在的路徑漩蟆,這種就是屬于匿名掛載
#那么對(duì)應(yīng)的具名掛載是什么呢?就是加上了名字而已妓蛮!
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker run -d -P --name nginx02 -v juming:/etc/nginx nginx
ccabd3cf2414de60516acbe7d668cd67a3f839c74bb8e65d7f21d040cbcac312
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker volume ls
DRIVER VOLUME NAME
local 5a5341c46b2ef49d9e496c7017beff66c86d6f6f3f0e2594143a8b9a18f9f6c9
local 7e147bcd894d89adce362efa62bc96f9522f3c47a1675e1b4d875ab85e1735d4
local 10cff4d870ab1c1062dc8cfb86b982d41a326f47453851ac0e664c48b638a228
local 063c2e58b4011356e35ad30961c7aac5f997c37d3692c2d4b22c5ffc26525b6c
local 158b76b3fc9cd28e759c6c8b0040c75316b16be424b5ce0b2288a532c556eacb
local b5b9277a857841d04079d967bd6ba25dda5ed4550ac349e506587d6bf8634918
local ba9b9e208e1b5e6c5470b45f2ba823b4388b0ef5bbe19f403ce73c13fca3690c
local juming
#從上面的信息我們可以看到怠李,多了個(gè)juming的卷,這就是具名掛載
#我們還可以再用以下命令進(jìn)行查看這個(gè)卷的詳細(xì)信息
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker volume inspect juming
[
{
"CreatedAt": "2020-05-16T23:23:30+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming/_data",
"Name": "juming",
"Options": null,
"Scope": "local"
}
]
# 多有的docker容器內(nèi)的卷,沒(méi)有指定外部的路徑捺癞,就會(huì)存在這個(gè)路徑下/var/lib/docker/volumes/
#我們進(jìn)入到這個(gè)路徑下
可以發(fā)現(xiàn)夷蚊,這里面就是存放著,我們?cè)谌萜鲀?nèi)掛載的數(shù)據(jù)髓介!
#大多數(shù)情況下惕鼓,我們都使用的是具名掛載
#那么怎么區(qū)分匿名掛載還是具名掛載?
-v 容器內(nèi)路徑 #匿名掛載
-v 卷名:容器內(nèi)路徑 #具名掛載
-v/宿主機(jī)路徑:容器內(nèi)路徑 #指定路徑掛載
拓展:
docker run -d -P --name nginx01 -v /etc/nginx:ro nginx
docker run -d -P --name nginx01 -v /etc/nginx:rw nginx
#我們發(fā)現(xiàn)上面兩個(gè)具名掛載的命令唐础,在目錄下有一個(gè):ro:rw
#那么這個(gè)ro和rw是什么意思呢箱歧?
:ro readonly #只讀
:rw readWrite #可讀可寫(xiě)
#一旦設(shè)置了只讀,我們?cè)谌萜髦芯椭荒苤蛔x了
Dockerfile
DockerFile介紹
dockerfile是用來(lái)構(gòu)建docker鏡像的文件一膨,命令參數(shù)腳本呀邢!
構(gòu)建步驟:
1、編寫(xiě)一個(gè)dockerfile文件
2豹绪、docker build構(gòu)建成一個(gè)鏡像
3价淌、docker run 運(yùn)行鏡像
4、docker push 發(fā)布鏡像(發(fā)布到docker hub上瞒津、阿里云遠(yuǎn)程鏡像)
查看一下官方是怎么做的:
在docker hub上搜索centos蝉衣,然后點(diǎn)擊版本,會(huì)跳轉(zhuǎn)到git hub上巷蚪,我們就可以發(fā)現(xiàn)了這個(gè)centos的docker file文件病毡。
DockerFile的構(gòu)建過(guò)程
基礎(chǔ)知識(shí)
1、每個(gè)保留關(guān)鍵字(指令)都是必須是大寫(xiě)字母
2屁柏、執(zhí)行從上到下順序執(zhí)行
3剪验、#表示注釋
4、每一個(gè)指令都會(huì)創(chuàng)建一個(gè)新的鏡像層前联,并提交功戚!
dockerFile是面向開(kāi)發(fā)的!我們以后要發(fā)布項(xiàng)目似嗤,做成鏡像啸臀,就需要?jiǎng)e寫(xiě)dockerFile文件,這個(gè)文件不難烁落!
Docker鏡像逐漸成為了一個(gè)企業(yè)交付的標(biāo)準(zhǔn)乘粒,必須要掌握!
步驟:開(kāi)發(fā)伤塌,部署灯萍,運(yùn)維。每聪。旦棉。缺一不可齿风!
DockerFile:構(gòu)建文件,定義了一切的步驟绑洛,源代碼
DockerImages:通過(guò)DockerFile構(gòu)建生成的鏡像救斑,最終發(fā)布和運(yùn)行的產(chǎn)品!
Docker容器:容器就是鏡像運(yùn)行起來(lái)提供服務(wù)器真屯!
DockerFile指令
From #基礎(chǔ)鏡像脸候,一切從這里構(gòu)建
MAINTAINER #鏡像是誰(shuí)寫(xiě)的,姓名+郵箱
run #鏡像構(gòu)建的時(shí)候需要運(yùn)行的命令
ADD #步驟:tomcat鏡像,這個(gè)tomcat壓縮包绑蔫!添加內(nèi)容
WORKDIR #鏡像的工作目錄
VOLUME #掛載的目錄
EXPOSE #保留端口配置
CMD #指定這個(gè)容器啟動(dòng)的時(shí)候需要運(yùn)行的命令运沦,只有最后一個(gè)會(huì)生效,可被替代
ENTRYPOINT #指定這個(gè)容器啟動(dòng)的時(shí)候需要運(yùn)行的命令配深,可以追加命令
ONBUILD #當(dāng)構(gòu)建一個(gè)被繼承DOCKERFILE這個(gè)時(shí)候就會(huì)運(yùn)行ONBUILD的指令携添。觸發(fā)指令
COPY #類似ADD,將我們文件拷貝到鏡像中
ENV #構(gòu)建的時(shí)候設(shè)置環(huán)境變量
centos實(shí)戰(zhàn)測(cè)試
DockerHub中大部分的centos鏡像都是從 centos-7-x86_64-docker.tar.xz過(guò)來(lái)的凉馆,也就是說(shuō)這是一個(gè)最基層的鏡像!
創(chuàng)建一個(gè)自己的contos鏡像
1亡资、編寫(xiě)自己的配置文件
FROM centos
MAINTAINER shaozhaowei<1277524222@qq.com>
ENV MYPATH /user/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD "--------"
CMD /bin/bash
2澜共、通過(guò)這個(gè)鏡像構(gòu)建鏡像
#注意結(jié)尾處有一個(gè)點(diǎn)
docker build -f mydockerfile-centos -t mycentos:0.1 .
3、測(cè)試運(yùn)行
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker run -it mycentos:0.1
[root@9b924b5f6fc5 local]# pwd
/user/local
#這里可以發(fā)現(xiàn)我們直接進(jìn)入了我們?cè)谂渲梦募芯帉?xiě)的工作目錄
[root@9b924b5f6fc5 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.4 netmask 255.255.0.0 broadcast 172.18.255.255
ether 02:42:ac:12:00:04 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@9b924b5f6fc5 local]# vim szw.java
[root@9b924b5f6fc5 local]# ls
szw.java
#以上是測(cè)試的兩個(gè)我們自己配置的命令锥腻,全部成功嗦董!
#我們還可以根據(jù)以下命令查看當(dāng)前的docker鏡像是怎么做出來(lái)的
#我們可以根據(jù)這個(gè)歷史查看他是怎么做的
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker history 5559295ad3fc
IMAGE CREATED CREATED BY SIZE COMMENT
5559295ad3fc 6 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
46c14122fbc3 6 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "\"--… 0B
5c9e8d094bc9 6 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
4607fb979c7b 6 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
0a13147a565f 6 minutes ago /bin/sh -c yum -y install net-tools 24.1MB
72f1c108662c 6 minutes ago /bin/sh -c yum -y install vim 59.8MB
3e21b077a0b9 7 minutes ago /bin/sh -c #(nop) WORKDIR /user/local 0B
230e9f4efd9c 7 minutes ago /bin/sh -c #(nop) ENV MYPATH=/user/local 0B
0c5002514cc7 7 minutes ago /bin/sh -c #(nop) MAINTAINER shaozhaowei<12… 0B
470671670cac 4 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 4 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 4 months ago /bin/sh -c #(nop) ADD file:aa54047c80ba30064… 237MB
CMD和ENTRYPOINT區(qū)別
CMD #指定這個(gè)容器啟動(dòng)的時(shí)候需要運(yùn)行的命令,只有最后一個(gè)會(huì)生效瘦黑,可被替代
ENTRYPOINT #指定這個(gè)容器啟動(dòng)的時(shí)候需要運(yùn)行的命令京革,可以追加命令
測(cè)試cmd命令
#編寫(xiě)dockerFile
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# vim docker-cmd-test
FROM centos
CMD ["LS","-a"]
#編寫(xiě)完之后,使用命令進(jìn)行構(gòu)建
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker build -f docker-cmd-test -t cmdtest .
#中間省略
Successfully built 56e5493262cd
Successfully tagged cmdtest:latest
#我們可以發(fā)現(xiàn)啟動(dòng)成功
運(yùn)行上面這個(gè)鏡像幸斥,就會(huì)列出所有所有的目錄匹摇。
#我們?cè)俅芜\(yùn)行這個(gè)鏡像,追加一個(gè)命令 -l
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker run 56e5493262cd -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled
#我們這里可以發(fā)現(xiàn)甲葬,報(bào)錯(cuò)了廊勃!
#為什么呢?
#CMD的情況下 -l 替換了CMD的["ls","-a"]命令经窖,而-l根本不是命令坡垫,所以報(bào)錯(cuò)
我們繼續(xù)測(cè)試ENTRYPOINT命令,用這個(gè)進(jìn)行構(gòu)建dockerFile
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# vim docker-entrypoint-test
FORM centos
ENTRYPOINT ["ls","-a"]
#使用配置文件進(jìn)行構(gòu)建
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker build -f docker-entrypoint-test -t entrycentos .
#進(jìn)行運(yùn)行
tomcat實(shí)戰(zhàn)測(cè)試
1画侣、準(zhǔn)備鏡像文件tomcat壓縮包冰悠,jdk壓縮包,放在同一個(gè)目錄下
2配乱、編寫(xiě)Dockerfile
FROM centos
MAINTAINER shaozhaowei<1277524222@qq.com>
COPY readme.txt /usr/local/readme.txt
Add jdk-8u201-linux-x64.tar.gz /usr/local/
Add apache-tomcat-9.0.16.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_201
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.16
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.16
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.16/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.16/bin/logs/catalina.out
3溉卓、構(gòu)建這個(gè)鏡像
docker build -t diytomcat .
4皮迟、構(gòu)建容器
docker run -d -p 3310:8080 --name diytomcat -v /root/testAll/test:/usr/local/apache-tomcat-9.0.16/webapps/test -v /root/testAll/logs/:/usr/local/apache-tomcat-9.0.16/webapps/logs diytomcat
5、運(yùn)行進(jìn)入自己的容器
[root@iZ2zeeqh1fctjw2bhzgjnaZ testAll]# docker exec -it 8df6726000b813bcf775 /bin/bash
[root@8df6726000b8 local]# ls
aegis bin games jdk1.8.0_201 lib64 readme.txt share
apache-tomcat-9.0.16 etc include lib libexec sbin src
#我們可以發(fā)現(xiàn)已經(jīng)把復(fù)制的兩個(gè)jdk和tomcat解壓進(jìn)了容器中
6的诵、訪問(wèn)我們服務(wù)器ip地址+端口號(hào)万栅,可以看到tomcat主頁(yè)就代表成功了!
7西疤、如果想嘗試頁(yè)面發(fā)布到服務(wù)器蔼两,要先編寫(xiě)web.xml,然后再在webapps/test/下漩仙,訪問(wèn)對(duì)應(yīng)的頁(yè)面踊兜。
發(fā)布自己的鏡像
DockerHub
1、在官網(wǎng)上進(jìn)行注冊(cè)賬號(hào)
2芭碍、確定這個(gè)賬號(hào)可以登錄
3徒役、在我們服務(wù)器上提交自己的鏡像
#查看登錄命令的幫助
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
這里就算登錄成功了!
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker push diytomcat
The push refers to repository [docker.io/library/diytomcat]
2d7c03c9871a: Preparing
0fcab5fa81bf: Preparing
1dd967f434ae: Preparing
ce3680ddfbcf: Preparing
0683de282177: Preparing
denied: requested access to the resource is denied
#這里提示push失敗
#push鏡像的的問(wèn)題窖壕?
#解決忧勿,增加一個(gè)tag
docker tag 4f4184981337 shaozhaowei/tomcat:1.1
#注意,標(biāo)簽前面的那個(gè)shaozhaowei必須是你需要push的賬戶名瞻讽,就是作者名
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker push shaozhaowei/tomcat:1.1
The push refers to repository [docker.io/shaozhaowei/tomcat]
2d7c03c9871a: Pushing 31.31MB/59.78MB
0fcab5fa81bf: Pushed
1dd967f434ae: Pushing 11.99MB/396.7MB
ce3680ddfbcf: Pushed
0683de282177: Pushing 57.52MB/237.1MB
^C
#這樣就顯示上傳了鸳吸,需要等待!這個(gè)就是按照鏡像的層級(jí)上傳的
發(fā)布到阿里云鏡像中
1速勇、登錄阿里云
2晌砾、找到容器鏡像服務(wù)
Docker網(wǎng)絡(luò)
理解Docker0
測(cè)試
ip addr
三種網(wǎng)絡(luò)代表三種網(wǎng)絡(luò):
#問(wèn)題:docker是怎樣處理網(wǎng)絡(luò)訪問(wèn)的?
#我們?cè)赿ocker的容器內(nèi)部查看ip养匈,發(fā)現(xiàn)容器啟動(dòng)的時(shí)候會(huì)有一個(gè)eth0@if99
root@dff7be9666bc:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
98: eth0@if99: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
#我們測(cè)試一下服務(wù)器內(nèi)部是否能ping
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.093 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.079 ms
64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.074 ms
#我們發(fā)現(xiàn)linux可以ping通容器內(nèi)的ip
原理
1、我們每安裝一個(gè)docker容器都伪,docker就會(huì)給docker容器分配一個(gè)ip呕乎,只要我們安裝了docker,就會(huì)有一個(gè)網(wǎng)卡docker0陨晶。這就是橋接楣嘁,使用的技術(shù)是evth-pair技術(shù)!
我們?cè)俅蝡ing一下linux中的網(wǎng)絡(luò)
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# ip addr
#中間的1-5省略
#我們可以和剛才容器內(nèi)的ip進(jìn)行對(duì)比珍逸,發(fā)現(xiàn)了98,99這一對(duì)ip驚人的相似逐虚!
99: veth98b8be1@if98: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 6e:f2:ee:28:10:86 brd ff:ff:ff:ff:ff:ff link-netnsid 0
2、我們?cè)俅芜M(jìn)行測(cè)試谆膳!
#繼續(xù)啟動(dòng)一個(gè)tomcat
我們?cè)谌萜鲀?nèi)進(jìn)行查看ip
#我們發(fā)現(xiàn)容器帶來(lái)的網(wǎng)卡叭爱,都是一對(duì)一對(duì)存在的!
#evth-pair就是一對(duì)的虛擬設(shè)備接口,他們都是成對(duì)出現(xiàn)的,一段連著協(xié)段彼此相連
#正因?yàn)橛羞@個(gè)特性,evth-pair充當(dāng)一個(gè)橋粱漱病,連接各種虛擬網(wǎng)絡(luò)設(shè)備
#openStac买雾,Docker容器之間的連接把曼,ovs的鏈接,都是使用了evth-pair技術(shù)
3漓穿、我們測(cè)試兩個(gè)tomcat是否能ping通
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker exec -it tomcat02 ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.118 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.080 ms
64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.077 ms
#測(cè)試我們發(fā)現(xiàn)兩個(gè)容器之間也是可以ping通的
結(jié)論:tomcat01和tomcat02是公用的一個(gè)路由器嗤军,docker0.
所有的容器不指定網(wǎng)絡(luò)的情況下,都是 docker0路由的, docker會(huì)給我們的容器分配一個(gè)默認(rèn)的可用IP。
小結(jié)
核心就是:利用了linux中的虛擬化網(wǎng)絡(luò)技術(shù)晃危。在容器中和docker0中分別創(chuàng)建了一個(gè)虛擬網(wǎng)卡叙赚,通過(guò)veth進(jìn)行連接。
Docker中的所有的網(wǎng)絡(luò)接口都是虛擬的僚饭。虛擬的轉(zhuǎn)發(fā)效率特別快U鸲!(內(nèi)網(wǎng)傳遞)。
只要?jiǎng)h除容鳍鸵,對(duì)應(yīng)的網(wǎng)橋就會(huì)消失苇瓣。
--link
思考一個(gè)場(chǎng)景:我們編寫(xiě)了一個(gè)微服務(wù),datebase url = ip偿乖,項(xiàng)目不重啟击罪,數(shù)據(jù)庫(kù)ip換掉了,我們希望可以處理這個(gè)問(wèn)題贪薪,可以利用名字來(lái)訪問(wèn)容器媳禁。
#上面的場(chǎng)景就是歸結(jié)于一個(gè)問(wèn)題,怎么使用服務(wù)名代替ip地址訪問(wèn)容器古掏?
#先做一個(gè)測(cè)試
#我們后面不跟ip地址损话,直接跟容器名侦啸。
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known
#使用link
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker run -d -P --name tomcat03 --link tomcat02 tomcat:9.0
58aae10fb4ecb6324d50139b27800f6cc1a58af0340c21477cd735fded967a98
#使用--link進(jìn)行把tomcat03和tomcat02的網(wǎng)絡(luò)互連
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.18.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.18.0.3): icmp_seq=1 ttl=64 time=0.129 ms
64 bytes from tomcat02 (172.18.0.3): icmp_seq=2 ttl=64 time=0.080 ms
64 bytes from tomcat02 (172.18.0.3): icmp_seq=3 ttl=64 time=0.084 ms
^C
--- tomcat02 ping statistics ---
#我們可以通過(guò)以上發(fā)現(xiàn)tomcat03和tomcat02進(jìn)行了一個(gè)連接
#但是經(jīng)過(guò)測(cè)試槽唾,發(fā)現(xiàn)tomcat02是無(wú)法與tomcat03進(jìn)行ping通的!
探究
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker network ls
NETWORK ID NAME DRIVER SCOPE
095914b1b0c6 bridge bridge local
c5b2a21d16c0 host host local
755347b3adf4 none null local
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker network inspect 095914b1b0c6
#摘選出主要信息
"Containers": {
"58aae10fb4ecb6324d50139b27800f6cc1a58af0340c21477cd735fded967a98": {
"Name": "tomcat03",
"EndpointID": "b9fe7d0503be687a08bfee2c7d4b53dc72b4db8c18f0c2f546a277070a539b3d",
"MacAddress": "02:42:ac:12:00:04",
"IPv4Address": "172.18.0.4/16",
"IPv6Address": ""
},
"def92693ca704227cf7d8c5602606d14e614a1af7c2f877b2429d65a0dd5a89e": {
"Name": "tomcat02",
"EndpointID": "ba161992c42eb4060705330baee39110456d31e473fd866ac2a7fb9603eee085",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
},
"dff7be9666bcb7b5567b1e03127ac72efff9bcd4c24933ad30072f807ab029bf": {
"Name": "tomcat01",
"EndpointID": "5eb39f854209ee16a9813dad5964ab04950603c4f24c933641d5c39361137289",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.3 tomcat02 def92693ca70
172.18.0.4 58aae10fb4ec
#我們查看tomcat03中的本地網(wǎng)絡(luò)配置光涂,發(fā)現(xiàn)綁定了tomcat02庞萍,這就是為什么我們通過(guò)容器名就可以ping到ip地址
但是不推薦使用!
自定義網(wǎng)絡(luò)
使用命令查看docker所有的網(wǎng)絡(luò)模式
網(wǎng)絡(luò)模式
bridge:橋接 docker(默認(rèn))
none:不配置網(wǎng)絡(luò)
host:和宿主機(jī)共用一個(gè)網(wǎng)絡(luò)
container:容器網(wǎng)絡(luò)連同(用的少忘闻,局限性很大)