欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)邀請(qǐng)碼778899分享:eureka Docker學(xué)習(xí)

柚子快報(bào)邀請(qǐng)碼778899分享:eureka Docker學(xué)習(xí)

http://yzkb.51969.com/

文章目錄

認(rèn)識(shí)docker什么是docker如何使用dockerdocker如何工作docker與vm區(qū)別

基本概念docker 鏡像(Docker Image)docker 容器(Docker Container)docker倉庫(Docker Repository )Docker安裝

Docker使用Docker鏡像使用Docker容器使用Docker容器連接**連接mysql**docker安裝nginx

Docker 網(wǎng)絡(luò)bridge模式host模式container模式

Docker數(shù)據(jù)管理-掛載目錄或文件掛載宿主機(jī)目錄掛載宿主機(jī)文件

Docker 數(shù)據(jù)管理 - 數(shù)據(jù)卷概念與特性volume使用共用數(shù)據(jù)卷

認(rèn)識(shí)docker

什么是docker

docker是一個(gè)用Go語言實(shí)現(xiàn)的開源項(xiàng)目,可以讓我們方便的創(chuàng)建和使用容器,docker將程序以及程序所有的依賴都打包到docker container,這樣你的程序可以在任何環(huán)境都會(huì)有一致的表現(xiàn),這里程序運(yùn)行的依賴也就是容器就好比集裝箱,容器所處的操作系統(tǒng)環(huán)境就好比貨船或港口,程序的表現(xiàn)只和集裝箱有關(guān)系(容器),和集裝箱放在哪個(gè)貨船或者哪個(gè)港口(操作系統(tǒng))沒有關(guān)系。

如何使用docker

docker中有這樣幾個(gè)概念:

dockerfileimagecontainer

實(shí)際上可以簡(jiǎn)單的把image理解為可執(zhí)行程序,container就是運(yùn)行起來的進(jìn)程。

那么寫程序需要源代碼,那么“寫”image就需要dockerfile,dockerfile就是image的源代碼,docker就是“編譯器”。

因此我們只需要在dockerfile中指定需要哪些程序、依賴什么樣的配置,之后把dockerfile交給“編譯器”docker進(jìn)行“編譯”,也就是docker build命令,生成的可執(zhí)行程序就是image,之后就可以運(yùn)行這個(gè)image了,這就是docker run命令,image運(yùn)行起來后就是docker container。

docker如何工作

docker client負(fù)責(zé)處理用戶輸入的各種命令,比如docker build、docker run,真正工作的其實(shí)是server,也就是docker demon,值得注意的是,docker client和docker demon可以運(yùn)行在同一臺(tái)機(jī)器上。

接下來我們用幾個(gè)命令來講解一下docker的工作流程:

①docker build 當(dāng)我們寫完dockerfile交給docker“編譯”時(shí)使用這個(gè)命令,那么client在接收到請(qǐng)求后轉(zhuǎn)發(fā)給docker daemon,接著docker daemon根據(jù)dockerfile創(chuàng)建出“可執(zhí)行程序”image。 ②docker run 有了“可執(zhí)行程序”image后就可以運(yùn)行程序了,接下來使用命令docker run,docker daemon接收到該命令后找到具體的image,然后加載到內(nèi)存開始執(zhí)行,image執(zhí)行起來就是所謂的container。 ③docker pull docker中image的概念就類似于“可執(zhí)行程序”,可以從Docker Hub下載別人寫好的image,這樣就不用自己編寫dockerfile了。

docker registry 可以用來存放各種image,公共的可以供任何人下載image的倉庫就是docker Hub。

使用docker pull可以下載image,用戶通過docker client發(fā)送命令,docker daemon接收到命令后向docker registry發(fā)送image下載請(qǐng)求,下載后存放在本地,這樣我們就可以使用image了。

docker與vm區(qū)別

Docker 是一種輕量級(jí)的虛擬化技術(shù),目的和虛擬機(jī)一樣,都是為了創(chuàng)造“隔離環(huán)境”。但是它不像 VM 采用操作系統(tǒng)級(jí)的資源隔離,容器采用的是進(jìn)程級(jí)的系統(tǒng)隔離。

VM:使用 Hypervisor 提供虛擬機(jī)的運(yùn)行平臺(tái),管理每個(gè) VM 中操作系統(tǒng)的運(yùn)行。每個(gè) VM都要有自己的操作系統(tǒng)、應(yīng)用程序和必要的依賴文件等。Docker 容器:使用Docker引擎進(jìn)行調(diào)度和隔離,提高了資源利用率,在相同硬件能力下可以運(yùn)行更多的容器實(shí)例;每個(gè)容器擁有自己的隔離化用戶空間。

基本概念

