docker之超薄筆記

本文非小馬原創(chuàng),為學(xué)習(xí)總結(jié)筆記,作為日后復(fù)盤回顧,感謝原作者分享,文末已注明出處,侵刪。

一、什么是docker?

Docker 是一個(gè)開源的應(yīng)用容器引擎,基于?Go 語(yǔ)言?并遵從 Apache2.0 協(xié)議開源。

Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。

容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。

啥意思呢?其實(shí)docker的圖標(biāo)很是形象了。

大鯨魚代表docker,背上的集裝箱代表各個(gè)容器,跑著各種服務(wù),互相不干擾。

二、docker基本命令

docker?客戶端非常簡(jiǎn)單?,我們可以直接輸入?docker?命令來(lái)查看到 Docker 客戶端的所有命令選項(xiàng)。

獲取鏡像,將ubuntu鏡像拉取到本地

docker pull ubuntu

啟動(dòng)容器,以下命令使用 ubuntu 鏡像啟動(dòng)一個(gè)容器,參數(shù)為以命令行模式進(jìn)入該容器:

docker run -it ubuntu /bin/bash

參數(shù)說(shuō)明:

-i: 交互式操作。

-t: 終端。

ubuntu: ubuntu 鏡像。

/bin/bash:放在鏡像名后的是命令,這里我們希望有個(gè)交互式 Shell,因此用的是 /bin/bash。

要退出終端,直接輸入?exit:

root@ed09e4490c57:/# exit

查看所有容器,得到容器ID:

docker ps -a

使用容器ID啟動(dòng)已停止運(yùn)行的容器:

docker start b750bbbcfd88

后臺(tái)運(yùn)行模式:

我們希望 docker 的服務(wù)是在后臺(tái)運(yùn)行的,我們可以過(guò)?-d?指定容器的運(yùn)行模式。

docker run -itd --name ubuntu-test ubuntu /bin/bash

注:加了?-d?參數(shù)默認(rèn)不會(huì)進(jìn)入容器,想要進(jìn)入容器需要使用指令?docker exec(下面會(huì)介紹到)。這里的name是對(duì)容器命名。

在使用?-d?參數(shù)時(shí),容器啟動(dòng)后會(huì)進(jìn)入后臺(tái)。此時(shí)想要進(jìn)入容器,可以通過(guò)以下指令進(jìn)入:

docker exec:推薦大家使用 docker exec 命令,因?yàn)榇送顺鋈萜鹘K端,不會(huì)導(dǎo)致容器的停止。

docker exec -it 243c32535da7 /bin/bash

停止容器:docker stop <容器 ID>

重啟容器:docker restart <容器 ID>

刪除容器:docker rm -f 1e560fca3906

三、docker容器直接拉取鏡像到本地,運(yùn)行一個(gè)web應(yīng)用

怎么理解呢?先pull載入一個(gè)鏡像(一個(gè)空的集裝箱),然后run用容器把鏡像跑起來(lái)(裝什么),將docker的端口映射到主機(jī)上的端口就可以通過(guò)訪問(wèn)主機(jī)的端口訪問(wèn)容器的服務(wù)端口了(將牛奶的集裝箱外貼上1號(hào)箱子,牛奶和一號(hào)進(jìn)行了映射關(guān)系,車下的人說(shuō)我要訪問(wèn)一號(hào)箱就代表要訪問(wèn)牛奶集裝箱)。

容器自己的端口映射到外部(映射到宿主機(jī)端口,供外部通過(guò)宿主機(jī)端口調(diào)用)

這里談到了端口映射。容器中可以運(yùn)行一些網(wǎng)絡(luò)應(yīng)用,要讓外部也可以訪問(wèn)這些應(yīng)用,可以通過(guò)?-P?或?-p?參數(shù)來(lái)指定端口映射。

我們可以在宿主機(jī)的 /etc/docker/daemon.json 文件中增加內(nèi)容來(lái)設(shè)置全部容器的 DNS,也可以使用命令對(duì)指定的容器設(shè)置DNS

創(chuàng)建docker網(wǎng)絡(luò)容器互聯(lián)

端口映射并不是唯一把 docker 連接到另一個(gè)容器的方法。docker 有一個(gè)連接系統(tǒng)允許將多個(gè)容器連接在一起,共享連接信息。docker 連接會(huì)創(chuàng)建一個(gè)父子關(guān)系,其中父容器可以看到子容器的信息。創(chuàng)建一個(gè)新的Docker網(wǎng)絡(luò)

當(dāng)運(yùn)行容器時(shí),使用的鏡像如果在本地中不存在,docker 就會(huì)自動(dòng)從 docker 鏡像倉(cāng)庫(kù)中下載,默認(rèn)是從?Docker Hub?公共鏡像源下載。我們可以使用?docker images?來(lái)列出本地主機(jī)上的鏡像。

四、創(chuàng)建鏡像和構(gòu)建鏡像

創(chuàng)建鏡像:需要先使用舊鏡像創(chuàng)建一個(gè)容器,改完后退出容器,通過(guò)命令docker commit提交容器副本,之后可以用這個(gè)副本名創(chuàng)建符合自己要求的容器了。

構(gòu)建鏡像:docker build +?Dockerfile?文件創(chuàng)建一個(gè)自定義新的鏡像。

