日本电影一区二区_日本va欧美va精品发布_日本黄h兄妹h动漫一区二区三区_日本欧美黄色

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

一、Docker簡(jiǎn)介

1、背景

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

物理機(jī)時(shí)代

一個(gè)物理機(jī)上安裝操作系統(tǒng),然后直接運(yùn)行我們的軟件。也就是說(shuō)你電腦上直接跑了一個(gè)軟件,并沒(méi)有開(kāi)虛擬機(jī)什么的,資源極其浪費(fèi)。

缺點(diǎn)

  • 部署慢
  • 成本高

虛擬機(jī)都不開(kāi),直接上物理機(jī)部署應(yīng)用,那成本能不高嘛

  • 資源浪費(fèi)

硬件資源沒(méi)有合理利用

  • 不易遷移和增加機(jī)器

每次遷移都要重新安裝一模一樣的運(yùn)行環(huán)境等

  • 受限于硬件

虛擬機(jī)時(shí)代

一個(gè)物理機(jī)上虛擬化出來(lái)多個(gè)虛擬機(jī),每個(gè)虛擬機(jī)上進(jìn)行安裝操作系統(tǒng),然后在虛擬機(jī)上直接運(yùn)行我們的軟件。比如阿里云騰訊云云服務(wù)器都是虛擬機(jī)。

特點(diǎn)

  • 多部署

一個(gè)物理機(jī)上創(chuàng)建多個(gè)虛擬機(jī),每個(gè)虛擬機(jī)的ip都不同,一個(gè)軟件可以在不同虛擬機(jī)上進(jìn)行部署。

  • 資源隔離

每個(gè)虛擬機(jī)都由獨(dú)立分配的內(nèi)存磁盤(pán)等硬件資源,通過(guò)Hypervisor分配。

  • 易擴(kuò)展

隨時(shí)隨地都能在一個(gè)物理機(jī)上開(kāi)出新的虛擬機(jī)。成本也低。

  • 成本相對(duì)較低

缺點(diǎn)

  • 虛擬機(jī)需要安裝操作系統(tǒng)

假設(shè)我們的應(yīng)用程序只有幾KB,或者幾十MB,但是卻要在虛擬機(jī)上安裝一個(gè)幾百兆的操作系統(tǒng)來(lái)跑。

容器化時(shí)代

虛擬化技術(shù)是物理硬件的隔離,容器化技術(shù)是app層面的隔離,兩者不沖突。往往容器化時(shí)代都是基于虛擬機(jī)基礎(chǔ)之上做的資源隔離。它可以基于虛擬機(jī)的操作系統(tǒng)部署多服務(wù),不再需要額外安裝操作系。

特點(diǎn)

  • 標(biāo)準(zhǔn)化的遷移方式

開(kāi)發(fā)者將環(huán)境和程序打包給運(yùn)維,運(yùn)維直接執(zhí)行就完事了。

  • 統(tǒng)一的參數(shù)配置
  • 自動(dòng)化部署
  • 應(yīng)用集群監(jiān)控
  • 開(kāi)發(fā)與運(yùn)維之間的溝通橋梁

傳統(tǒng)虛擬機(jī)和Docker的比較

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

2、Docker是什么

docker官方地址:https://www.docker.com/

Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.

Docker 最初是 dotCloud 公司創(chuàng)始人 Solomon Hykes 在法國(guó)期間發(fā)起的一個(gè)公司內(nèi)部項(xiàng)目,于 2013 年 3 月以 Apache 2.0 授權(quán)協(xié)議開(kāi)源,主要項(xiàng)目代碼在 github 上進(jìn)行維護(hù)。 Docker 使用 Google 公司推出的 Go 語(yǔ)言 進(jìn)行開(kāi)發(fā)實(shí)現(xiàn)。 ? Docker 是Linux容器的一種封裝,提供簡(jiǎn)單易用的容器使用接口。它是最流行的linux容器解決方案。 ? Docker 的接口相當(dāng)簡(jiǎn)單,用戶可以方便的創(chuàng)建、銷(xiāo)毀容器。 ? Docker 將應(yīng)用程序與程序的依賴,打包在一個(gè)文件里面。運(yùn)行這個(gè)文件就會(huì)生成一個(gè)虛擬容器。程序運(yùn)行在虛擬容器里,如同在真實(shí)物理機(jī)上運(yùn)行一樣,有了Docker ,就不用擔(dān)心環(huán)境問(wèn)題了。

Docker concepts

Docker is a platform for developers and sysadmins to build, run, and share applications with containers. The use of containers to deploy applications is called containerization. Containers are not new, but their use for easily deploying applications is.

Containerization is increasingly popular because containers are:

  • Flexible: Even the most complex applications can be containerized.
  • 靈活:即使是最復(fù)雜的應(yīng)用也可以集裝箱化。
  • Lightweight: Containers leverage and share the host kernel, making them much more efficient in terms of system resources than virtual machines.
  • 輕量級(jí):容器利用并共享主機(jī)內(nèi)核,使它們?cè)谙到y(tǒng)資源方面比虛擬機(jī)效率更高
  • Portable: You can build locally, deploy to the cloud, and run anywhere.
  • 便攜式:您可以在本地構(gòu)建,部署到云,并在任何地方運(yùn)行
  • Loosely coupled: Containers are highly self sufficient and encapsulated, allowing you to replace or upgrade one without disrupting others.
  • 松耦合:容器是高度自給自足和封裝的,允許您更換或升級(jí)一個(gè)容器,而不會(huì)中斷其他容器。
  • Scalable: You can increase and automatically distribute container replicas across a datacenter.
  • 可擴(kuò)展:您可以在數(shù)據(jù)中心增加并自動(dòng)分發(fā)容器副本。
  • Secure: Containers apply aggressive constraints and isolations to processes without any configuration required on the part of the user.
  • 安全:容器對(duì)進(jìn)程應(yīng)用嚴(yán)格的約束和隔離,而不需要用戶進(jìn)行任何配置。
  • 以上引自docker官方文檔:https://docs.docker.com/get-started/

3、Docker應(yīng)用場(chǎng)景

  • web應(yīng)用的自動(dòng)化打包和發(fā)布
  • 自動(dòng)化測(cè)試和持續(xù)集成、發(fā)布
  • 在服務(wù)型環(huán)境中部署和調(diào)整數(shù)據(jù)庫(kù)或其他應(yīng)用

4、Docker三大概念

Docker架構(gòu)

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

  1. 鏡像  image
  2. docker鏡像就是一個(gè)只讀模板,比如,一個(gè)鏡像可以包含一個(gè)完整的centos,里面僅安裝apache或用戶的其他應(yīng)用,鏡像可以用來(lái)創(chuàng)建docker容器,另外docker提供了一個(gè)很簡(jiǎn)單的機(jī)制來(lái)創(chuàng)建鏡像或者更新現(xiàn)有的鏡像,用戶甚至可以直接從其他人那里下載一個(gè)已經(jīng)做好的鏡像來(lái)直接使用。
  3. 容器  container
  4. docker利用容器來(lái)運(yùn)行應(yīng)用,容器是從鏡像創(chuàng)建的運(yùn)行實(shí)例,它可以被啟動(dòng),開(kāi)始、停止、刪除、每個(gè)容器都是互相隔離的,保證安全的平臺(tái),可以把容器看做是簡(jiǎn)易版的linux環(huán)境(包括root用戶權(quán)限、鏡像空間、用戶空間和網(wǎng)絡(luò)空間等)和運(yùn)行在其中的應(yīng)用程序。
  5. 倉(cāng)庫(kù)  repository
  6. 鏡像構(gòu)建完成后,可以很容易的在當(dāng)前宿主機(jī)上運(yùn)行,但是,如果需要在其它服務(wù)器上使用這個(gè)鏡像,我們就需要一個(gè)集中的存儲(chǔ)、分發(fā)鏡像的服務(wù),Docker Registry就是這樣的服務(wù)。 一個(gè)Docker Registry中可以包含多個(gè)倉(cāng)庫(kù)( Repository) ; 每個(gè)倉(cāng)庫(kù)可以包含多個(gè)標(biāo)簽(Tag) ;每個(gè)標(biāo)簽對(duì)應(yīng)一個(gè)鏡像。通常,一個(gè)倉(cāng)庫(kù)會(huì)包含同一個(gè)軟件不同版本的鏡像,而標(biāo)簽就常用于對(duì)應(yīng)該軟件的各個(gè)版本。我們可以通過(guò)<倉(cāng)庫(kù)名>:<標(biāo)簽>的格式來(lái)指定具體是這個(gè)軟件哪個(gè)版本的鏡像。如果不給出標(biāo)簽,將以latest作為默認(rèn)標(biāo)簽。
  7. 倉(cāng)庫(kù)分為兩種,公有倉(cāng)庫(kù)和私有倉(cāng)庫(kù),最大的公共倉(cāng)庫(kù)是Docker Hub,存放了數(shù)量龐大的鏡像供用戶下載,國(guó)內(nèi)的docker pool,這里倉(cāng)庫(kù)的概念與Git類(lèi)似,registry可以理解為github這樣的托管服務(wù)。