docker 有三大基本概念,分別是鏡像(Image)、容器(Container)和倉庫(Repository)。鏡像是 Docker 容器運(yùn)行的前提,倉庫是存放鏡像的場(chǎng)所。

docker 鏡像(Docker Image)

docker 鏡像(Image),就相當(dāng)于是一個(gè) root 文件系統(tǒng)。

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

鏡像使用分層存儲(chǔ),鏡像構(gòu)建時(shí),會(huì)一層層構(gòu)建,前一層是后一層的基礎(chǔ)。每一層構(gòu)建完就不會(huì)再發(fā)生改變,后一層上的任何改變只發(fā)生在自己這一層。比如,刪除前一層文件的操作,實(shí)際不是真的刪除前一層的文件,而是僅在當(dāng)前層標(biāo)記為該文件已刪除。在最終容器運(yùn)行的時(shí)候,雖然不會(huì)看到這個(gè)文件,但是實(shí)際上該文件會(huì)一直跟隨鏡像。因此,在構(gòu)建鏡像的時(shí)候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應(yīng)該在該層構(gòu)建結(jié)束前清理掉。

分層存儲(chǔ)的特征還使得鏡像的復(fù)用、定制變的更為容易。甚至可以用之前構(gòu)建好的鏡像作為基礎(chǔ)層,然后進(jìn)一步添加新的層,以定制自己所需的內(nèi)容,構(gòu)建新的鏡像。

docker 容器(Docker Container)

通過鏡像運(yùn)行的實(shí)例稱之為容器,兩者的關(guān)系就像是面向?qū)ο蟪绦蛟O(shè)計(jì)中的 類 和 實(shí)例 一樣,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時(shí)的實(shí)體。容器可以被創(chuàng)建、啟動(dòng)、停止、刪除、暫停等。

Docker 利用容器來運(yùn)行應(yīng)用,每個(gè)容器都是相互隔離的、保證安全的平臺(tái)。我們可以把容器看做是一個(gè)輕量級(jí)的Linux 運(yùn)行環(huán)境。

容器的實(shí)質(zhì)是進(jìn)程,但與直接在宿主執(zhí)行的進(jìn)程不同,容器進(jìn)程運(yùn)行于屬于自己的獨(dú)立的命名空間。因此容器可以擁有自己的 root 文件系統(tǒng)、自己的網(wǎng)絡(luò)配置、自己的進(jìn)程空間,甚至自己的用戶 ID 空間。容器內(nèi)的進(jìn)程是運(yùn)行在一個(gè)隔離的環(huán)境里,使用起來,就好像是在一個(gè)獨(dú)立于宿主的系統(tǒng)下操作一樣。這種特性使得容器封裝的應(yīng)用比直接在宿主運(yùn)行更加安全。 容器存儲(chǔ)層的生存周期和容器一樣,容器消亡時(shí),容器存儲(chǔ)層也隨之消亡。因此,任何保存于容器存儲(chǔ)層的信息都會(huì)隨容器刪除而丟失。

按照 Docker 最佳實(shí)踐的要求,容器不應(yīng)該向其存儲(chǔ)層內(nèi)寫入任何數(shù)據(jù),容器存儲(chǔ)層要保持無狀態(tài)化。所有的文件寫入操作,都應(yīng)該使用數(shù)據(jù)卷(Volume),或者綁定宿主目錄,在這些位置的讀寫會(huì)跳過容器存儲(chǔ)層,直接對(duì)宿主(或網(wǎng)絡(luò)存儲(chǔ))發(fā)生讀寫,其性能和穩(wěn)定性更高。

數(shù)據(jù)卷的生存周期獨(dú)立于容器,容器消亡,數(shù)據(jù)卷不會(huì)消亡。因此,使用數(shù)據(jù)卷后,容器刪除或者重新運(yùn)行之后,數(shù)據(jù)卻不會(huì)丟失。

docker倉庫(Docker Repository )

Docker Repository 用于鏡像的集中存儲(chǔ)、分發(fā)的地方。有了它,鏡像在構(gòu)建完成后,在其他機(jī)器上就可以非常方便的下載使用這個(gè)鏡像了。

一個(gè) Docker Registry 中可以包含多個(gè)倉庫(Repository);每個(gè)倉庫可以包含多個(gè)標(biāo)簽(Tag);每個(gè)標(biāo)簽對(duì)應(yīng)一個(gè)鏡像。

通常,一個(gè)倉庫會(huì)包含同一個(gè)軟件不同版本的鏡像,而標(biāo)簽就常用于對(duì)應(yīng)該軟件的各個(gè)版本。我們可以通過 <倉庫名>:<標(biāo)簽> 的格式來指定具體是這個(gè)軟件哪個(gè)版本的鏡像。如果不給出標(biāo)簽,將以 latest 作為默認(rèn)標(biāo)簽,表示最新的一個(gè)版本。

