此文為Docker概念篇,是自己學(xué)習(xí)Docker的小筆記。隨后會(huì)更新一篇部署篇,包含Docker部署MySQL/Tomcat/NGINX/Redis,創(chuàng)建自己的私有Docker hub,鏡像上傳私有倉(cāng)庫(kù)以及鏡像的使用。
快速理解docker
本地做好項(xiàng)目之后,在本地打一個(gè)鏡像放到遠(yuǎn)程自己的private hub上,這樣就可以在服務(wù)器上拉遠(yuǎn)程的鏡像到服務(wù)器本地,通過(guò)docker進(jìn)行創(chuàng)建一個(gè)以鏡像為依據(jù)的的容器。然后在容器中執(zhí)行項(xiàng)目啟動(dòng)的指令。在這個(gè)容器中包含了你的項(xiàng)目以及項(xiàng)目的依賴(lài)包和相關(guān)的運(yùn)行環(huán)境。比虛擬機(jī)更省資源,項(xiàng)目容錯(cuò)率也會(huì)更高。
Docker概念
Docker可以讓開(kāi)發(fā)者打包他們的應(yīng)用以及依賴(lài)包到一個(gè)輕量級(jí),可移植的容器中。然后發(fā)布到任何流行的Linux機(jī)器上。有CE(社區(qū)版)和EE(企業(yè)版),是一種容器技術(shù),解決項(xiàng)目遷移問(wèn)題;
優(yōu)點(diǎn):
容易完全沙箱機(jī)制,相互隔離
性能開(kāi)銷(xiāo)極低
Docker架構(gòu)
鏡像(image):Docker鏡像 就相當(dāng)于是一個(gè)root文件系統(tǒng)。比如官方鏡像ubuntu就包含了完整的一套u(yù)buntu16.04最小系統(tǒng)的root文件系統(tǒng)
容器(container): 鏡像和容器的關(guān)系,就像是面向兌現(xiàn)程序設(shè)計(jì)中的類(lèi)和對(duì)象一樣,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時(shí)的實(shí)體。容器可以被創(chuàng)建,啟動(dòng),停止,刪除,暫停等。
倉(cāng)庫(kù)(Registries):倉(cāng)庫(kù)可看成一個(gè)代碼控制中心,用來(lái)保存鏡像的