5、Docker優(yōu)勢(shì)

# 1. 更高效的利用系統(tǒng)資源由于容器不需要進(jìn)行硬件虛擬以及運(yùn)行完整操作系統(tǒng)等額外開(kāi)銷(xiāo),Docker 對(duì)系統(tǒng) 資源的利用率更高。無(wú)論是應(yīng)用執(zhí)行速度、內(nèi)存損耗或者文件存儲(chǔ)速度,都要比傳 統(tǒng)虛擬機(jī)技術(shù)更高效。因此,相比虛擬機(jī)技術(shù),一個(gè)相同配置的主機(jī),往往可以運(yùn) 行更多數(shù)量的應(yīng)用。# 2. 更快速的啟動(dòng)時(shí)間傳統(tǒng)的虛擬機(jī)技術(shù)啟動(dòng)應(yīng)用服務(wù)往往需要數(shù)分鐘,而 Docker 容器應(yīng)用,由于直接 運(yùn)行于宿主內(nèi)核,無(wú)需啟動(dòng)完整的操作系統(tǒng),因此可以做到秒級(jí)、甚至毫秒級(jí)的啟 動(dòng)時(shí)間。大大的節(jié)約了開(kāi)發(fā)、測(cè)試、部署的時(shí)間。# 3. 一致的運(yùn)行環(huán)境開(kāi)發(fā)過(guò)程中一個(gè)常見(jiàn)的問(wèn)題是環(huán)境一致性問(wèn)題。由于開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán) 境不一致,導(dǎo)致有些 bug 并未在開(kāi)發(fā)過(guò)程中被發(fā)現(xiàn)。而 Docker 的鏡像提供了除內(nèi) 核外完整的運(yùn)行時(shí)環(huán)境,確保了應(yīng)用運(yùn)行環(huán)境一致性,從而不會(huì)再出現(xiàn) “這段代碼 在我機(jī)器上沒(méi)問(wèn)題啊” 這類(lèi)問(wèn)題。# 4. 持續(xù)交付和部署對(duì)開(kāi)發(fā)和運(yùn)維(DevOps)人員來(lái)說(shuō),最希望的就是一次創(chuàng)建或配置,可以在任意 地方正常運(yùn)行。使用 Docker 可以通過(guò)定制應(yīng)用鏡像來(lái)實(shí)現(xiàn)持續(xù)集成、持續(xù)交付、部署。開(kāi)發(fā)人員 可以通過(guò) Dockerfile 來(lái)進(jìn)行鏡像構(gòu)建,并結(jié)合 持續(xù)集成(Continuous Integration) 系 統(tǒng)進(jìn)行集成測(cè)試,而運(yùn)維人員則可以直接在生產(chǎn)環(huán)境中快速部署該鏡像,甚至結(jié)合 持續(xù)部署(Continuous Delivery/Deployment) 系統(tǒng)進(jìn)行自動(dòng)部署。而且使用 Dockerfile 使鏡像構(gòu)建透明化,不僅僅開(kāi)發(fā)團(tuán)隊(duì)可以理解應(yīng)用運(yùn)行環(huán) 境,也方便運(yùn)維團(tuán)隊(duì)理解應(yīng)用運(yùn)行所需條件,幫助更好的生產(chǎn)環(huán)境中部署該鏡像。# 5. 更輕松的遷移由于 Docker 確保了執(zhí)行環(huán)境的一致性,使得應(yīng)用的遷移更加容易。Docker 可以在 很多平臺(tái)上運(yùn)行,無(wú)論是物理機(jī)、虛擬機(jī)、公有云、私有云,甚至是筆記本,其運(yùn) 行結(jié)果是一致的。因此用戶可以很輕易的將在一個(gè)平臺(tái)上運(yùn)行的應(yīng)用,遷移到另一 個(gè)平臺(tái)上,而不用擔(dān)心運(yùn)行環(huán)境的變化導(dǎo)致應(yīng)用無(wú)法正常運(yùn)行的情況。

二、Docker安裝

1、 環(huán)境準(zhǔn)備

#系統(tǒng)環(huán)境:docker最低支持centos7且在64位平臺(tái)上,內(nèi)核版本在3.10以上#版本:Docker Community Edition(CE)社區(qū)版,Enterprise Edition(EE) 企業(yè)版(包含了一些收費(fèi)服務(wù))

2、安裝步驟

step1:使用yum命令進(jìn)行安裝

老版本安裝方式 $ yum install -y docker 安裝的版本是1.13.1(2017-2-8更新),不推薦

新版本安裝:Docker官方文檔:https://docs.docker.com/engine/install/centos/ 步驟摘要:

#1.卸載舊版本$ sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine#2.安裝yum工具包包(-y 表示不詢問(wèn) 使用默認(rèn)配置進(jìn)行安裝,等待提示安裝完畢!)$ sudo yum install -y yum-utils#3.設(shè)置鏡像的倉(cāng)庫(kù)(默認(rèn)是從國(guó)外的,推薦使用國(guó)內(nèi)的)$ sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#更新yum軟件包索引(可省略)#yum makecache fast#4.安裝docker相關(guān)的 docker-ce 社區(qū)版 而ee是企業(yè)版$ sudo yum install -y docker-ce docker-ce-cli containerd.io#5.啟動(dòng)docker服務(wù)$ sudo systemctl start docker#6. 使用docker version查看docker版本$ sudo docker version#7. 測(cè)試$ sudo docker run hello-world

step2:查看是否安裝成功

yum list installed|grep docker

備注:命令為 查看yum安裝完成文件列表 并 篩選docker安裝信息 如下

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

step3:?jiǎn)?dòng)docker服務(wù)

systemctl start docker

step4:查看是否啟動(dòng)成功

systemctl status docker

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

如果沒(méi)有出現(xiàn) active(running)說(shuō)明啟動(dòng)失敗

解決方法:修改docker文件,具體命令:vi /etc/sysconfig/docker,在–selinux-enabled后面添加=false。如下圖所示:

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

#再次執(zhí)行systemctl start dockersystemctl status docker

Step5:查看docker版本

docker version

Step6:測(cè)試

docker run hello-world

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

3、配置鏡像加速

方式一:阿里云鏡像加速

A. 打開(kāi)阿里云網(wǎng)址https://cr.console.aliyun.com

B. 使用支付寶或淘寶賬號(hào)登錄

C. 搜索容器鏡像服務(wù)

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

D. 復(fù)制紅色區(qū)域內(nèi)容

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

E. 新建文件夾 mkdir -p /etc/docker

F. 編輯文件 vim /etc/docker/daemon.json 把剛剛復(fù)制的內(nèi)容寫(xiě)進(jìn)去保存

G. 重啟docker

sudo systemctl daemon-reloadsudo systemctl restart docker

方式二:騰訊云鏡像加速

騰訊云為您提供如下 DockerHub 加速器,以方便您快速拉取 DockerHub 平臺(tái)上的容器鏡像。 ? 此加速器地址需在騰訊云云服務(wù)器中配置才可生效,請(qǐng)勿通過(guò)瀏覽器直接訪問(wèn),請(qǐng)參照以下教程進(jìn)行配置。

# 1.創(chuàng)建或修改 /etc/docker/daemon.json 文件,并寫(xiě)入以下內(nèi)容:{ "registry-mirrors": [ "https://mirror.ccs.tencentyun.com" ]}# 2.依次執(zhí)行以下命令,重新啟動(dòng) Docker 服務(wù)。$ sudo systemctl daemon-reload$ sudo systemctl restart docker# Ubuntu16.04 請(qǐng)執(zhí)行 sudo systemctl restart dockerd 命令