以 Ubuntu 鏡像為例,ubuntu 是倉庫的名字,其內(nèi)包含有不同的版本標(biāo)簽,如,16.04, 18.04。我們可以通過 ubuntu:16.04,或者 ubuntu:18.04 來具體指定所需哪個(gè)版本的鏡像。如果忽略了標(biāo)簽,比如 ubuntu,那將視為 ubuntu:latest。

倉庫名經(jīng)常以以兩段式路徑形式出現(xiàn),比如 jwilder/nginx-proxy,前者往往意味著 Docker Registry 多用戶環(huán)境下的用戶名,后者則往往是對(duì)應(yīng)的軟件名。但這并非絕對(duì),取決于所使用的具體 Docker Registry 的軟件或服務(wù)。

公有倉庫 公有倉庫是允許用戶免費(fèi)上傳、下載的公開鏡像服務(wù)。比如官方的 Docker Hub ,也是默認(rèn)的 Docker Repository,里面擁有著大量的高質(zhì)量鏡像。但是國(guó)內(nèi)訪問它可能比較慢,國(guó)內(nèi)的云服務(wù)商提供了針對(duì) Docker Hub 的鏡像服務(wù)(Registry Mirror),這些鏡像服務(wù)被稱為鏡像加速器。國(guó)內(nèi)常見有阿里云加速器、網(wǎng)易加速器、DaoCloud 加速器等。

本教程提供了阿里云加速器的配置方法,鏈接如下:

Docker 配置阿里云鏡像加速器

私有倉庫 除了公有倉庫外,用戶還可以在本地搭建私有倉庫。Docker 官方提供了 Docker Registry 鏡像,可以直接使用做為私有 Registry 服務(wù)。

Docker安裝

https://www.quanxiaoha.com/docker/docker-search-image.html

Docker使用

docker Hello world Docker 允許你在容器內(nèi)運(yùn)行應(yīng)用程序,使用 docker run 命令來在容器內(nèi)運(yùn)行一個(gè)應(yīng)用程序。 例,輸出Hello world。

root@ubuntu:~# docker run ubuntu:15.10 /bin/echo "Hello world"

Hello world

各個(gè)參數(shù)解析:

docker: Docker 的二進(jìn)制執(zhí)行文件。run:與前面的 docker 組合來運(yùn)行一個(gè)容器。ubuntu:15.10指定要運(yùn)行的鏡像,Docker 首先從本地主機(jī)上查找鏡像是否存在,如果不存在,Docker 就會(huì)從鏡像倉庫 Docker Hub 下載公共鏡像。/bin/echo “Hello world”: 在啟動(dòng)的容器里執(zhí)行的命令

以上命令完整的意思可以解釋為:Docker 以 ubuntu15.10 鏡像創(chuàng)建一個(gè)新容器,然后在容器里執(zhí)行 bin/echo “Hello world”,然后輸出結(jié)果。

運(yùn)行交互式的容器 我們通過 docker 的兩個(gè)參數(shù) -i -t,讓 docker 運(yùn)行的容器實(shí)現(xiàn)"對(duì)話"的能力:

docker run -i -t ubuntu:15.10 /bin/bash

root@16452c56c56f:/#

各個(gè)參數(shù)解析:

-t: 在新容器內(nèi)指定一個(gè)偽終端或終端。

-i: 允許你對(duì)容器內(nèi)的標(biāo)準(zhǔn)輸入 (STDIN) 進(jìn)行交互。

注意第二行root@16452c56c56f:/# ,此時(shí)我們已進(jìn)入一個(gè) ubuntu15.10 系統(tǒng)的容器

我們嘗試在容器中運(yùn)行命令 cat /proc/version和ls分別查看當(dāng)前系統(tǒng)的版本信息和當(dāng)前目錄下的文件列表

root@16452c56c56f:/# ls

bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

我們可以通過運(yùn)行 exit 命令或者使用 CTRL+D 來退出容器。

root@16452c56c56f:/# exit

啟動(dòng)容器(后臺(tái)模式)

使用以下命令創(chuàng)建一個(gè)以進(jìn)程方式運(yùn)行的容器

runoob@runoob:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

fd0e4ac8775a3079f64abd0133ea5fa97e5dacff3e9ec07de1456be36ea9de43

在輸出中,我們沒有看到期望的 “hello world”,而是一串長(zhǎng)字符

fd0e4ac8775a3079f64abd0133ea5fa97e5dacff3e9ec07de1456be36ea9de43

這個(gè)長(zhǎng)字符串叫做容器 ID,對(duì)每個(gè)容器來說都是唯一的,我們可以通過容器 ID 來查看對(duì)應(yīng)的容器發(fā)生了什么。