我們使用命令?docker build?, 從零開始來(lái)創(chuàng)建一個(gè)新的鏡像。為此,我們需要?jiǎng)?chuàng)建一個(gè)?Dockerfile?文件(比如基于nginx鏡像,復(fù)制web目錄的文件,執(zhí)行什么指令等等,然后bulid就得到一個(gè)鏡像),其中包含一組指令來(lái)告訴 Docker 如何構(gòu)建我們的鏡像。

注意:Dockerfile 的指令每執(zhí)行一次都會(huì)在 docker 上新建一層。所以過(guò)多無(wú)意義的層,會(huì)造成鏡像膨脹過(guò)大。例如:

FROM centos

RUN?yum install?wget

RUN?wget?-O?redis.tar.gz?"http://download.redis.io/releases/redis-5.0.3.tar.gz"

RUN?tar?-xvf?redis.tar.gz

以上執(zhí)行會(huì)創(chuàng)建?3?層鏡像。可簡(jiǎn)化為以下格式:

FROM centos

RUN?yum install?wget?\

?&&?wget?-O?redis.tar.gz?"http://download.redis.io/releases/redis-5.0.3.tar.gz"?\

?&&?tar?-xvf?redis.tar.gz

創(chuàng)建完Dockerfile 文件后開始構(gòu)建鏡像

在Dockerfile 文件的存放目錄下,執(zhí)行構(gòu)建動(dòng)作

以下示例,通過(guò)目錄下的 Dockerfile 構(gòu)建一個(gè) nginx:test(鏡像名稱:鏡像標(biāo)簽)

:最后的?.?代表本次執(zhí)行的上下文路徑。

$ docker build?-t?nginx:test .


五、Docker Compose定義和運(yùn)行多容器 Docker 應(yīng)用程序

Compose 是用于定義和運(yùn)行多容器 Docker 應(yīng)用程序的工具。通過(guò) Compose,您可以使用 YML 文件來(lái)配置應(yīng)用程序需要的所有服務(wù)。然后,使用一個(gè)命令,就可以從 YML 文件配置中創(chuàng)建并啟動(dòng)所有服務(wù)。 docker-compose需要安裝。

Compose 使用的三個(gè)步驟

使用 Dockerfile 定義應(yīng)用程序的環(huán)境(如上面我們提到的NGINX+web目錄自定義鏡像webserver)。

使用 docker-compose.yml 定義構(gòu)成應(yīng)用程序的服務(wù),這樣它們可以在隔離環(huán)境中一起運(yùn)行(如yml文件中配置web需要的webserver和Redis,MySQL三個(gè)服務(wù),配置時(shí)同時(shí)定義容器映射的端口等)。

最后,在目錄中直接執(zhí)行 docker-compose up 命令來(lái)啟動(dòng)并運(yùn)行整個(gè)應(yīng)用程序(啟動(dòng)所有服務(wù))。如果你想在后臺(tái)執(zhí)行該服務(wù)可以加上?-d?參數(shù):docker-compose up -d


六、Docker Machine集中管理所有docker主機(jī)(如對(duì)100臺(tái)主機(jī)的docker程序安裝,不是容器節(jié)點(diǎn))

Docker Machine 是一種可以讓您在虛擬主機(jī)上安裝 Docker 的工具,并可以使用 docker-machine 命令來(lái)管理主機(jī)

Docker Machine 也可以集中管理所有的 docker 主機(jī),比如快速的給 100 臺(tái)服務(wù)器安裝上 docker

七、Docker Swarm集群管理和節(jié)點(diǎn)擴(kuò)容

Docker Swarm 是 Docker 的集群管理工具。它將 Docker 主機(jī)池轉(zhuǎn)變?yōu)閱蝹€(gè)虛擬 Docker 主機(jī)。 Docker Swarm 提供了標(biāo)準(zhǔn)的 Docker API,所有任何已經(jīng)與 Docker 守護(hù)程序通信的工具都可以使用 Swarm 輕松地?cái)U(kuò)展到多個(gè)主機(jī)。

支持的工具包括但不限于以下各項(xiàng):

Dokku

Docker Compose

Docker Machine

Jenkins

原理

如下圖所示,swarm 集群由管理節(jié)點(diǎn)(manager)和工作節(jié)點(diǎn)(work node)構(gòu)成

swarm mananger:負(fù)責(zé)整個(gè)集群的管理工作包括集群配置、服務(wù)管理等所有跟集群有關(guān)的工作。

work node:即圖中的 available node,主要負(fù)責(zé)運(yùn)行相應(yīng)的服務(wù)來(lái)執(zhí)行任務(wù)(task)。

啥意思呢?就是組成一個(gè)集群來(lái)由swarm mananger統(tǒng)一管理,如果某個(gè)work node節(jié)點(diǎn)的服務(wù)如helloworld要擴(kuò)容到兩個(gè)節(jié)點(diǎn),直接設(shè)置規(guī)模數(shù)量為2即可。非常方便。

docker@swarm-manager:~$ docker service scale helloworld=2

參考文獻(xiàn):

docker教程

定制新的鏡像,推薦使用Dockerfile 方式,不推薦commit 定制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。