騰訊云容器服務(wù)官方地址:https://cloud.tencent.com/document/product/457/9113

方式三:DaoCloud 加速器

簡(jiǎn)介:DaoCloud 加速器是廣受歡迎的 Docker工具,解決了國(guó)內(nèi)用戶訪問(wèn) Docker Hub 緩慢的問(wèn)題。DaoCloud 加速器結(jié)合國(guó)內(nèi)的 CDN 服務(wù)與協(xié)議層優(yōu)化,成倍的提升了下載速度。

# 一條命令加速(記得重啟docker)curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

注意:此時(shí)可能會(huì)導(dǎo)致啟動(dòng)失敗,原因?qū)嵲谂渲苗R像加速時(shí)在配置文件中多加了一個(gè)",",刪除重啟即可。

三、Docker命令

1、幫助命令

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

2、鏡像命令

docker images #查看所有本地主機(jī)上的鏡像 可以使用docker image ls代替Usage: docker images [OPTIONS] [REPOSITORY[:TAG]] -q #只顯示鏡像id -a #列出本地所有鏡像(含中間映像層) --digests #顯示鏡像的摘要信息 --no-trunc #顯示鏡像完整信息[root@VM_0_5_centos ~]# docker images -aREPOSITORY TAG IMAGE ID CREATED SIZEdocker.io/hello-world latest bf756fb1ae65 5 months ago 13.3 kB

docker search #搜索鏡像Usage: docker search [OPTIONS] TERM -f #根據(jù)指定條件刪選鏡像[root@VM_0_5_centos ~]# docker search mysql -f stars=5000 #搜索MySQL鏡像stars超過(guò)5000的INDEX NAME STARS docker.io docker.io/mysql 9623

docker pull #下載鏡像 docker image pullUsage: docker pull [OPTIONS] NAME[:TAG|@DIGEST][root@VM_0_5_centos ~]# docker pull tomcat:8.0 #如果不指定tag,默認(rèn)下載最新版本[root@VM_0_5_centos ~]# docker images -aREPOSITORY TAG IMAGE ID CREATED SIZEdocker.io/tomcat 9.0.36-jdk8-openjdk b79665757bae 4 days ago 530 MBdocker.io/tomcat latest 2eb5a120304e 4 days ago 647 MBdocker.io/hello-world latest bf756fb1ae65 5 months ago 13.3 kBdocker.io/tomcat 8.0 ef6a7c98d192 21 months ago 356 MB

docker rmi #刪除鏡像 docker image rmUsage: docker rmi [OPTIONS] IMAGE [IMAGE...]Remove one or more imagesOptions: -f, --force #強(qiáng)制刪除[root@VM_0_5_centos ~]# docker rmi tomcat #刪除最新版本的tomcat[root@VM_0_5_centos ~]# docker rmi ef6a7c98d192 #根據(jù)鏡像id刪除指定的tomcat[root@VM_0_5_centos ~]# docker rmi -f $(docker images -aq) #強(qiáng)制刪除全部的鏡像

3、容器命令

[root@VM_0_5_centos ~]# docker container --helpUsage: docker container COMMANDManage containersOptions: --help Print usageCommands: attach Attach to a running container commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes on a container's filesystem exec Run a command in a running container Export Export a container's filesystem as a tar archive inspect Display detailed information on one or more containers kill Kill one or more running containers logs Fetch the logs of a container ls List containers pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container prune Remove all stopped containers rename Rename a container restart Restart one or more containers rm Remove one or more containers run Run a command in a new container start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers wait Block until one or more containers stop, then print their exit codesRun 'docker container COMMAND --help' for more information on a command.

啟動(dòng)容器

docker run 鏡像id #新建容器并啟動(dòng)Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]Options: -d, --detach Run container in background and print -e, --env list Set environment variables (default []) -i, --interactive Keep STDIN open even if not attached -p, --publish list Publish a container's port(s) to the host (default []) -P, --publish-all Publish all exposed ports to random ports --rm Automatically remove the container when it exits -t, --tty Allocate a pseudo-TTY -v, --volume list Bind mount a volume (default []) --volume-driver string Optional volume driver for the container --volumes-from list Mount volumes from the specified container(s) (default [])[root@VM_0_5_centos ~]# docker run -it centos /bin/bash #啟動(dòng)centos容器并進(jìn)入交互[root@VM_0_5_centos ~]# docker run -d centos #后臺(tái)啟動(dòng)centos容器,需要注意:docker容器使用后臺(tái)運(yùn)行,就必須要有要一個(gè)前臺(tái)進(jìn)程,docker發(fā)現(xiàn)當(dāng)前容器沒(méi)有前臺(tái)進(jìn)程使用,就會(huì)自動(dòng)停止

進(jìn)入容器

docker exec -it 容器id bashshell #進(jìn)入當(dāng)前正在運(yùn)行的容器(開(kāi)啟一個(gè)新的終端)docker attach 容器id #進(jìn)入當(dāng)前正在運(yùn)行的容器(直接進(jìn)入正在運(yùn)行的終端)

查看運(yùn)行的容器

docker ps #列出所有運(yùn)行的容器 docker container listUsage: docker ps [OPTIONS]Options: -a, --all Show all containers (default shows just running) -f, --filter filter Filter output based on conditions provided --format string Pretty-print containers using a Go template --help Print usage -n, --last int Show n last created containers (includes all states) (default -1) -l, --latest Show the latest created container (includes all states) --no-trunc Don't truncate output -q, --quiet Only display numeric IDs -s, --size Display total file sizes[root@VM_0_5_centos ~]# docker ps -a

退出容器

exit #容器停止退出ctrl P Q #容器不停止退出

刪除容器

docker rm 容器id #刪除指定的容器,不能刪除正在運(yùn)行的容器,如果要強(qiáng)制刪除 rm -rfdocker rm -f $(docker ps -aq) #刪除所有的容器docker ps -a -q|xargs docker rm #刪除所有的容器

容器管理

docker start 容器id #啟動(dòng)容器docker restart 容器id #重啟容器docker stop 容器id #停止當(dāng)前正在運(yùn)行的容器docker kill 容器id #強(qiáng)制停止當(dāng)前容器

4、其他

[root@VM_0_5_centos ~]# docker logs --helpUsage: docker logs [OPTIONS] CONTAINERFetch the logs of a containerOptions: --details Show extra details provided to logs -f, --follow Follow log output --help Print usage --since string Show logs since timestamp --tail string Number of lines to show from the end of the logs (default "all") -t, --timestamps Show timestamps[root@VM_0_5_centos ~]docker run -d centos /bin/sh -c "while true;do echo hello;sleep 1;done" #模擬日志 -tf #顯示日志信息(一直更新) --tail number #需要顯示日志條數(shù)docker logs -t --tail n 容器id #查看n行日志docker logs -ft 容器id #跟蹤日志docker top 容器id #查看容器中的進(jìn)程信息docker inspect 容器id #查看鏡像元數(shù)據(jù)#將指定容器內(nèi)資源拷貝到主機(jī)docker cp 容器id:容器內(nèi)路徑 主機(jī)目的路徑 [root@VM_0_5_centos html]# docker cp 2d30adc4ee87:/etc/nginx/nginx.conf .#將主機(jī)內(nèi)資源拷貝到指定容器docker cp 主機(jī)目的路徑 容器id:容器內(nèi)路徑[root@VM_0_5_centos html]# docker cp test.html d1cf09d31eda:/usr/localdocker save centos > /opt/centos.tar.gz # 導(dǎo)出docker鏡像至本地docker load < /opt/centos.tar.gz #導(dǎo)入本地鏡像到docker鏡像庫(kù)docker stats # 查看docker容器使用內(nèi)存情況

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

四、Docker安裝軟件

1、安裝mysql