首先,我們需要確認(rèn)容器有在運(yùn)行,可以通過 docker ps 來查看:

root@ubuntu:~# docker ps

輸出詳情介紹:

CONTAINER ID:容器 ID。IMAGE:使用的鏡像。COMMAND:?jiǎn)?dòng)容器時(shí)運(yùn)行的命令。CREATED:容器的創(chuàng)建時(shí)間。STATUS:容器狀態(tài)。

狀態(tài)有7種:

created(已創(chuàng)建)restarting(重啟中)running 或 Up(運(yùn)行中)removing(遷移中)paused(暫停)exited(停止)dead(死亡)

PORTS:容器的端口信息和使用的連接類型(tcp\udp)。

NAMES:自動(dòng)分配的容器名稱。

在宿主主機(jī)內(nèi)使用 docker logs 命令,查看容器內(nèi)的標(biāo)準(zhǔn)輸出: root@ubuntu:~# docker stop fd0e4ac8775a

我們使用 docker stop 命令來停止容器

Docker鏡像使用

一,列出鏡像列表 我們可以使用 docker images 來列出本地主機(jī)上的鏡像。 各個(gè)選項(xiàng)說明:

REPOSITORY:表示鏡像的倉庫源TAG:鏡像的標(biāo)簽IMAGE ID:鏡像IDCREATED:鏡像創(chuàng)建時(shí)間SIZE:鏡像大小

我們?nèi)绻褂冒姹緸?5.10的ubuntu系統(tǒng)鏡像來運(yùn)行容器時(shí),命令如下:

root@ubuntu:~# docker run -t -i ubuntu:15.10 /bin/bash

root@d77ccb2e5cca:/#

二,獲取一個(gè)新的鏡像 當(dāng)我們?cè)诒镜刂鳈C(jī)上使用一個(gè)不存在的鏡像時(shí) Docker 就會(huì)自動(dòng)下載這個(gè)鏡像。如果我們想預(yù)先下載這個(gè)鏡像,我們可以使用 docker pull 命令來下載它。

root@ubuntu:~# docker pull ubuntu:13.10

三,查找鏡像 我們可以從 Docker Hub 網(wǎng)站來搜索鏡像,Docker Hub 網(wǎng)址為: https://hub.docker.com/

我們也可以使用 docker search 命令來搜索鏡像。比如我們需要一個(gè) httpd 的鏡像來作為我們的 web 服務(wù)。我們可以通過 docker search 命令搜索 httpd 來尋找適合我們的鏡像。

root@ubuntu:~# docker search httpd

四,拖取鏡像 我們決定使用 httpd 官方版本的鏡像,使用命令 docker pull 來下載鏡像:docker pull httpd

五,刪除鏡像 鏡像刪除使用 docker rmi 命令,比如我們刪除 httpd 鏡像:docker rmi httpd

比如刪除image id為56f4649dfd93的鏡像:docker rmi 56f4649dfd93 從創(chuàng)建鏡像到刪除的完整過程: (docker的刪除有兩種,一個(gè)是rm 刪除容器,一個(gè)是rmi刪除鏡像)

六,創(chuàng)建子鏡像 當(dāng)我們從 docker 鏡像倉庫中下載的鏡像不能滿足我們的需求時(shí),我們可以通過以下兩種方式對(duì)鏡像進(jìn)行更改。

①從已經(jīng)創(chuàng)建的容器中更新鏡像,并且提交這個(gè)鏡像

更新鏡像之前,我們需要使用鏡像來創(chuàng)建一個(gè)容器。

root@ubuntu:~#docker run -t -i ubuntu:15.10 /bin/bash

root@69ef002b1b0d:/# exit

在運(yùn)行的容器內(nèi)使用 apt-get update 命令進(jìn)行更新。

在完成操作之后,輸入 exit 命令來退出這個(gè)容器。

此時(shí) ID 為69ef002b1b0d的容器,是按我們的需求更改的容器。我們可以通過命令 docker commit 來提交容器副本。

root@ubuntu:~# docker commit -m="has update" -a="runoob" 69ef002b1b0d runoob/ubuntu:v2

sha256:56f4649dfd9326838ff82cf518b5f55683e737f69eb82826b92a6a2f4d87a134

各個(gè)參數(shù)說明:

-m: 提交的描述信息-a: 指定鏡像作者e218edb10161:容器 IDrunoob/ubuntu:v2: 指定要?jiǎng)?chuàng)建的目標(biāo)鏡像名

使用我們的新鏡像 runoob/ubuntu 來啟動(dòng)一個(gè)容器:(新鏡像是原來的子鏡像,此時(shí)無法刪除父鏡像)

root@ubuntu:~# docker run -t -i runoob/ubuntu:v2 /bin/bash

