亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    docker的核心組件有哪些

    docker有三大核心組件:1、鏡像(Image),一個(gè)Linux的文件系統(tǒng);2、容器(Container),鏡像的運(yùn)行時(shí)實(shí)例;3、倉(cāng)庫(kù)(Repository),集中存儲(chǔ)鏡像的地方。

    docker的核心組件有哪些

    本教程操作環(huán)境:linux5.9.8系統(tǒng)、docker-1.13.1版、Dell G3電腦。

    Docker的三大核心組件

    • 鏡像(Image)

    • 容器(Container)

    • 倉(cāng)庫(kù)(Repository)

    鏡像(Image)

    什么是Docker鏡像?

    簡(jiǎn)單地理解,Docker鏡像就是一個(gè)Linux的文件系統(tǒng)(Root FileSystem),這個(gè)文件系統(tǒng)里面包含可以運(yùn)行在Linux內(nèi)核的程序以及相應(yīng)的數(shù)據(jù)。

    談到這里,我們可能需要先補(bǔ)充一點(diǎn)與Linux操作系統(tǒng)相關(guān)的知識(shí):

    一般而言, Linux分為兩個(gè)部分:Linux內(nèi)核(Linux Kernel)與用戶(hù)空間,而真正的Linux操作系統(tǒng),是指Linux內(nèi)核,我們常用的Ubuntu、CentOS等操作系統(tǒng)其實(shí)是不同廠商在Linux內(nèi)核基礎(chǔ)上添加自己的軟件與工具集(tools)形成的發(fā)布版本(Linux Distribution)。

    因此,我們也可以把鏡像看成是上面所說(shuō)的用戶(hù)空間,當(dāng)Docker通過(guò)鏡像創(chuàng)建一個(gè)容器時(shí),就是將鏡像定義好的用戶(hù)空間作為獨(dú)立隔離的進(jìn)程運(yùn)行在宿主機(jī)的Linux內(nèi)核之上。

    這里要強(qiáng)調(diào)一下鏡像的兩個(gè)特征:

    • 鏡像是分層(Layer)的:即一個(gè)鏡像可以多個(gè)中間層組成,多個(gè)鏡像可以共享同一中間層,我們也可以通過(guò)在鏡像添加多一層來(lái)生成一個(gè)新的鏡像。

    • 鏡像是只讀的(read-only):鏡像在構(gòu)建完成之后,便不可以再修改,而上面我們所說(shuō)的添加一層構(gòu)建新的鏡像,這中間實(shí)際是通過(guò)創(chuàng)建一個(gè)臨時(shí)的容器,在容器上增加或刪除文件,從而形成新的鏡像,因?yàn)槿萜魇强梢詣?dòng)態(tài)改變的。

    通過(guò)下面的示意圖,我可以更好地理解Docker鏡像與Linux的關(guān)系:

    docker的核心組件有哪些

    操作鏡像的命令

    Docker中與鏡像操作相關(guān)的命令都在docker image這條子命令下,通過(guò)docker image –help這條命令,可以看到docker image子命令的詳細(xì)文檔,如下:

    Usage:  docker image COMMAND  Manage images  Commands: build       Build an image from a Dockerfile(構(gòu)建鏡像的命令) history     Show the history of an image(顯示鏡像構(gòu)建歷史過(guò)程) import      Import the contents from a tarball to create a filesystem image(導(dǎo)入一個(gè)由容器導(dǎo)出的鏡像) inspect     Display detailed information on one or more images(顯示一個(gè)鏡像的詳細(xì)信息) load        Load an image from a tar archive or STDIN(從一個(gè)文件或標(biāo)準(zhǔn)輸入流中導(dǎo)入鏡像) ls          List images(查看鏡像列表) prune       Remove unused images(刪除虛懸鏡像) pull        Pull an image or a repository from a registry(從倉(cāng)庫(kù)拉取鏡像) push        Push an image or a repository to a registry(推送鏡像到倉(cāng)庫(kù)) rm          Remove one or more images(刪除鏡像) save        Save one or more images to a tar archive(streamed to STDOUT by default)(保存鏡像到文件) tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE(給鏡像打標(biāo)簽)

    獲取鏡像

    在安裝了Docker之后,我們本地并沒(méi)有任何鏡像,當(dāng)然我們可以自己構(gòu)建,不過(guò)更方便還是從Docker官方提供的倉(cāng)庫(kù)服務(wù)Docker Hub上拉取官方或第三方已經(jīng)構(gòu)建好的鏡像。

    拉取鏡像可以使用docker image pull,其格式如下:

    docker image pull [OPTIONS] NAME[:TAG|@DIGEST]

    當(dāng)然,docker image pull有更簡(jiǎn)潔的用法:如:

    docker pull [OPTIONS] NAME[:TAG|@DIGEST]

    要拉取鏡像,需要指定Docker Registry的URL和端口號(hào),默認(rèn)是Docker Hub,另外還需要指定倉(cāng)庫(kù)名和標(biāo)簽,倉(cāng)庫(kù)名和標(biāo)簽唯一確定一個(gè)鏡像,而標(biāo)簽是可能省略,如果省略,則默認(rèn)使用latest作為標(biāo)簽名,而倉(cāng)庫(kù)名則由作者名和軟件名組成。

    所以,在省略了那么參數(shù)后,比如我們想拉取centos鏡像,可以使用下面簡(jiǎn)單的命令從Docker Hub上拉到:

    $ docker pull centos

    查看本地鏡像

    通過(guò)上面的方法我們將鏡像拉取到了本地,那要如何查看本地有哪些鏡像呢?通過(guò)下面的命令我們可以查看本地的全部鏡像:

    $ docker image ls

    當(dāng)然Docker提供了更簡(jiǎn)潔的寫(xiě)法,如下:

    $ docker images

    虛懸鏡像

    我們知道Docker鏡像名由倉(cāng)庫(kù)名和標(biāo)簽組成,但有時(shí)候我們會(huì)看到倉(cāng)庫(kù)名和標(biāo)簽皆為<none>的鏡像,我們稱(chēng)為這種鏡像為虛懸鏡像,如下圖所示:

    docker的核心組件有哪些

    虛懸鏡像一般是當(dāng)我們使用docker pull拉取最新鏡像時(shí),生成的新的鏡像,所以倉(cāng)庫(kù)名和標(biāo)簽給了新的鏡像,舊的鏡像倉(cāng)庫(kù)和標(biāo)簽則被取消,成為虛懸鏡像。

    我們可以使用下面的語(yǔ)句打印所有的虛懸鏡像:

    $ docker image ls -f dangling=true

    一般的虛懸鏡像已經(jīng)沒(méi)有什么作用了,所以可以清理掉的,下面的命令可以清除所有的虛懸鏡像:

    $ docker image prune

    不過(guò),如果我們想保留一些有用的虛擬鏡像時(shí),可以使用docker tag命令重新給鏡像起個(gè)倉(cāng)庫(kù)名和標(biāo)簽:

    $ docker tag 621d57f27e93 "test:1.0"

    鏡像導(dǎo)出與導(dǎo)入

    如果想與別人共享某個(gè)鏡像,除了從鏡像服務(wù)倉(cāng)庫(kù)中pull鏡像和把鏡像push到倉(cāng)庫(kù)上去之外,其實(shí)我們還可以將本地構(gòu)建好的鏡像直接導(dǎo)出并保存為文件發(fā)送給別人,如下:

    $ docker image save /tmp/test_image.tar.gz

    而當(dāng)你拿到別人導(dǎo)出的鏡像文件,你可以使用docker load命令把鏡像加載到本地的Docker鏡像列表中,如下:

    $ docker load < /tmp/test_image.tar.gz

    刪除本地鏡像

    要?jiǎng)h除一個(gè)或多個(gè)本地的鏡像,可以使用下面的命令:

    docker image rm [option] IMAGE1,IMAGE2,...IMAGEn

    也可以使用更簡(jiǎn)潔的方式,如:

    docker rmi  [option]  IMAGE1,IMAGE2,...IMAGEn

    可以使用鏡像的長(zhǎng)ID、鏡像短ID、鏡像摘要以及鏡像名稱(chēng)來(lái)刪除鏡像,如下:

    $ docker rmi f7302e4ab3a8

    一般更常用鏡像的短ID,如:

    $ docker rmi f7302

    使用鏡像的摘要也可以刪除鏡像,鏡像的摘要可以使用下面的命令查詢(xún):

    $ docker image ls --digests

    當(dāng)然我們想要清除本地全部鏡像時(shí),可以使用下面的命令,不過(guò)一般不建議使用。

    $ docker rmi $(docker images -qa)

    另外,一般如果鏡像已經(jīng)被使用來(lái)創(chuàng)建容器,使用上面的命令刪除會(huì)報(bào)下面的錯(cuò)誤,告訴我們?cè)撶R像已經(jīng)被使用,不允許刪除。

    Error response from daemon: conflict: unable to remove repository reference "mysql:5.7" (must force) - container ccd406c07a78 is using its referenced image e1e1680ac726

    對(duì)于已經(jīng)被用于創(chuàng)建容器的鏡像,刪除方法有兩種,一種是先把容器刪除,再刪除鏡像,另一種則只需要在刪除鏡像的命令中跟一個(gè)-f參數(shù)便可,如:

    $ docker rim -f f7302

    使用docker commit構(gòu)建鏡像

    上面的例子都是直接使用官方提供的鏡像,其實(shí),除了從官方倉(cāng)庫(kù)或其他鏡像倉(cāng)庫(kù)拉取別人構(gòu)建好的鏡像外,我們也可以構(gòu)建自己的鏡像,一般有以下兩種構(gòu)建方式。

    使用docker commit命令,我們可以將修改過(guò)的容器重新提交為一個(gè)鏡像,如:

    $ docker commit conntaner_id my-hello:1.0

    使用這種方式構(gòu)建的鏡像,我們稱(chēng)為黑箱鏡像,就是一個(gè)黑箱子一樣,別人并不知道我們對(duì)容器做了哪些修改和操作,所以會(huì)對(duì)其安全性有所質(zhì)疑。

    所以不推薦使用這種方式構(gòu)建鏡像,下面我們介紹一種更加通用且方便的方式。

    使用Dockerfile構(gòu)建鏡像

    一般推薦編寫(xiě)Dockerfile來(lái)構(gòu)建一種鏡像,Docker Hub上的鏡像都是采用這種方式構(gòu)建的,采用這種方式的好處就是,我們不用把鏡像分發(fā)給別人,而只是把Dockerfile和相應(yīng)需要寫(xiě)入鏡像的資料發(fā)給別人,別人也能自己構(gòu)建鏡像,安全透明。

    編寫(xiě)一個(gè)簡(jiǎn)單的Got程序

    package main import "fmt"  func main(){ fmt.Println("Hello Go") }

    將Go程序編譯為可執(zhí)行程序,如:

    $ go build hello.go

    編寫(xiě)Dockerfile文件

    下面我們編寫(xiě)一個(gè)簡(jiǎn)單的Dockerfile文件,構(gòu)建自己的第一個(gè)鏡像,如下:

    # 從一個(gè)空白的鏡像開(kāi)始 FROM stratch ADD hello / # 執(zhí)行 CMD /hello

    開(kāi)始構(gòu)建鏡像

    編寫(xiě)好Dockerfile文件后,需要使用docker build命令進(jìn)行構(gòu)建,docker build命令的格式如下:

    $ docker build [OPTIONS] PATH | URL | -
    # 注意最后的點(diǎn)(.)表示當(dāng)前目錄,即Dockerfile所在的目錄 $ docker build -t "hello-go:1.0" .

    上面只是簡(jiǎn)單演示了使用Dockerfile文件如何構(gòu)建鏡像,關(guān)于Dockerfile,還有許多更加深入地用法,我們之后有機(jī)再談。

    容器(Container)

    容器與鏡像的關(guān)系,就如同面向編程中對(duì)象與類(lèi)之間的關(guān)系。

    因?yàn)槿萜魇峭ㄟ^(guò)鏡像來(lái)創(chuàng)建的,所以必須先有鏡像才能創(chuàng)建容器,而生成的容器是一個(gè)獨(dú)立于宿主機(jī)的隔離進(jìn)程,并且有屬于容器自己的網(wǎng)絡(luò)和命名空間。

    我們前面介紹過(guò),鏡像由多個(gè)中間層(layer)組成,生成的鏡像是只讀的,但容器卻是可讀可寫(xiě)的,這是因?yàn)槿萜魇窃阽R像上面添一層讀寫(xiě)層(writer/read layer)來(lái)實(shí)現(xiàn)的,如下圖所示:

    docker的核心組件有哪些

    操作容器的相關(guān)命令

    Usage:  docker container COMMAND  Manage containers  Commands: attach      Attach local standard input, output, and error streams to a runnin                                                                                             g 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(創(chuàng)建一個(gè)新的容器) diff        Inspect changes to files or directories on a container's filesyste                                                                                             m exec        Run a command in a running container(在一個(gè)運(yùn)行的容器中執(zhí)行命令) 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(殺死一個(gè)或多個(gè)正在運(yùn)行的容器) 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(重啟一個(gè)或多個(gè)容器) rm          Remove one or more containers(刪除一個(gè)或多個(gè)容器) run         Run a command in a new container(運(yùn)行一個(gè)新的容器) 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(停止一個(gè)或多個(gè)容器) 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 codes

    啟動(dòng)容器

    啟動(dòng)容器有幾種不同的方式,最常用的方法是使用docker run命令可以通過(guò)鏡像創(chuàng)建一個(gè)容器,如:

    # /bin/bash表示運(yùn)行容器后要執(zhí)行的命令 $ docker run -it centos /bin/bash

    docker run命令有一些比較常用的參數(shù),比如容器是一種提供服務(wù)的守護(hù)進(jìn)程,那么通常需要開(kāi)放端口供外部訪問(wèn),如:

    $ docker run -p 80:80 nginx

    也可以為容器指定一個(gè)名稱(chēng),如:

    $ docker run -p 80:80 --name webserver nginx

    另外一種則是使用docker start命令重新啟動(dòng)已經(jīng)停止運(yùn)行的容器,如:

    # container_id表示容器的id $ docker start container_id

    而對(duì)于正在運(yùn)行的容器,也可以通過(guò)docker restart命令重新啟動(dòng),如:

    # container_id表示容器的id $ docker restart container_id

    查看本地容器列表

    運(yùn)行容器后,我們可以通過(guò)下面的命令查看本地所有容器:

    $ docker container ls

    不過(guò)docker container ls也簡(jiǎn)潔的寫(xiě)法:

    $ docker ps

    上面命令執(zhí)行結(jié)果如下:

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES f4f184f5ffb9        redis:latest        "docker-entrypoint.s…"   6 seconds ago       Up 4 seconds        0.0.0.0:6379->6379/tcp              myredis f7d970e7d4ce        mysql:5.7           "docker-entrypoint.s…"   7 seconds ago       Up 5 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   docker-mysql

    上面的命令只會(huì)顯示正在運(yùn)行的容器,如果要顯示全部容器,包含退出執(zhí)行的,可以加參數(shù)-a,如:

    $ docker ps -a

    有時(shí)候,我們只想查到容器的ID,可以用下面的命令:

    $ docker ps -aq

    執(zhí)行結(jié)果:

    f4f184f5ffb9 f7d970e7d4ce

    停止容器

    對(duì)于已經(jīng)不需要的容器,可以使用docker stop命令停止其運(yùn)行,如:

    $ docker stop container_id1,container_id2...

    批量停止容器,如:

    $ docker stop $(docker ps -qa)

    容器的三種運(yùn)行模式

    概括而言,Docker容器大體上有三種運(yùn)行模式,如下:

    運(yùn)行后退出

    下面語(yǔ)句創(chuàng)建的容器,在運(yùn)行后會(huì)退出。

    $ docker run centos echo "hellowrold"

    常駐內(nèi)存,就是守護(hù)進(jìn)程的模式

    如果容器中運(yùn)行一個(gè)守護(hù)進(jìn)程,則容器會(huì)一直處于運(yùn)行狀態(tài),如:

    $ docker run -d -p 80:80 nginx

    交互式

    我們也可以在運(yùn)行容器時(shí),直接與容器交互。

    $ docker run -it centos /bin/bash

    刪除容器

    $ docker container rm container_id

    刪除容器的命令也有簡(jiǎn)潔的寫(xiě)法,如下:

    $ docker rm container_id

    也可以像上面批量停止容器一樣,我們也可以批量刪除容器,如:

    $ docker rm $(docker ps -qa)

    進(jìn)入容器

    對(duì)于正在運(yùn)行的容器,我們也可以通過(guò)docker exec命令再次進(jìn)入容器,如:

    $ docker exec -it f4f184f5ffb9 /bin/bash

    需要指定容器的id或name,上面的命令我們用的是ID。

    導(dǎo)出容器為鏡像

    $ docker export -o ./image.tar.gz f4f184f5ffb9

    將容器導(dǎo)出后,我們可以另外一臺(tái)有安裝Docker的電腦中將文件包導(dǎo)入成為鏡像,如:

    $ docker import image.tar.gz

    上面講的是容器的概念和一些常用的命令,關(guān)于容器,還可以設(shè)置數(shù)據(jù)卷和網(wǎng)絡(luò)空間,這些我們有機(jī)會(huì)后面再談。

    倉(cāng)庫(kù)(Repository)

    倉(cāng)庫(kù)(Repository)是集中存儲(chǔ)鏡像的地方,這里有個(gè)概念要區(qū)分一下,那就是倉(cāng)庫(kù)與倉(cāng)庫(kù)服務(wù)器(Registry)是兩回事,像我們上面說(shuō)的Docker Hub,就是Docker官方提供的一個(gè)倉(cāng)庫(kù)服務(wù)器,不過(guò)其實(shí)有時(shí)候我們不太需要太過(guò)區(qū)分這兩個(gè)概念。

    公共倉(cāng)庫(kù)

    公共倉(cāng)庫(kù)一般是指Docker Hub,前面我們已經(jīng)多次介紹如何從Docker Hub獲取鏡像,除了獲取鏡像外,我們也可以將自己構(gòu)建的鏡像存放到Docker Hub,這樣,別人也可以使用我們構(gòu)建的鏡像。

    不過(guò)要將鏡像上傳到Docker Hub,必須先在Docker的官方網(wǎng)站上注冊(cè)一個(gè)賬號(hào),注冊(cè)界面如下,按要求填寫(xiě)必要的信息就可以注冊(cè)了,很簡(jiǎn)單的。

    docker的核心組件有哪些

    注冊(cè)好了之后,可以在本地使用命令登錄到Dokcer Hub了,過(guò)程如下:

    # 在命令行中輸入 $ docker login

    docker的核心組件有哪些

    在輸入賬號(hào)密碼登錄到Docker Hub之后,便可以使用docker push命令把鏡像推送到Docker Hub。

    $ docker push test:1.0

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

    有時(shí)候自己部門(mén)內(nèi)部有一些鏡像要共享時(shí),如果直接導(dǎo)出鏡像拿給別人又比較麻煩,使用像Docker Hub這樣的公共倉(cāng)庫(kù)又不是很方便,這時(shí)候我們可以自己搭建屬于自己的私有倉(cāng)庫(kù)服務(wù),用于存儲(chǔ)和分布我們的鏡像。

    Docker官方提供了registry這個(gè)鏡像,可以用于搭建私有倉(cāng)庫(kù)服務(wù),我們把鏡像拉到本地之后,用下面命令創(chuàng)建該鏡像的容器便可以搭建一個(gè)倉(cāng)庫(kù)服務(wù),如下:

    $ docker run -d -p 5000:5000 --restart=always --name registry registry

    假設(shè)我們把一臺(tái)IP為192.168.0.100的服務(wù)器作為倉(cāng)庫(kù)服務(wù),并運(yùn)行上面的語(yǔ)句,那么我們可以下面的語(yǔ)句重新構(gòu)建上面的鏡像,如:

    $ docker build -t "192.168.0.100/hello-go:1.0" .

    然后使用下面的語(yǔ)句推送到自己的私有倉(cāng)庫(kù)服務(wù)器:

    $ docker push 192.168.0.100/hello-word:1.0

    小結(jié)

    鏡像是靜態(tài)的概念,構(gòu)建完成之后便不能再修改,而容器則是一個(gè)動(dòng)態(tài)的概念,使用Docker可以簡(jiǎn)單輕松地創(chuàng)建或刪除容器,鏡像與容器的關(guān)系,就如同面向?qū)ο缶幊讨械念?lèi)與對(duì)象的關(guān)系,而倉(cāng)庫(kù)則是存儲(chǔ)和分發(fā)鏡像的地方。

    推薦學(xué)習(xí):《docker視頻教程》

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)