#1. 搜索鏡像 search 上hub.docker.com搜索[root@localhost docker]# docker search mysql#2. 拉取鏡像 pull[root@localhost docker]# docker pull mysql:5.7#3、運(yùn)行測(cè)試# -d 后臺(tái)運(yùn)行# --name 給容器命名# -p 宿主機(jī)端口:容器內(nèi)部端口[root@localhost docker]# docker run -d -p 3355:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql1 mysql:5.7#測(cè)試 (關(guān)閉防火墻或授權(quán)遠(yuǎn)程訪問(wèn)) 外部連接訪問(wèn)正常 #進(jìn)入容器命令:docker exec -it 容器id /bin/bash ------------------------------容器啟動(dòng)進(jìn)行數(shù)據(jù)掛載-----------------------------#mysql容器正常啟動(dòng) 數(shù)據(jù)掛載成功 $ docker run -d -p 3344:3306 -v /data/mysql/conf:/etc/mysql/conf.d -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7# 開(kāi)放3344端口及安全組,在容器內(nèi)部創(chuàng)建用戶并授權(quán),測(cè)試OK

2、安裝tomcat

#拉取鏡像[root@localhost docker]# docker pull tomcat #創(chuàng)建容器運(yùn)行[root@localhost docker]# docker run -d -p 8080:8080 --name mytomcat tomcat #測(cè)試訪問(wèn)(記得關(guān)閉防火墻 此時(shí)會(huì)發(fā)現(xiàn)訪問(wèn)成功出現(xiàn)404響應(yīng),原因是webapps下面沒(méi)有資源)ip:8080#進(jìn)入容器(可以使用容器名稱或容器id)[root@localhost docker]# docker exec -it mytomcat /bin/bash#將webapps.dist下的內(nèi)容復(fù)制到webapps下面,重新訪問(wèn)即可看到正常頁(yè)面root@ebef54554573:/usr/local/tomcat# cp -r webapps.dist/* webapps/#部署項(xiàng)目到tomcat[root@localhost docker]# docker cp demo.war mytomcat:/usr/local/tomcat/webapps/#重啟tomcat容器[root@localhost docker]# docker restart mytomcat

3、安裝nginx

#直接安裝nginx鏡像運(yùn)行nginx容器[root@localhost docker]# docker run -d -p 80:80 --name mynginx nginx#進(jìn)入容器 復(fù)制文件到容器同上,不在累述#數(shù)據(jù)掛載 (把容器文件掛載到宿主機(jī)上面,不用每次進(jìn)入容器內(nèi)部修改文件,在容器外部宿主機(jī)修改文件會(huì)自動(dòng)同步到容器內(nèi)部,并且當(dāng)刪除容器后,宿主機(jī)上的文件不會(huì)被刪除,相當(dāng)于對(duì)容器內(nèi)部文件進(jìn)行持久化操作。)[root@localhost docker]# docker run -d -p 8033:80 -v /data/nginx/html:/usr/share/nginx/html --name mynginx nginx#在/data/nginx/html目錄下創(chuàng)建test.html[root@localhost html]# vim test.html#測(cè)試成功[root@localhost html]# curl localhost:8033/test.html--------------------------------------------------------------------------------------[root@localhost docker]# docker run -dit -p 8081:80 -v /data/nginx/conf:/etc/nginx -v /data/nginx/log:/var/log/nginx -v /data/nginx/html:/usr/share/nginx/html --name nginx1 nginx /bin/bash# 說(shuō)明:當(dāng)掛載容器內(nèi)安裝軟件配置目錄容易出現(xiàn)很多問(wèn)題,比如:1.后臺(tái)啟動(dòng)即退出 2.成功啟動(dòng)后無(wú)法正常訪問(wèn)[root@VM_0_5_centos conf]# curl localhost:8081curl: (56) Recv failure: Connection reset by peer

4、安裝elasticsearch

[root@VM_0_5_centos conf]# docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" --name elasticsearch elasticsearch:7.6.2[root@VM_0_5_centos conf]# curl localhost:9200{ "name" : "b7546b5af212", "cluster_name" : "docker-cluster", "cluster_uuid" : "ZLQNTv0ZRbuQAXw4ZLJezw", "version" : { "number" : "7.6.2", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f", "build_date" : "2020-03-26T06:34:37.794943Z", "build_snapshot" : false, "lucene_version" : "8.4.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search"}

五、Docker鏡像

操作系統(tǒng)分為內(nèi)核和用戶空間。對(duì)于Linux而言,內(nèi)核啟動(dòng)后,會(huì)掛載root文件系統(tǒng)為其提供用戶空間支持。而Docker鏡像(Image) ,就相當(dāng)于是一個(gè)root文件系統(tǒng)。比如官方鏡像centos:7.6就包含了完整的一套centos 7.6最小系統(tǒng)的root文件系統(tǒng)。

Docker鏡像是一個(gè)特殊的文件系統(tǒng),除了提供容器運(yùn)行時(shí)所需的程序、庫(kù)、資源、配置等文件外,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變。

因?yàn)?/span>鏡像包含操作系統(tǒng)完整的root文件系統(tǒng),其體積往往是龐大的,因此在Docker設(shè)計(jì)時(shí)將其設(shè)計(jì)為分層存儲(chǔ)的架構(gòu)。鏡像只是一個(gè)虛擬的概念,其實(shí)際體現(xiàn)并非由一個(gè)文件組成,而是由一組文件系統(tǒng)組成,或者說(shuō),由多層文件系統(tǒng)聯(lián)合組成。 ? 鏡像構(gòu)建時(shí),會(huì)一層層構(gòu)建,前一層是后一層的基礎(chǔ)。每一層構(gòu)建完就不會(huì)再發(fā)生改變,后一層上的任何改變只發(fā)生在自己這一層。在構(gòu)建鏡像的時(shí)候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應(yīng)該在該層構(gòu)建結(jié)束前清理掉。 ? 分層存儲(chǔ)的特征還使得鏡像的復(fù)用、定制變的更為容易。甚至可以用之前構(gòu)建好的鏡像作為基礎(chǔ)層,然后進(jìn)一步添加新的層,以定制自己所需的內(nèi)容,構(gòu)建新的鏡像。

鏡像使用的是分層存儲(chǔ),容器也是如此。每一個(gè)容器運(yùn)行時(shí),是以鏡像為基礎(chǔ)層,在其上創(chuàng)建一個(gè)當(dāng)前容器的存儲(chǔ)層,我們可以稱這個(gè)為容器運(yùn)行時(shí)讀寫(xiě)而準(zhǔn)備的存儲(chǔ)層為容器存儲(chǔ)層。容器存儲(chǔ)層的生存周期和容器一樣,容器消亡時(shí),容器存儲(chǔ)層也隨之消亡。因此,任何保存于容器存儲(chǔ)層的信息都會(huì)隨容器刪除而丟失。

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

鏡像使用分層存儲(chǔ),便于資源共享,可以使用docker image inspect 命令查看

[root@VM_0_5_centos ~]# docker image inspect nginx

#docker commit 提交容器成為一個(gè)新的副本docker commit -m="描述信息" -a="作者" 容器id 目標(biāo)鏡像名:[TAG][root@VM_0_5_centos ~]# docker commit -a="shuaige" -m="add test.html" 8fc157a704d4 nginx3:1.0sha256:31b98e5522104b8a30b2cf587cc0494a265f4de9df3a7b04c45f78cb5b9001ef[root@VM_0_5_centos ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx3 1.0 31b98e552210 14 seconds ago 132 MBdocker.io/nginx latest 2622e6cca7eb 5 days ago 132 MB

六、Docker數(shù)據(jù)掛載

按照Docker最佳實(shí)踐的要求,容器不應(yīng)該向其存儲(chǔ)層內(nèi)寫(xiě)入任何數(shù)據(jù),容器存儲(chǔ)層要保持無(wú)狀態(tài)化。所有的文件寫(xiě)入操作,都應(yīng)該使用Volume數(shù)據(jù)卷、或者綁定宿主目錄,在這些位置的讀寫(xiě)會(huì)跳過(guò)容器存儲(chǔ)層,直接對(duì)宿主(或網(wǎng)絡(luò)存儲(chǔ))發(fā)生讀寫(xiě),其性能和穩(wěn)定性更高。 ? 數(shù)據(jù)卷的生存周期獨(dú)立于容器,容器消亡,數(shù)據(jù)卷不會(huì)消亡。因此,使用數(shù)據(jù)卷后,容器刪除或者重新運(yùn)行之后,數(shù)據(jù)卻不會(huì)丟失。