②使用 Dockerfile 指令來創(chuàng)建一個(gè)新的鏡像

Docker容器使用

1,查看所有容器docker ps -a 2,啟動(dòng)容器,以下命令使用 ubuntu 鏡像啟動(dòng)一個(gè)新容器,參數(shù)為以命令行模式進(jìn)入該容器:

root@ubuntu:~# docker run -it ubuntu:15.10 /bin/bash

root@69ef002b1b0d:/# exit

exit

此時(shí)添加了一個(gè)新容器。 參數(shù)說明:

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

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

root@0104ce9e8a4a:/# exit

exit

4,使用 docker start啟動(dòng)一個(gè)已停止的容器: docker start <容器 ID>

root@ubuntu:~# docker start 0104ce9e8a4a

0104ce9e8a4a

停止的容器可以通過 docker restart 重啟:docker restart <容器 ID>

root@ubuntu:~# docker restart 0104ce9e8a4a

0104ce9e8a4a

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

下面演示了使用 docker attach 命令。 輸入exit后會(huì)導(dǎo)致容器停止:

Error response from daemon: container 0104ce9e8a4aebd7cc1973588e88784920b282c7b0cf73e7ed76c05317693eff is not running

docker exec:推薦大家使用 docker exec 命令,因?yàn)榇嗣顣?huì)退出容器終端,但不會(huì)導(dǎo)致容器的停止。 6,導(dǎo)入導(dǎo)出容器 ①導(dǎo)出容器

如果要導(dǎo)出本地某個(gè)容器,可以使用 docker export 命令。

docker export 1e560fca3906 > ubuntu.tar

導(dǎo)出容器 1e560fca3906 快照到本地文件 ubuntu.tar。

這樣將導(dǎo)出容器快照到本地文件。

②導(dǎo)入容器快照

可以使用 docker import 從容器快照文件中再導(dǎo)入為鏡像,以下實(shí)例將快照文件 ubuntu.tar 導(dǎo)入到鏡像 test/ubuntu:v1:

cat docker/ubuntu.tar | docker import - test/ubuntu:v1

7,后臺(tái)運(yùn)行 在大部分的場(chǎng)景下,我們希望 docker 的服務(wù)是在后臺(tái)運(yùn)行的,我們可以過 -d 指定容器的運(yùn)行模式。

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

7,使用docker rm -f <容器ID> 來刪除容器。

root@ubuntu:~# docker rm -f 2e6403c43331

2e6403c43331

root@ubuntu:~# docker rm -f fd0e4ac8775a

fd0e4ac8775a

Docker容器連接

連接mysql

一,Docker安裝mysql 1,查看可用版本 2,拉取mysql鏡像 這里我們拉取官方的最新版本的鏡像:

root@ubuntu:~# docker pull mysql:latest

3,查看本地鏡像:docker images 4,運(yùn)行容器 安裝完成后,我們可以使用以下命令來運(yùn)行 mysql 容器:

root@ubuntu:~# docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

參數(shù)說明:

-p 3306:3306 :映射容器服務(wù)的 3306 端口到宿主機(jī)的 3306 端口,外部主機(jī)可以直接通過宿主機(jī)ip:3306 訪問到 MySQL 的服務(wù)。–name mysql-test mysql (前者為names,后者為images)MYSQL_ROOT_PASSWORD=123456:設(shè)置 MySQL 服務(wù) root 用戶的密碼。 5,進(jìn)入mysql

root@ubuntu:~# docker start mysql-test

mysql-test

root@ubuntu:~# docker exec -it mysql-test /bin/bash

bash-4.4# mysql -uroot -p123456

mysql> show databases;

docker安裝nginx

下載并運(yùn)行Nginx鏡像

root@ubuntu:~# docker run -d -p 80:80 --name nginx nginx:1.19.4

參數(shù)說明:

-p 80:80: 將容器的 80 端口映射到宿主機(jī)的 80 端口上-d: 以后臺(tái)方式運(yùn)行鏡像;–name: 指定容器的名稱為 nginx; 命令執(zhí)行完成后docker ps命令確認(rèn)一下容器是否啟動(dòng)成功。 復(fù)制 Nginx 配置文件至宿主機(jī) 因?yàn)槿萜髦貑?huì)丟失內(nèi)部數(shù)據(jù),因此要將需要持久化的文件掛載到宿主機(jī)中,以防數(shù)據(jù)丟失。

掛載之前,復(fù)制容器中需要持久化的相關(guān)配置文件到宿主機(jī)的指定路徑下:

#復(fù)制名稱為 nginx 容器中 /etc/nginx/nginx.conf 文件夾到宿主機(jī)的 /nginx 路徑下,宿主機(jī)的持久化目錄根據(jù)你的需要自定義路徑

