這篇文章主要介紹“如何快速入門(mén)Docker”,在日常操作中,相信很多人在如何快速入門(mén)Docker問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何快速入門(mén)Docker”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
創(chuàng)新互聯(lián)建站-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比東遼網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式東遼網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋東遼地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
docker的特別之處:
docker是輕量級(jí)的虛擬化技術(shù),啟動(dòng)速度快(大多數(shù)docker容器只需不到1s即可完成啟動(dòng)),單臺(tái)硬件上可以同時(shí)跑成百上千個(gè)容器,使得快速擴(kuò)展,彈性伸縮變得簡(jiǎn)單。據(jù)說(shuō),在2016年,京東使用15萬(wàn)docker集群來(lái)保證618高并發(fā)場(chǎng)景下的系統(tǒng)穩(wěn)定。
docker是跨平臺(tái)的,支持windows、macos、linux,可以做到“構(gòu)建一次,到處運(yùn)行”,解決開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境不一致帶來(lái)的一系列問(wèn)題,讓開(kāi)發(fā)人員和運(yùn)維人員可以更加和諧相處。
docker是開(kāi)源的,托管于github。
docker思想
從docker的logo聯(lián)想docker核心思想
docker的logo是一個(gè)載著集裝箱的大鯨魚(yú),這絕對(duì)是對(duì)docker最形象的描述和解釋。
對(duì)比運(yùn)輸業(yè),在集裝箱出現(xiàn)之前,貨物無(wú)法用統(tǒng)一的標(biāo)準(zhǔn)方式進(jìn)行搬運(yùn),比如有些貨物易碎,需要輕拿輕放,有些則不需要。于是鐵路、公路、海洋等各種運(yùn)輸之間,需要大量的人力作為貨物中轉(zhuǎn),效率極低,而且成本很高。集裝箱出現(xiàn)之后,解決了這個(gè)難題,任何貨物貨物都可以放到這個(gè)神奇的箱子里,然后在公路、鐵路、海洋等所有運(yùn)輸場(chǎng)景下,這個(gè)箱子在運(yùn)輸過(guò)程中都是密封的,而且中間的中轉(zhuǎn)工作,都可以通過(guò)大型機(jī)械搞定,效率大大提升。
docker正式借鑒了標(biāo)準(zhǔn)集裝箱的思想,將集裝箱思想運(yùn)用到了軟件領(lǐng)域。docker為代碼提供了一個(gè)基于容器的標(biāo)準(zhǔn)化運(yùn)輸系統(tǒng),可以將任何應(yīng)用及其依賴的環(huán)境(如代碼、配置文件、jdk、tomcat等)打包成一個(gè)容器,這個(gè)容器可以在幾乎所有的操作系統(tǒng)運(yùn)行。
docker核心概念
鏡像
鏡像是docker的基石,用戶可以基于鏡像來(lái)運(yùn)行自己的容器。
鏡像的基礎(chǔ)是docker的聯(lián)合文件系統(tǒng),該文件系統(tǒng)是分層的,每個(gè)鏡像是一個(gè)層。由于每個(gè)層上面還以有其他層,也就是說(shuō),鏡像可以在其他鏡像(基礎(chǔ)鏡像)上面進(jìn)行創(chuàng)建。借用一幅圖來(lái)幫助理解。圖片來(lái)源于網(wǎng)絡(luò),侵刪。
倉(cāng)庫(kù)
倉(cāng)庫(kù)是保存用戶鏡像的地方。在docker hub上面有許多鏡像,包括最簡(jiǎn)單的hello-world,MySQL等等。當(dāng)然我們也可以有自己私有的倉(cāng)庫(kù)。
容器
容器為應(yīng)用程序提供了隔離的運(yùn)行空間。每個(gè)容器內(nèi)都包含一個(gè)獨(dú)享的完整的用戶環(huán)境,并且一個(gè)容器內(nèi)的運(yùn)行環(huán)境變動(dòng)不會(huì)影響其他容器的運(yùn)行環(huán)境,可以使應(yīng)用程序在幾乎任何地方以相同的方式運(yùn)行。
容器是基于鏡像啟動(dòng)的,容器中可以運(yùn)行一個(gè)或多個(gè)進(jìn)程。在創(chuàng)建容器進(jìn)程時(shí),指定了這個(gè)進(jìn)程所需要的namespace參數(shù),使得容器就只能「看」到當(dāng)前 namespace 所限定的資源、文件、設(shè)備、狀態(tài),或者配置。所以說(shuō),容器是一種特殊的進(jìn)程而已,容器的本質(zhì)就是進(jìn)程。
docker安裝
以centos 7為例,進(jìn)行安裝docker。
檢查系統(tǒng)內(nèi)核版本
docker運(yùn)行在 centos 7上,要求操作系統(tǒng)為 64 位,內(nèi)核版本為 3.10 及以上。
確認(rèn)本機(jī)已經(jīng)安裝了滿足要求的linux內(nèi)核。使用命令uname -r
來(lái)檢查內(nèi)核版本信息。
[root@localhost ~]# uname -r 3.10.0-957.el7.x86_64
在centos 7中安裝docker
使用命令yum install -y docker
安裝docker,“-y”表示不詢問(wèn),使用默認(rèn)配置進(jìn)行安裝。
啟動(dòng)docker服務(wù),并設(shè)置為開(kāi)機(jī)自啟動(dòng)
使用下列命令:
systemctl start docker.service systemctl enable docker.service
輸入docker version
,返回版本信息表明docker安裝成功。
[root@localhost ~]# docker version client: version: 1.13.1 api version: 1.26 package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64 go version: go1.10.3 git commit: b2f74b2/1.13.1 built: wed may 1 14:55:20 2019 os/arch: linux/amd64 server: version: 1.13.1 api version: 1.26 (minimum version 1.12) package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64 go version: go1.10.3 git commit: b2f74b2/1.13.1 built: wed may 1 14:55:20 2019 os/arch: linux/amd64 experimental: false
docker實(shí)戰(zhàn)——hello world
入門(mén)實(shí)戰(zhàn)怎么能少得了經(jīng)典的“hello world”?
拉取鏡像
其實(shí)dockerhub上已經(jīng)有了這個(gè)鏡像,名字叫“hello-world”。直接從dockerhub拉取鏡像,命令和git有些相似:docker pull hello-world
[root@localhost docker]# docker pull hello-world using default tag: latest trying to pull repository docker.io/library/hello-world ... latest: pulling from docker.io/library/hello-world 1b930d010525: pull complete digest: sha256:41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8 status: downloaded newer image for docker.io/hello-world:latest
查看鏡像
查看拉取到的docker鏡像:docker images
[root@localhost ~]# docker images repository tag image id created size docker.io/hello-world latest fce289e99eb9 5 months ago 1.84 kb
運(yùn)行鏡像
運(yùn)行鏡像:docker run hello-world
。看到打印出如下的內(nèi)容,代表運(yùn)行成功。
[root@localhost docker]# docker run hello-world hello from docker! this message shows that your installation appears to be working correctly. to generate this message, docker took the following steps: 1. the docker client contacted the docker daemon. 2. the docker daemon pulled the "hello-world" image from the docker hub. (amd64) 3. the docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. the docker daemon streamed that output to the docker client, which sent it to your terminal. to try something more ambitious, you can run an ubuntu container with: $ docker run -it ubuntu bash share images, automate workflows, and more with a free docker id: https://hub.docker.com/ for more examples and ideas, visit: https://docs.docker.com/get-started/
docker常用命令
docker images : 列出本地的鏡像
docker pull image_name:拉取鏡像。如果沒(méi)有指定具體的鏡像標(biāo)簽,會(huì)自動(dòng)拉取latest標(biāo)簽的鏡像。
docker search image_name:在docker hub上查找鏡像
docker start container:?jiǎn)?dòng)和運(yùn)行容器
docker run [options] image_name:基于鏡像創(chuàng)建并啟動(dòng)一個(gè)容器
常用選項(xiàng):
-d: 后臺(tái)運(yùn)行容器,并返回容器id;
-i: 以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用;
-t: 為容器重新分配一個(gè)偽輸入終端,通常與 -i 同時(shí)使用;
-p: 隨機(jī)端口映射,容器內(nèi)部端口隨機(jī)映射到主機(jī)的高端口
-p: 指定端口映射,格式為:主機(jī)(宿主)端口:容器端口
docker logs container:獲取容器的日志信息
docker attach container:進(jìn)入容器
exit:退出容器
docker exec container command:在運(yùn)行的容器中執(zhí)行命令
docker stop container:停止容器
docker rm container:刪除容器
docker save -o image_name.tar image_name:導(dǎo)出鏡像
docker ps:查看正在運(yùn)行的容器
docker ps -a:查看系統(tǒng)中容器列表
docker top container:查看容器內(nèi)的進(jìn)程
docker stop daemon_dave:停止守護(hù)容器
docker構(gòu)建鏡像
如何構(gòu)建鏡像?
構(gòu)建一個(gè)自己的鏡像需要兩步:
編寫(xiě)dockerfile。dockerfile 告訴docker如何制作鏡像以及每一步是怎樣的。
docker執(zhí)行dockerfile中的指令的流程是這樣的:
docker從基礎(chǔ)鏡像運(yùn)行一個(gè)容器
執(zhí)行一條指令,對(duì)容器進(jìn)行修改
提交到一個(gè)新的鏡像層
docker再基于剛才提交的鏡像運(yùn)行一個(gè)新容器
執(zhí)行dockerfile中的下一條指令,知道所有指令執(zhí)行完畢。
使用docker build命令構(gòu)建。
編寫(xiě)dockerfile
每個(gè)dockerfile的第一條命令必須是from。from指令指定一個(gè)已經(jīng)存在的鏡像,告訴docker后續(xù)的指令都是在這個(gè)基礎(chǔ)上進(jìn)行的。例如:from java:8
maintainer 指令用來(lái)標(biāo)志該鏡像所有者和聯(lián)系方式。例如:maintainer james "×××@example.com"
volume 指令用來(lái)向基于鏡像創(chuàng)建的容器添加卷。一個(gè)卷可以是存在一個(gè)或者多個(gè)容器內(nèi)的特定的目錄,這個(gè)目錄可以繞過(guò)聯(lián)合文件系統(tǒng),并提供共享數(shù)據(jù)和數(shù)據(jù)持久化的功能。
cmd 指令用來(lái)指定一個(gè)容器啟動(dòng)時(shí)要運(yùn)行的命令。
entrypoint指令與cmd指令很相似。
workdir 指令用來(lái)從鏡像創(chuàng)建一個(gè)新容器的時(shí)候,在容器內(nèi)部設(shè)置一個(gè)工作命令,entrypoint或cmd指令指定的程序會(huì)在這個(gè)目錄下執(zhí)行。
env 指令用來(lái)在在鏡像構(gòu)建過(guò)程中設(shè)置環(huán)境變量。例如:env test_path /home/test
run 指令用來(lái)在當(dāng)前鏡像中運(yùn)行指定的命令。例如:run apt-get install -y nginx
expose 指令用來(lái)告訴docker該容器內(nèi)的應(yīng)用程序?qū)⑹褂萌萜鞯闹付ǘ丝?。例如?code>expose 80
add 指令用來(lái)將構(gòu)建環(huán)境下的文件和目錄復(fù)制到鏡像中。 例如:add docker-0.0.1-snapshot.jar app.jar
copy 指令與add 類(lèi)似,不同點(diǎn)在與copy只關(guān)心在構(gòu)建上下文中復(fù)制本地文件,而不會(huì)提取和解壓。
label 指令用于為docker鏡像添加元數(shù)據(jù)。例如:label name=test description="a container is used to test"
dockerfile實(shí)例:
from java:8 maintainer james "×××@example.com" volume /tmp add docker-0.0.1-snapshot.jar app.jar entrypoint ["java","-djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
執(zhí)行docker build
執(zhí)行docker build
命令后看到“build success”表明構(gòu)建成功,可以使用docker run
命令來(lái)運(yùn)行了。
到此,關(guān)于“如何快速入門(mén)Docker”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!