數(shù)據(jù)卷的特性

  • 數(shù)據(jù)卷可以在容器之間共享和重用
  • 對(duì)數(shù)據(jù)卷的修改會(huì)立馬生效
  • 對(duì)數(shù)據(jù)卷的更新,不會(huì)影響鏡像
  • 數(shù)據(jù)卷默認(rèn)會(huì)一直存在,即使容器被刪除

數(shù)據(jù)卷命令

#創(chuàng)建一個(gè)數(shù)據(jù)卷docker volume create 數(shù)據(jù)卷名稱#查看所有的數(shù)據(jù)卷docker volume ls#查看指定數(shù)據(jù)卷的信息docker volume inspect 數(shù)據(jù)卷名稱#創(chuàng)建一個(gè)tomcat容器 使用數(shù)據(jù)卷掛載容器內(nèi)目錄[root@VM_0_5_centos conf]# docker run --name my-tomcat -d -p 8080:8080 -v test:/wepapps tomcat:latest#刪除數(shù)據(jù)卷 如果需要在刪除容器的同時(shí)移除數(shù)據(jù)卷,可以在刪除容器的時(shí)候使用dockerrm-v這個(gè)命令。docker volume rm 數(shù)據(jù)卷名稱#清理無(wú)主的數(shù)據(jù)卷docker volume prune

使用數(shù)據(jù)卷進(jìn)行數(shù)據(jù)掛載

#docker run -it -v 主機(jī)目錄:容器內(nèi)目錄 -p 主機(jī)端口:容器內(nèi)端口 -v, --volume list Bind mount a volume (default []) --volume-driver string Optional volume driver for the container --volumes-from list Mount volumes from the specified container(s) (default [])[root@VM_0_5_centos ~]# docker run -it -v /data/test:/home centos /bin/bash#通過(guò) docker inspect 容器id 查看[root@VM_0_5_centos test]# docker inspect 523d102d8586"Mounts": [ { "Type": "bind", "Source": "/data/test", "Destination": "/home", "Mode": "", "RW": true, "Propagation": "rprivate" } ]

#啟動(dòng)mysql容器進(jìn)行數(shù)據(jù)掛載[root@VM_0_5_centos test]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7#查看mysql容器id[root@VM_0_5_centos test]# docker psCONTAINER ID IMAGE PORTS NAMES0c10d400ecd8 mysql:5.7 0.0.0.0:3306->3306/tcp, 33060/tcp mysql01#進(jìn)入mysql容器[root@VM_0_5_centos test]# docker exec -it 0c10d400ecd8 /bin/sh# mysql -uroot -pEnter password: #進(jìn)入mysql創(chuàng)建新用戶并授權(quán)訪問(wèn)mysql> create user tom identified by "123456";mysql> grant all on *.* to tom;mysql> flush privileges;#開(kāi)放端口[安全組](或關(guān)閉防火墻) 外部測(cè)試OK

掛載的幾種具體方式

# 匿名掛載 -v 容器內(nèi)路徑(只寫(xiě)容器內(nèi)的路徑,沒(méi)有指定宿主機(jī)的路徑)[root@VM_0_5_centos conf]# docker run -d -P -v /etc/nginx --name nginx01 nginx# 查看所有的volume的情況[root@VM_0_5_centos conf]# docker volume lsDRIVER VOLUME NAMElocal 8a2947a4d63c5c71db7dd331a487cd2dcfacc65022302f42030f7deea799b203 # 具名掛載 -v 卷名:容器內(nèi)路徑[root@VM_0_5_centos conf]# docker run -d -P -v my-nginx:/etc/nginx --name nginx02 nginx[root@VM_0_5_centos conf]# docker volume ls DRIVER VOLUME NAMElocal my-nginx# 查看一下這個(gè)卷信息[root@VM_0_5_centos conf]# docker volume inspect my-nginx[ { "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/my-nginx/_data", "Name": "my-nginx", "Options": {}, "Scope": "local" }]

注意:所有的docker容器內(nèi)的卷,沒(méi)有指定目錄的情況下都是在/var/lib/docker/volumes/xxxx/_data下,如果指定了目錄,docker volume ls 是查看不到的

# ro rw 改變讀寫(xiě)權(quán)限r(nóng)o #readonly 只讀 說(shuō)明這個(gè)路徑只能通過(guò)宿主機(jī)來(lái)操作,容器內(nèi)部無(wú)法操作!rw #readwrite 可讀可寫(xiě)docker run -d -P -v nginx03:/etc/nginx:ro --name nginx03 nginxdocker run -d -P -v nginx04:/etc/nginx:rw --name nginx04 nginx

數(shù)據(jù)卷容器(多個(gè)容器同步數(shù)據(jù))

案例:多個(gè)mysql數(shù)據(jù)共享(mysql01和mysql02共享/data/mysql/data目錄下數(shù)據(jù))

---------------------------------目前存在問(wèn)題,待解決----------------------------------$ docker run -d -p 3344:3306 -v /data/mysql/conf:/etc/mysql/conf.d -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7$ docker run -d -p 3355:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=root --name mysql02 mysql:5.7# 掛載配置文件出現(xiàn)報(bào)錯(cuò)ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

容器之間的配置信息的傳遞,數(shù)據(jù)卷容器的生命周期一直持續(xù)到?jīng)]有容器使用為止。但是一旦持久化到了本地,這個(gè)時(shí)候,本地的數(shù)據(jù)是不會(huì)刪除的!

七、DockerFile構(gòu)建私有鏡像

鏡像的定制實(shí)際上就是定制每一層所添加的配置、文件。我們可以把每一層修改、安裝、構(gòu)建、操作的命令都寫(xiě)入一個(gè)腳本,這個(gè)腳本就是Dockerfile。 ? Dockerfile是一個(gè)文本文件,其內(nèi)包含了一條條的指令,每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建。

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

DockerFile構(gòu)建鏡像步驟

1、 編寫(xiě)一個(gè)DockerFile文件

2、 docker build 構(gòu)建成為一個(gè)鏡像

3、 docker run運(yùn)行鏡像

4、 docker push發(fā)布鏡像(DockerHub 、阿里云倉(cāng)庫(kù))

DockerFile詳解

FROM # 基礎(chǔ)鏡像,一切從這里開(kāi)始構(gòu)建MAINTAINER # 鏡像是誰(shuí)寫(xiě)的, 姓名 郵箱RUN # 鏡像構(gòu)建的時(shí)候需要運(yùn)行的命令COPY # 類(lèi)似ADD,將我們文件拷貝到鏡像中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ā)指令。ENV # 構(gòu)建的時(shí)候設(shè)置環(huán)境變量!

注意:每個(gè)關(guān)鍵字(指令)都必須是大寫(xiě)字母,自上到下執(zhí)行,每一個(gè)指令都會(huì)創(chuàng)建提交一個(gè)新的鏡像層。

FROM指定基礎(chǔ)鏡像 ? 所謂定制鏡像,一定是以一個(gè)鏡像為基礎(chǔ),在其上進(jìn)行定制?;A(chǔ)鏡像是必須指定的,而FROM就是指定基礎(chǔ)鏡像,因此一個(gè)Dockerfile中FROM是必備的指令,并且必須是第一條指令。 ? 在Docker Hub上有非常多的高質(zhì)量的官方鏡像,有可以直接拿來(lái)使用的服務(wù)類(lèi)的鏡像,如nginx、redis、mysql 、tomcat等;可以在其中尋找一個(gè)最符合我們最終目標(biāo)的鏡像為基礎(chǔ)鏡像進(jìn)行定制。 ? 如果沒(méi)有找到對(duì)應(yīng)服務(wù)的鏡像,官方鏡像中還提供了一些更為基礎(chǔ)的操作系統(tǒng)鏡像,如ubuntu、debian、centos、 alpine等, 這些操作系統(tǒng)的軟件庫(kù)為我們提供了更廣闊的擴(kuò)展空間。 除了選擇現(xiàn)有鏡像為基礎(chǔ)鏡像外,Docker 還存在一個(gè)特殊的鏡像,名為scratch。這個(gè)鏡像是虛擬的概念,并不實(shí)際存在,它表示一個(gè)空白的鏡像。 ? FROM scratch ? 如果你以scratch為基礎(chǔ)鏡像的話,意味著你不以任何鏡像為基礎(chǔ),接下來(lái)所寫(xiě)的指令將作為鏡像第一層開(kāi)始存在。對(duì)于Linux下靜態(tài)編譯的程序來(lái)說(shuō),并不需要有操作系統(tǒng)提供運(yùn)行時(shí)支持,所需的一切庫(kù)都已經(jīng)在可執(zhí)行文件里了,因此直接FROM scratch會(huì)讓鏡像體積更加小巧。使用Go語(yǔ)言開(kāi)發(fā)的應(yīng)用很多會(huì)使用這種方式來(lái)制作鏡像,這也是為什么有人認(rèn)為Go是特別適合容器微服務(wù)架構(gòu)的語(yǔ)言的原因之一。