root@ubuntu:~# docker cp nginx:/etc/nginx/nginx.conf /nginx

# 復(fù)制名稱為 nginx 容器中 /etc/nginx/conf.d 文件到宿主機(jī)的 /nginx 路徑下

root@ubuntu:~# docker cp nginx:/etc/nginx/conf.d /nginx

Docker 網(wǎng)絡(luò)

容器與主機(jī)、容器與容器之間是互相隔離的。同時(shí),我們可以通過配置 docker 網(wǎng)絡(luò),為容器創(chuàng)建完全獨(dú)立的網(wǎng)絡(luò)命名空間,或者使容器共享主機(jī)或者其他容器的網(wǎng)絡(luò)命名空間,以應(yīng)對(duì)不同場(chǎng)景的需要。

這里有4種常用的單宿主機(jī)網(wǎng)絡(luò)模式: 1.bridge 模式 2.host 模式 3.container 模式 4.none 模式

bridge模式

Docker 服務(wù)啟動(dòng)時(shí),會(huì)自動(dòng)在宿主機(jī)上創(chuàng)建一個(gè) docker0 虛擬網(wǎng)橋 (Linux Bridge, 可以理解為一個(gè)軟件虛擬出來的交換機(jī))。它會(huì)在掛載到它的網(wǎng)口之間進(jìn)行轉(zhuǎn)發(fā)。同時(shí) Docker 隨機(jī)分配一個(gè)可用的私有 IP 地址給 docker0 接口。如果容器使用默認(rèn)網(wǎng)絡(luò)參數(shù)啟動(dòng),那么它的網(wǎng)口也會(huì)自動(dòng)分配一個(gè)與 docker0 同網(wǎng)段的 IP 地址。

我們使用命令 ip address show dev docker0 獲取 docker0 網(wǎng)絡(luò)信息,它的地址是 172.17.0.1, 子網(wǎng)掩碼為 255.255.0.0,如下圖所示: 我們來做個(gè)測(cè)試,看看默認(rèn)新建的容器是否能互相連通。 使用 busybox 鏡像分別運(yùn)行 b0,b1 兩個(gè)容器:

docker run -d -t --name b0 busybox

docker run -d -t --name b1 busybox

容器新建并運(yùn)行成功后,查看兩個(gè)容器的 IP 地址:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' b0

docker inspect --format '{{ .NetworkSettings.IPAddress }}' b1

兩個(gè)容器互相 ping 一下,證明它們的網(wǎng)絡(luò)能連通:

docker exec -it b0 ping 172.17.0.3

docker exec -it b1 ping 172.17.0.2

此時(shí)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)如下所示: 端口映射訪問容器 將宿主機(jī)的本地端口,與指定容器的服務(wù)端口進(jìn)行映射綁定,之后訪問宿主機(jī)端口時(shí),會(huì)將請(qǐng)求自動(dòng)轉(zhuǎn)發(fā)到容器的端口上,實(shí)現(xiàn)外部對(duì)容器內(nèi)網(wǎng)絡(luò)服務(wù)的訪問。

創(chuàng)建名為 n0 的 nginx 容器,映射宿主機(jī) 8000 端口到它的 80 端口

docker run -d -t -p 8000:80 --name n0 nginx

Tips:指定的宿主機(jī)端口必須是未被占用的端口,否則操作會(huì)失敗,且生成一個(gè)無法正常啟動(dòng)的容器 n0, 需要手動(dòng)刪除。

使用 docker port n0 查看 n0 的端口映射信息,顯示如下: 打開瀏覽器,地址欄輸入 http://localhost:8000 或 http:// 宿主機(jī) IP:8000, 都能訪問到 n0 的 nginx 服務(wù)。

①如果需要綁定多個(gè)容器端口,可以連續(xù)使用 -p 參數(shù)多次指定

docker run -d -t -p 8001:80 -p 8433:443 --name n1 nginx

②如果不想主動(dòng)指定宿主機(jī)端口,可以使用 -P 參數(shù),宿主機(jī)隨機(jī)使用一個(gè)可用端口與容器端口進(jìn)行映射

docker run -d -t -p --name n2 nginx

③如果只想使用宿主機(jī)上特定的網(wǎng)口與容器進(jìn)行映射

docker run -d -t -p 192.168.32.149:8002:80 --name n3 nginx

Tips:此處192.168.32.149 指代宿主機(jī)映射網(wǎng)口的 IP 地址,需要根據(jù)網(wǎng)口的實(shí)際 IP 更改。 我們執(zhí)行 docker ps 可能出現(xiàn)如下幾個(gè)的 nginx 容器: 再執(zhí)行 iptables -t nat -nL 查看下防火墻: 比對(duì)上面兩個(gè)的輸出,不難發(fā)現(xiàn),這種端口轉(zhuǎn)發(fā)方式的本質(zhì)是通過配置 iptables 規(guī)則轉(zhuǎn)發(fā)實(shí)現(xiàn)的,效率較低,如果容器的服務(wù)端口數(shù)量過多,需要配置較多的映射,占用大量宿主機(jī)端口,也不便于管理。