配置Docker鏡像加速器
默認(rèn)情況下,將來(lái)從docker hub上下載docker鏡像,太慢。一般我們都用阿里云進(jìn)行鏡像加速器,阿里云的控制臺(tái)進(jìn)行配置docker。具體的配置流程可以Google一下~
Docker命令
Docker服務(wù)相關(guān)命令:
啟動(dòng) 停止 重啟 開(kāi)啟啟動(dòng)等(Linux Docker可以通過(guò)指令在進(jìn)程中查看是否有Docker進(jìn)程運(yùn)行)
Docker鏡像相關(guān)命令:
查看鏡像:
# 列出本地主機(jī)上的鏡像
docker images
#顯示的選項(xiàng)說(shuō)明:
#REPOSITORY:表示鏡像的倉(cāng)庫(kù)源
#TAG:鏡像的標(biāo)簽
#IMAGE ID:鏡像ID
#CREATED:鏡像創(chuàng)建時(shí)間
#SIZE:鏡像大小
docker images -q 查看所有鏡像的ID
搜索鏡像(遠(yuǎn)程):
docker search redis
拉取鏡像(遠(yuǎn)程):
docker pull redis
刪除鏡像:
docker rmi [images ID] ---刪除某個(gè)id
docker rmi 'docker images -q' #刪除所有本地鏡像
Docker 容器相關(guān)命令(構(gòu)建好的鏡像實(shí)例)類(lèi)似于對(duì)一個(gè)應(yīng)用程序的操作:
docker run 命令在一個(gè)容器內(nèi)運(yùn)行一個(gè)程序
docker run ubuntu:15.10 /bin/echo "hello world"
查看容器指令
# 查看當(dāng)前運(yùn)行的容器
docker ps
# 查看所有容器,包括停止
docker ps -a
# 查看最新創(chuàng)建的容器,只列出最后創(chuàng)建的
docker ps -l
# 查看網(wǎng)絡(luò)端口
docker port [容器ID|容器名]
# 查看容器內(nèi)部的標(biāo)準(zhǔn)輸出
docker logs [容器ID|容器名]
# 查看容器內(nèi)部運(yùn)行的進(jìn)程
docker top [容器ID|容器名]
# 查看 Docker 的底層信息。它會(huì)返回一個(gè) JSON 文件記錄著 Docker 容器的配置和狀態(tài)信息
docker inspect [容器ID|容器名]
創(chuàng)建容器:
docker run -it --name=c1 centos:7 /bin/bash
#centos 鏡像名 7 是版本號(hào)
docker run -id --name=c2 centos:7
#--name 容器名字
-i #保持容器運(yùn)行,通常于-t同時(shí)使用。加入it這兩個(gè)參數(shù)之后,容器創(chuàng)建后會(huì)自動(dòng)進(jìn)入容器中,退出容器后,容器會(huì)自動(dòng)關(guān)閉。
-t #為容器重新分配一個(gè)偽輸入終端,通常與-i同時(shí)使用;
-d #以守護(hù)(后臺(tái))模式運(yùn)行容器。創(chuàng)建一個(gè)容器在后臺(tái)運(yùn)行,需要使用docker exec 進(jìn)入容器。退出后,容器不會(huì)關(guān)閉。
-it #創(chuàng)建的容器一般稱(chēng)為交互式容器,-id創(chuàng)建的為守護(hù)示容器;
--name #為創(chuàng)建的容器命名;
進(jìn)入容器:
docker exec -it c2 /bin/bash
#通過(guò)--id 方式創(chuàng)建的容器 當(dāng)你exit退出之后,容器的運(yùn)行是不會(huì)停止的
停止容器:
docker stop [容器|容器名]
啟動(dòng)容器:
docker start [容器ID|容器名]
docker restart [容器ID | 容器名]
刪除容器:
# 刪除容器,刪除容器時(shí),容器必須是停止?fàn)顟B(tài)
docker rm [容器ID|容器名]
# 刪除所有的容器
docker rm $(docker ps -aq)
查看容器信息:
docker inspect [容器名]
所有的指令中,docker容器的指令由為重要?。?! 因?yàn)槿萜鞑攀菍?shí)例
docker容器的數(shù)據(jù)卷
數(shù)據(jù)卷是什么和作用?思考為什么需要數(shù)據(jù)卷?
1,Docker容器刪除后,在容器中產(chǎn)生的數(shù)據(jù)還在嗎?不在
2,docker容器和外部機(jī)器可以直接交換文件嗎? 不能
3,容器之間想要進(jìn)行數(shù)據(jù)交互?就用到了數(shù)據(jù)卷
數(shù)據(jù)卷的概念:
宿主機(jī)中的一個(gè)目錄或文件,在react中相當(dāng)于context,當(dāng)容器和數(shù)據(jù)卷目錄綁定后,對(duì)方的修改會(huì)立即同步,一個(gè)數(shù)據(jù)卷可以被多個(gè)數(shù)據(jù)卷同事掛載,一個(gè)容器中也可以被掛載多個(gè)數(shù)據(jù)卷。
數(shù)據(jù)卷的作用:
容器數(shù)據(jù)的持久化;
外部機(jī)器和容器間接通信;
容器之間數(shù)據(jù)交換;
如何配置數(shù)據(jù)卷
創(chuàng)建啟動(dòng)容器時(shí),使用-v參數(shù)設(shè)置數(shù)據(jù)卷;
docker run ... -v [宿主機(jī)目錄(文件):容器內(nèi)目錄(文件)] ...
docker run -it -v ~/Desktop/data:/root/data_container --name=c3 centos:7 /bin/bash #適合mac電腦
參數(shù)一定要注意:目錄必須是絕對(duì)路徑;如果目錄不存在,會(huì)自動(dòng)進(jìn)行創(chuàng)建;可以?huà)燧d多個(gè)數(shù)據(jù)卷;
一個(gè)容器掛載多個(gè)數(shù)據(jù)卷:
docker run -it --name=c4 \
-v ~/Desktop/data1:/root/data1 \
-v ~/Desktop/data2:/root/data2 \
centos:7 /bin/bash
兩個(gè)容器鏈接同一個(gè)數(shù)據(jù)卷:
#創(chuàng)建連個(gè)容器
docker run -it --name:c5 -v ~/Desktop/data:/root/data centos:7
docker run -it --name:c6 -v ~/Desktop/data:/root/data centos:7
#這樣c5和c6中的data就都和宿主機(jī)的data數(shù)據(jù)卷相同。這樣就可以共享一份數(shù)據(jù)卷了
數(shù)據(jù)卷容器
如果想多容器進(jìn)行數(shù)據(jù)交換:
方案1:多個(gè)容器掛載在同一個(gè)數(shù)據(jù)卷;
方案2: 數(shù)據(jù)卷容器;
容器卷容器和宿主機(jī)直接進(jìn)行數(shù)據(jù)通信,專(zhuān)門(mén)的數(shù)據(jù)容器
#1 創(chuàng)建啟動(dòng)c3數(shù)據(jù)卷容器,使用-v參數(shù)數(shù)據(jù)卷 c3就是一個(gè)數(shù)據(jù)卷容器了 此刻的目錄是容器目錄 沒(méi)有容器卷的目錄 docker會(huì)在宿主機(jī)上自動(dòng)分配一個(gè)目錄進(jìn)行同步
docker run -it --name=c3 -v /volume centos:7 /bin/bash
#2 創(chuàng)建啟動(dòng)c1 c2 容器,使用--volumes-from參數(shù)設(shè)置數(shù)據(jù)卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c3 --volumes-from c3 centos:7 /bin/bash
問(wèn)題:這里為什么要用專(zhuān)門(mén)一個(gè)容器去存放數(shù)據(jù)呢,而不是一個(gè)個(gè)容器去配置同一個(gè)外部數(shù)據(jù)卷呢?
一般docker管理的Linux服務(wù)器上面,可以通過(guò)創(chuàng)建一個(gè)數(shù)據(jù)卷容器來(lái)專(zhuān)門(mén)保管數(shù)據(jù)和進(jìn)行數(shù)據(jù)通信,宿主機(jī)此刻的作用就是一個(gè)備份數(shù)據(jù)的作用。這樣所有的操作都變成了容器化操作,更加統(tǒng)一。