RUN執(zhí)行命令 ? RUN指令是用來(lái)執(zhí)行命令行命令的。由于命令行的強(qiáng)大能力,RUN 指令在定制鏡像時(shí)是最常用的指令之一。其格式有兩種: .

shell格式: RUN <命令>RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.htmlexec格式: RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"]RUN tar -xzf redis.tar.gz -C /usr/src/redis -strip-components=1RUN make -C /usr/src/redisRUN make -C /usr/src/redis install

使用Dockerfile定制nginx鏡像

[root@VM_0_5_centos docker]# vim DockerfileFROM nginxRUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html[root@VM_0_5_centos docker]# docker build -t mynginx:1.0 .[root@VM_0_5_centos docker]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmynginx 1.0 ae280f7cccc1 About a minute ago 132 MB[root@VM_0_5_centos docker]# docker run -d -p 8081:80 --name mynginx1 mynginx:1.0[root@VM_0_5_centos docker]# curl localhost:8081<h1>Hello, Docker!</h1>

COPY 復(fù)制文件 ? 格式: ? ●COPY <源路徑>… <目標(biāo)路徑> ? ●COPY ["<源路徑1>",…"<目標(biāo)路徑>"] ? COPY指令將從構(gòu)建上下文目錄中<源路徑>的文件/目錄復(fù)制到新的一層的鏡像內(nèi)的<目標(biāo)路徑>位置。比如:

COPY package.json /usr/src/app/

<源路徑>可以是多個(gè),甚至可以是通配符,如:

COPY hom* /mydir/COPY hom?.txt /mydir/

ADD更高級(jí)的復(fù)制文件 ? ADD指令和COPY的格式和性質(zhì)基本一致。但是在COPY基礎(chǔ)上增加了一些功能。比如<源路徑>可以是一個(gè)URL,這種情況下,Docker 引擎會(huì)試圖去下載這個(gè)鏈接的文件放到<目標(biāo)路徑>去。 ? 在Docker官方的Dockerfile最佳實(shí)踐文檔中要求,盡可能的使用COPY,因?yàn)镃OPY的語(yǔ)義很明確,就是復(fù)制文件而已,而ADD則包含了更復(fù)雜的功能,其行為也不一定很清晰。最適合使用ADD的場(chǎng)合,就是所提及的需要自動(dòng)解壓縮的場(chǎng)合。因此在COPY和ADD指令中選擇的時(shí)候,可以遵循這樣的原則,所有的文件復(fù)制均使用COPY指令,僅在需要自動(dòng)解壓縮的場(chǎng)合使用ADD。

CMD容器啟動(dòng)命令 ? CMD指令的格式和RUN相似,也是兩種格式: ? ●shell格式: CMD <命令> ? ●exec格式: CMD ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"..] ? ●參數(shù)列表格式: CMD ["參數(shù)1", "參數(shù)2..]。在指定了ENTRYPOINT指令后,用CMD指定具體的參數(shù)。 ? Docker不是虛擬機(jī),容器就是進(jìn)程。既然是進(jìn)程,那么在啟動(dòng)容器的時(shí)候,需要指定所運(yùn)行的程序及參數(shù)。CMD 指令就是用于指定默認(rèn)的容器主進(jìn)程啟動(dòng)命令的。

ENTRYPOINT入口點(diǎn) ? ENTRYPOINT的目的和CMD一樣,都是在指定容器啟動(dòng)程序及參數(shù)。ENTRYPOINT在運(yùn)行時(shí)也可以替代,不過(guò)比CMD要略顯繁瑣,需要通過(guò)docker run的參數(shù)–entrypoint來(lái)指定。當(dāng)指定了ENTRYPOINT后,CMD 的含義就發(fā)生了改變,不再是直接的運(yùn)行其命令,而是將CMD的內(nèi)容作為參數(shù)傳給ENTRYPOINT指令,換句話說(shuō)實(shí)際執(zhí)行時(shí),將變?yōu)椋篍NTRYPOINT "CMD"

#CMD和ENTRYPOINT的區(qū)別CMD # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令,只有最后一個(gè)會(huì)生效,可被替代。ENTRYPOINT # 指定這個(gè)容器啟動(dòng)的時(shí)候要運(yùn)行的命令,可以追加命令

ENV設(shè)置環(huán)境變量 ? 格式有兩種: ? ●ENV key value ? ●ENV key1=value1 key2=value2… ? 這個(gè)指令很簡(jiǎn)單,就是設(shè)置環(huán)境變量而已,無(wú)論是后面的其它指令,如RUN,還是運(yùn)行時(shí)的應(yīng)用,都可以直接使用這里定義的環(huán)境變量。

ENV VERSION=1.0 DEBUG=on NAME="Happy Feet"

$VERSION ? #使用環(huán)境變量 ? 下列指令可以支持環(huán)境變量展開(kāi): ADD、COPY、ENV、 EXPOSE、 LABEL、USER、 WORKDIR、 VOLUME、 STOPSIGNAL、 ONBUILD 。

ARG 構(gòu)建參數(shù) ? 格式:ARG <參數(shù)名>[=<默認(rèn)值>] ? 構(gòu)建參數(shù)和ENV的效果一樣,都是設(shè)置環(huán)境變量。所不同的是,ARG 所設(shè)置的構(gòu)建環(huán)境的環(huán)境變量,在將來(lái)容器運(yùn)行時(shí)是不會(huì)存在這些環(huán)境變量的。但是不要因此就使用ARG保存密碼之類(lèi)的信息,因?yàn)閐ocker history還是可以看到所有值的。Dockerfile中的ARG指令是定義參數(shù)名稱,以及定義其默認(rèn)值。該默認(rèn)值可以在構(gòu)建命令docker build中用–build-arg <參數(shù)名>=<值>來(lái)覆蓋。

VOLUME 定義匿名卷 ? 格式: ? VOLUME ["<路徑1>", "<路徑2> ..] ? VOLUME <路徑> ? 容器運(yùn)行時(shí)應(yīng)該盡量保持容器存儲(chǔ)層不發(fā)生寫(xiě)操作,對(duì)于數(shù)據(jù)庫(kù)類(lèi)需要保存動(dòng)態(tài)數(shù)據(jù)的應(yīng)用,其數(shù)據(jù)庫(kù)文件應(yīng)該保存于卷(volume)中,為了防止運(yùn)行時(shí)用戶忘記將動(dòng)態(tài)文件所保存目錄掛載為卷,在Dockerfile中,我們可以事先指定某些目錄掛載為匿名卷,這樣在運(yùn)行時(shí)如果用戶不指定掛載,其應(yīng)用也可以正常運(yùn)行,不會(huì)向容器存儲(chǔ)層寫(xiě)入大量數(shù)據(jù)。 ? VOLUME /data ? 這里的/data目錄就會(huì)在運(yùn)行時(shí)自動(dòng)掛載為匿名卷,任何向/data中寫(xiě)入的信息都不會(huì)記錄進(jìn)容器存儲(chǔ)層,從而保證了容器存儲(chǔ)層的無(wú)狀態(tài)化。當(dāng)然,運(yùn)行時(shí)可以覆蓋這個(gè)掛載設(shè)置。 ? eg:docker run -d -V mydata:/data XXXX ? 在這行命令中,就使用了mydata這個(gè)命名卷掛載到了/data這個(gè)位置,替代了Dockerfile中定義的匿名卷的掛載配置。

EXPOSE聲明端口 ? 格式:EXPOSE <端口1> [<端口2…]。 ? EXPOSE指令是聲明運(yùn)行時(shí)容器提供服務(wù)端口,這只是一個(gè)聲明,在運(yùn)行時(shí)并不會(huì)因?yàn)檫@個(gè)聲明應(yīng)用就會(huì)開(kāi)啟這個(gè)端口的服務(wù)。 ? 在Dockerfile中寫(xiě)入這樣的聲明有兩個(gè)好處: ? 1.是幫助鏡像使用者理解這個(gè)鏡像服務(wù)的守護(hù)端口,以方便配置映射; ? 2.在運(yùn)行時(shí)使隨機(jī)端口映射時(shí),也就是docker run -P時(shí),會(huì)自動(dòng)隨機(jī)映射EXPOSE的端口。