不再使用的容器記得刪除掉,釋放資源和空間

docker rm -f n0 n1 n2 n3

host模式

host 模式下啟動(dòng)的容器,網(wǎng)絡(luò)不再與宿主機(jī)隔離,訪問容器服務(wù)可以直接使用訪問宿主機(jī)對(duì)應(yīng)的網(wǎng)絡(luò)端口,且不需要端口轉(zhuǎn)發(fā)。網(wǎng)絡(luò)拓?fù)鋱D如下: 以 host 模式啟動(dòng) nginx 的容器 h0:

docker run -d -t --network host --name h0 nginx

啟動(dòng)成功后,在瀏覽器輸入任意的本機(jī)地址,都可以打開 nginx 的默認(rèn)頁面,訪問宿主機(jī)80端口就是訪問容器的80端口,它們是一致的。

以 host 模式啟動(dòng) nginx 的容器 h1:

docker run -d -t --network host --name h1 nginx

container模式

與 host 模式類似,container 模式可以使一個(gè)容器共享另一個(gè)已存在容器的網(wǎng)絡(luò),此時(shí)這兩個(gè)容器共同使用同一網(wǎng)卡、主機(jī)名、IP 地址,容器間通訊可直接通過本地回環(huán) lo 接口通訊。新運(yùn)行一個(gè) busybox 的容器 b1,設(shè)定它共享已存在的容器 b0 的網(wǎng)絡(luò):

docker run -d -t --network container:b0 --name b1 busybox

Tips:端口轉(zhuǎn)發(fā)設(shè)定以已存在的容器為準(zhǔn),出于安全和權(quán)限控制的角度,container 模式下運(yùn)行的容器設(shè)定端口轉(zhuǎn)發(fā)不生效。 查看 b0,b1 的網(wǎng)絡(luò)配置,驗(yàn)證兩者的網(wǎng)絡(luò)配置是否相同:

docker exec b0 ifconfig

docker exec b1 ifconfig

此時(shí)的網(wǎng)絡(luò)拓?fù)鋱D如下: 不再使用的容器記得刪除掉,釋放資源和空間

docker rm -f b0 b1

nginx 鏡像自帶的網(wǎng)絡(luò)命令非常少,查看網(wǎng)絡(luò)不方便,而 busybox 的網(wǎng)絡(luò)命令比較齊全,使用 container 模式,可以快速解決這個(gè)問題。我們新運(yùn)行一個(gè)名為 n0 的 nginx 容器,再將它的網(wǎng)絡(luò)共享給 busybox 容器 n0-net:

docker run -d -t --name n0 nginx

docker run -d -t --network container:n0 --name n0-net busybox

使用 n0-net 容器,執(zhí)行 docker exec n0-net ip a 進(jìn)行網(wǎng)絡(luò)狀態(tài)查看自身網(wǎng)絡(luò)信息,也就是 nginx 的網(wǎng)絡(luò)信息:

執(zhí)行如下命令,通過 localhost 訪問 n0 的 web 服務(wù),說明通過 container 模式下,共享的網(wǎng)絡(luò)中的容器能夠使用 lo 訪問其他容器的服務(wù)。

docker exec n0-net telnet localhost 80 #不顯示

docker exec -it n0-net telnet localhost 80 #顯示信息

不再使用的容器記得刪除掉,釋放資源和空間:docker rm -f n0 n0-net

Docker數(shù)據(jù)管理-掛載目錄或文件

掛載宿主機(jī)目錄

我們可以將宿主機(jī)的目錄,掛載到容器內(nèi),容器與宿主機(jī)的目錄可以實(shí)時(shí)共享。在宿主機(jī)上執(zhí)行如下命令:

# 新建一個(gè)目錄

mkdir -p ~/mydir/tmp

# 在目錄中新建一個(gè)文件,填充內(nèi)容 hello docker

echo "hello docker" > ~/mydir/tmp/text.txt

然后新建一個(gè)容器 busybox,將 /mydir/tmp 目錄掛載到容器的 /tmp/ 目錄:

docker run -d -it --name busybox -v ~/mydir/tmp/:/tmp/ busybox

Tips:掛載宿主操作系統(tǒng)目錄的參數(shù)是 -v <宿主機(jī)目錄路徑>:<容器目錄路徑>。

確認(rèn)查看容器對(duì)應(yīng)的文件內(nèi)容:

docker exec -it busybox cat /tmp/test.txt

掛載宿主機(jī)文件

我們也可以將宿主機(jī)的文件掛載到容器內(nèi),實(shí)現(xiàn)文件的共享。新建一個(gè)容器 busybox1,將 /mydir/tmp/test.txt 文件掛載到容器的 /tmp/test.txt:

docker run -d -it --name busybox1 -v ~/mydir/tmp/test.txt:/tmp/test.txt busybox

確認(rèn)容器對(duì)應(yīng)的文件內(nèi)容:

docker exec -it busybox1 cat /tmp/test.txt

Tips:使用 docker rm -f busybox busybox1 移除不再使用的容器

Docker 數(shù)據(jù)管理 - 數(shù)據(jù)卷

我們知道,Docker 提供了兩類數(shù)據(jù)管理的方式:

掛載宿主機(jī)目錄或文件; 使用數(shù)據(jù)卷;

使用數(shù)據(jù)卷的好處就在于:我們不必自己維護(hù)一個(gè)外部路徑掛載和存儲(chǔ)的關(guān)系,借助Docker管理數(shù)據(jù),并且通過語義化數(shù)據(jù)卷命名,更加方便直觀地使用它來數(shù)據(jù)共享。

概念與特性

什么是數(shù)據(jù)卷 簡(jiǎn)單來說,數(shù)據(jù)卷是一個(gè)可供一個(gè)或多個(gè)容器使用的特殊目錄,用于持久化數(shù)據(jù)以及共享容器間的數(shù)據(jù),它以正常的文件或目錄的形式存在于宿主機(jī)上。 另外,其生命周期獨(dú)立于容器的生命周期,即當(dāng)你刪除容器時(shí),數(shù)據(jù)卷并不會(huì)被刪除

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

掛載數(shù)據(jù)卷 在使用數(shù)據(jù)卷進(jìn)行掛載時(shí),我們只需指定容器中被掛載的目錄即可,如:

docker run -d -it --name busybox -v mydata:/tmp busybox

常用數(shù)據(jù)卷 1,volume : Docker 管理宿主機(jī)文件系統(tǒng)的一部分,默認(rèn)位于 /var/lib/docker/volumes 目錄下,也是最常用的方式。

看上圖,所有的 Docker 容器數(shù)據(jù)都保存在 /var/lib/docker/volumes 目錄下。若容器運(yùn)行時(shí)未指定數(shù)據(jù)卷, Docker 創(chuàng)建容器時(shí)會(huì)使用默認(rèn)的匿名卷(名稱為一堆很長(zhǎng)的 ID)。

2,bind mount bind mount : 意為可以存儲(chǔ)在宿主機(jī)中的任意位置。需要注意的是,bind mount 在不同的宿主機(jī)系統(tǒng)時(shí)不可移植的,比如 Windows 和 Linux 的目錄結(jié)構(gòu)是不一樣的,bind mount 所指向的 host 目錄也不一樣。這也是為什么 bind mount 不能出現(xiàn)在 Dockerfile 中的原因所在,因?yàn)檫@Dockerfile 就不可移植了。

volume使用

創(chuàng)建一個(gè)數(shù)據(jù)卷

root@ubuntu:~# docker volume create vol-test

#查看數(shù)據(jù)卷名為vol-test的信息

root@ubuntu:~# docker volume ls

查看數(shù)據(jù)卷信息

root@ubuntu:~# docker volume inspect vol-test

共用數(shù)據(jù)卷

通過掛載相同的數(shù)據(jù)卷,讓多個(gè)容器能夠操作數(shù)據(jù)卷中的數(shù)據(jù),實(shí)現(xiàn)容器間的目錄共享。

數(shù)據(jù)卷的命名在 Docker 中是唯一的,讓多個(gè)容器掛載同一個(gè)數(shù)據(jù)卷, 只需要指定同一個(gè)數(shù)據(jù)卷名稱即可。

docker run -d -it --name busybox -v mydata:/tmp busybox

docker run -d -it --name busybox1 -v mydata:/tmp busybox

掛載數(shù)據(jù)卷時(shí),如果數(shù)據(jù)卷不存在,Docker 會(huì)自動(dòng)創(chuàng)建,如果同名數(shù)據(jù)卷已經(jīng)存在,則直接引用。

這里我們?cè)傺a(bǔ)充一些常用的數(shù)據(jù)卷操作:

# 刪除數(shù)據(jù)卷

docker volume rm mydata

# 手動(dòng)創(chuàng)建數(shù)據(jù)卷

docker volume create mydata

# 刪除那些沒有被容器引用的數(shù)據(jù)卷

docker volume prune

柚子快報(bào)邀請(qǐng)碼778899分享:eureka Docker學(xué)習(xí)

http://yzkb.51969.com/

文章鏈接

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19244513.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