WORKDIR 指定工作目錄 ? 格式:WORKDIR <工作目錄路徑>。 ? 使用WORKDIR指令可以來(lái)指定工作目錄(或者稱為當(dāng)前目錄),以后各層的當(dāng)前目錄就被改為指定的目錄,如該目錄不存在,WORKDIR 會(huì)幫你建立目錄。之前提到一些初學(xué)者常犯的錯(cuò)誤是把Dockerfile等同于Shell腳本來(lái)書(shū)寫(xiě),這種錯(cuò)誤的理解還可能會(huì)導(dǎo)致出現(xiàn)下面這樣的錯(cuò)誤: RUN cd /app RUN echo "hello" > world.txt 如果將這個(gè)Dockerfile進(jìn)行構(gòu)建鏡像運(yùn)行后,會(huì)發(fā)現(xiàn)找不到/app/world.txt文件。

原因:在 Shell中,連續(xù)兩行是同一個(gè)進(jìn)程執(zhí)行環(huán)境,因此前一個(gè)命令修改的內(nèi)存狀態(tài),會(huì)直接影響后一個(gè)命令,而在Dockerfile中,這兩行RUN命令的執(zhí)行環(huán)境根本不同,是兩個(gè)完全不同的容器。 ? 這就是對(duì)Dockerfile構(gòu)建分層存儲(chǔ)的概念不了解所導(dǎo)致的錯(cuò)誤。 ? 每一個(gè)RUN都是啟動(dòng)一個(gè)容器、執(zhí)行命令、然后提交存儲(chǔ)層文件變更。 ? 第一層RUN cd /app的執(zhí)行僅僅是當(dāng)前進(jìn)程的工作目錄變更,一個(gè)內(nèi)存上的變化而已,其結(jié)果不會(huì)造成任何文件變更。而到第二層的時(shí)候,啟動(dòng)的是一個(gè)全新的容器,跟第一層的容器更完全沒(méi)關(guān)系,自然不可能繼承前一層構(gòu)建過(guò)程中的內(nèi)存變化。 ? 因此如果需要改變以后各層的工作目錄的位置,那么應(yīng)該使用WORKDIR指令。

USER 指定當(dāng)前用戶 ? 格式: USER <用戶名> ? USER指令和WORKDIR相似,都是改變環(huán)境狀態(tài)并影響以后的層。WORKDIR 是改變工作目錄,USER 則是改變之后層的執(zhí)行RUN , CMD以及ENTRYPOINT這類(lèi)命令的身份。 ? 當(dāng)然,和WORKDIR一樣,USER 只是幫助你切換到指定用戶而已,這個(gè)用戶必須是事先建立好的,否則無(wú)法切換。 ? RUN groupadd -r redis & useradd -r -g redis redis ? USER redis ? RUN [ "redis-server" ]

HEALTHCHECK健康檢查 ? 格式:HEALTHCHECK [選項(xiàng)] CMD <命令> :設(shè)置檢查容器健康狀況的命令 ? HEALTHCHECK NONE :如果基礎(chǔ)鏡像有健康檢查指令,可以屏蔽掉其健康檢查指令 ? HEALTHCHECK指令是告訴Docker應(yīng)該如何進(jìn)行判斷容器的狀態(tài)是否正常,這是Docker1.12引入的新指令。通過(guò)該指令指定一行命令,用這行命令來(lái)判斷容器主進(jìn)程的服務(wù)狀態(tài)是否還正常,從而比較真實(shí)的反應(yīng)容器實(shí)際狀態(tài)。

一個(gè)鏡像指定了HEALTHCHECK指令后,用其啟動(dòng)容器,初始狀態(tài)會(huì)為starting,在執(zhí)行健康檢查成功后變?yōu)閔ealthy,如果連續(xù)一定次數(shù)失敗, 則會(huì)變?yōu)閡nhealthy。 ? HEALTHCHECK支持下列選項(xiàng): ? ●–interval=<間隔> :兩次健康檢查的間隔, 默認(rèn)為30秒; ? ●–timeout=<時(shí)長(zhǎng)> :健康檢查命令運(yùn)行超時(shí)時(shí)間,如果超過(guò)這個(gè)時(shí)間,本次健康檢查就被視為失敗,默認(rèn)30秒; ? ●–retries=<次數(shù)> :當(dāng)連續(xù)失敗指定次數(shù)后,則將容器狀態(tài)視為unhealthy, 默認(rèn)3次。 ? 為了幫助排障,健康檢查命令的輸出(包括 stdout以及stderr)都會(huì)被存儲(chǔ)于健康狀態(tài)里,可以用docker inspect來(lái)查看。

ONBUILD為他人做嫁衣裳 ? 格式: ONBUILD <其它指令>。 ? ONBUILD是一個(gè)特殊的指令,它后面跟的是其它指令,比如RUN , COPY等,而這些指令,在當(dāng)前鏡像構(gòu)建時(shí)并不會(huì)被執(zhí)行。只有當(dāng)以當(dāng)前鏡像為基礎(chǔ)鏡像,去構(gòu)建下一級(jí)鏡像的時(shí)候才會(huì)被執(zhí)行。 ? Dockerfile中的其它指令都是為了定制當(dāng)前鏡像而準(zhǔn)備的,唯有ONBUILD是為了幫助別人定制自己而準(zhǔn)備的。

# 1.編寫(xiě)Dockerfile文件 重新構(gòu)建centos鏡像[root@VM_0_5_centos docker]# vim dockerfile-centosFROM centosMAINTAINER shuaige<669104343@qq.com>ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATHCMD echo "-----end----"CMD /bin/bash# 2.執(zhí)行 docker build 命令進(jìn)行構(gòu)建# 命令 docker build -f 文件路徑 -t 鏡像名:[tag] .[root@VM_0_5_centos docker]# docker build -f mydockerfile-centos -t mycentos:1.0 .# 3.啟動(dòng)容器并進(jìn)入測(cè)試ifconfig、vim[root@VM_0_5_centos docker]# docker run -it mycentos:1.0

制作tomcat鏡像

#資源準(zhǔn)備 創(chuàng)建/usr/local/docker/tomcat目錄,將jdk、tomcat、readme壓縮包放到該目錄下# 1.編寫(xiě)Dockerfile文件[root@VM_0_5_centos tomcat]# vim DockerfileFROM centos MAINTAINER shuaige<669104343@qq.com>COPY readme /usr/local/readmeADD jdk-8u192-linux-x64.tar.gz /usr/local/ADD apache-tomcat-8.0.53.tar.gz /usr/local/RUN yum -y install vimENV MYPATH /usr/localWORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_192ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.53ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/libEXPOSE 8080CMD /usr/local/apache-tomcat-8.0.53/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.0.53/logs/catalina.out# 2.構(gòu)建鏡像[root@VM_0_5_centos tomcat]# docker build -t mytomcat:1.0 .# 3.運(yùn)行鏡像docker run -d -p 8080:8080 -v /data/tomcat/webapps:/usr/local/apache-tomcat-8.0.53/webapps -v /data/tomcat/logs/:/usr/local/apache-tomcat-8.0.53/logs --name tomcat01 mytomcat:1.0# 4.本地發(fā)布項(xiàng)目測(cè)試 測(cè)試OKhttp://49.234.90.25:8080/test/index.html

其他制作鏡像方式

docker save和docker load Docker還提供了docker load和docker save命令,用以將鏡像保存為一個(gè)tar文件,然后傳輸?shù)搅硪粋€(gè)位置.上,再加載進(jìn)來(lái)。這是在沒(méi)有Docker Registry時(shí)的做法,現(xiàn)在已經(jīng)不推薦,鏡像遷移應(yīng)該直接使用Docker Registry,無(wú)論是直接使用Docker Hub還是使用內(nèi)網(wǎng)私有Registry 都可以。 例如:保存nginx鏡像

docker save nginx|gzip > nginx-latest.tar.gz

然后我們將nginx-latest.tar.gz文件復(fù)制到了到了另一個(gè)機(jī)器上,再次加載鏡像:

docker load -i nginx-latest.tar.gz

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

八、Docker鏡像發(fā)布

1、Docker Hub

目前Docker官方維護(hù)了一個(gè)公共倉(cāng)庫(kù)Docker Hub,其中已經(jīng)包括了數(shù)量超過(guò)15,000的鏡像。大部分需求都可以通過(guò)在Docker Hub中直接下載鏡像來(lái)實(shí)現(xiàn)。

注冊(cè)登錄 ? 可以在https://hub.docker.com免費(fèi)注冊(cè)一個(gè)Docker賬號(hào)。在命令行界執(zhí)行docker login輸入用戶名及密碼來(lái)完成在命令行界面登錄DockerHub,通過(guò)docker logout退出登錄。

拉取鏡像 可以通過(guò)docker search命令來(lái)查找官方倉(cāng)庫(kù)中的鏡像,并利用docker pull命令來(lái)將它下載到本地。

推送鏡像 ? 用戶也可以在登錄后通過(guò)docker push命令來(lái)將自己的鏡像推送到DockerHub。

# 0.查詢將要上傳的鏡像ID[root@VM_0_5_centos ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEdocker.io/hello-world latest bf756fb1ae65 5 months ago 13.3 kB# 1.給將要上傳的鏡像打標(biāo)簽,注意倉(cāng)庫(kù)名一定要寫(xiě)正確# docker tag 鏡像ID 用戶名/倉(cāng)庫(kù)名[root@VM_0_5_centos ~]# docker tag bf756fb1ae65 shuaige66/hello-world# 2.登錄docker倉(cāng)庫(kù)[root@VM_0_5_centos ~]# docker login # 3.推送鏡像到Docker Hub[root@VM_0_5_centos ~]# docker push shuaige66/hello-world

2、阿里云倉(cāng)庫(kù)

Docker從入門(mén)到精通,看這一篇就夠了(docker從入門(mén)到實(shí)戰(zhàn))

# 1. 登錄阿里云Docker Registry 用于登錄的用戶名為阿里云賬號(hào)全名,密碼為開(kāi)通服務(wù)時(shí)設(shè)置的密碼。$ sudo docker login --username=18271267916 registry.cn-hangzhou.aliyuncs.com# 2. 從Registry中拉取鏡像$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/shuaige/test:[鏡像版本號(hào)]# 3. 將鏡像推送到Registry 請(qǐng)根據(jù)實(shí)際鏡像信息替換示例中的[ImageId]和[鏡像版本號(hào)]參數(shù)。$ sudo docker login --username=18271267916 registry.cn-hangzhou.aliyuncs.com$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/shuaige/test:[鏡像版本號(hào)]$ sudo docker push registry.cn-hangzhou.aliyuncs.com/shuaige/test:[鏡像版本號(hào)]# 示例# 1.使用"docker images"命令找到鏡像,將該鏡像名稱中的域名部分變更為Registry專有網(wǎng)絡(luò)地址。[root@VM_0_5_centos docker]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmynginx 1.0 ae280f7cccc1 5 hours ago 132 MB# 2.使用"docker tag"命令重命名鏡像,并將它通過(guò)專有網(wǎng)絡(luò)地址推送至Registry。docker tag ae280f7cccc1 registry.cn-hangzhou.aliyuncs.com/shuaige/mynginx:1.0# 3.推送到阿里云鏡像倉(cāng)庫(kù)docker push registry.cn-hangzhou.aliyuncs.com/shuaige/mynginx:1.0

3、私有倉(cāng)庫(kù)

有時(shí)候使用Docker Hub這樣的公共倉(cāng)庫(kù)可能不方便,用戶可以創(chuàng)建一個(gè)本地倉(cāng)庫(kù)供私人使用。比如,基于公司內(nèi)部項(xiàng)目構(gòu)建的鏡像。 ? docker-registry是官方提供的工具,可以用于構(gòu)建私有的鏡像倉(cāng)庫(kù)。 ? 安裝運(yùn)行docker-registryv ? 通過(guò)獲取官方registry鏡像來(lái)運(yùn)行。默認(rèn)情況下,倉(cāng)庫(kù)會(huì)被創(chuàng)建在容器的/var/lib/registry目錄下,可以通過(guò)-v參數(shù)來(lái)將鏡像文件存放在本地的指定路徑。

[root@VM_0_5_centos ~]# docker run -d -p 5000:5000 --restart=always -v /opt/data/registry:/var/lib/registry --name registry registry

在私有倉(cāng)庫(kù)上傳、搜索、下載鏡像 ? 創(chuàng)建好私有倉(cāng)庫(kù)之后,就可以使用docker tag來(lái)標(biāo)記一個(gè)鏡像, 然后推送它到倉(cāng)庫(kù)。

# 先在本機(jī)查看已有的鏡像。[root@VM_0_5_centos ~]# docker images# 使用docker tag將hello-world:latest這個(gè)鏡像標(biāo)記為127.0.0.1:5000/hello-world:latest[root@VM_0_5_centos ~]# docker tag hello-world:latest 127.0.0.1:5000/hello-world:latest# 使用docker push上傳標(biāo)記的鏡像[root@VM_0_5_centos ~]# docker push 127.0.0.1:5000/hello-world:latest9c27e219663c: Pushed latest: digest: sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042 size: 525# 用curl查看倉(cāng)庫(kù)中的鏡像[root@VM_0_5_centos docker]# curl 127.0.0.1:5000/v2/_catalog{"repositories":["hello-world"]}# 如果可以看到{" repositoris":["hello-world"]},表明鏡像已經(jīng)被成功上傳了。# 先刪除已有鏡像,再嘗試從私有倉(cāng)庫(kù)中下載這個(gè)鏡像。docker image rm 127.0.0.1:5000/hello-world:latestdocker pull 127.0.0.1:5000/hello-world:latest

注意: 如果你不想使用127.0.0.1:5000作為倉(cāng)庫(kù)地址,比如想讓本網(wǎng)段的其他主機(jī)也能把鏡像推送到私有倉(cāng)庫(kù)。你就得把例如192.168.74.149:5000這樣的內(nèi)網(wǎng)地址作為私有倉(cāng)庫(kù)地址,這時(shí)你會(huì)發(fā)現(xiàn)依然無(wú)法成功推送鏡像。 原因:Docker默認(rèn)不允許非HTTPS方式推送鏡像。我們可以通過(guò)Docker的配置選項(xiàng)來(lái)取消這個(gè)限制。

{"regstry-mirror": ["https://registry.docker-cn.com"], "insecure- registries":["192.168.74.149:5000"]}

參考網(wǎng)址

#docker版本及內(nèi)核兼容性選擇https://blog.csdn.net/qq767852841/article/details/106520589/https://www.jianshu.com/p/348dca0e314chttps://docs.docker.com/engine/release-notes/prior-releases/#docker使用https://www.cnblogs.com/peng104/p/10296717.htmlhttps://www.cnblogs.com/zhangxingeng/p/11236968.htmlhttps://blog.csdn.net/forezp/article/details/82454600https://www.javazhiyin.com/62555.htmlhttps://www.javazhiyin.com/?post_type=post&s=dockerhttps://blog.csdn.net/xiaozecheng/article/details/106145593https://blog.csdn.net/xiaozecheng/article/details/106165491

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號(hào)
公眾號(hào)
在線咨詢
分享本頁(yè)
返回頂部
鹤山市| 天柱县| 新竹市| 三明市| 朔州市| 襄城县| 西峡县| 巫溪县| 高要市| 绵阳市| 阳朔县| 沅江市| 茌平县| 来安县| 玉环县| 潞城市| 基隆市| 肇庆市| 孝义市| 富蕴县| 钟山县| 汶上县| 朝阳市| 望都县| 陇西县| 临武县| 买车| 仪陇县| 罗山县| 英吉沙县| 应城市| 北安市| 平谷区| 通江县| 金华市| 神木县| 镇平县| 永寿县| 含山县| 靖边县| 武邑县|