2020年最完整的Docker v19.x入門教程

Docker v19.x

logo

引言

非常感謝你能在閑暇之余點(diǎn)開了小編的文章,這篇文章是2020年較為全面的Docker19入門的一個(gè)教程,不過(guò)他更像一個(gè)Docker的手冊(cè),所以需要你來(lái)花費(fèi)較長(zhǎng)的時(shí)間來(lái)閱讀,你可以【收藏】或者【點(diǎn)贊】來(lái)記錄這篇文章到【你的喜歡】里,這樣方便你以后查閱這篇文章。有什么問(wèn)題可以評(píng)論留言,小編會(huì)在看到的第一時(shí)間給你回復(fù),方便的話點(diǎn)個(gè)【關(guān)注】鼓勵(lì)一下小編,小編還會(huì)繼續(xù)創(chuàng)作更多的有關(guān)IT方面的文章,謝謝。

環(huán)境

  • centos7
  • docker19.x

目錄

目錄

什么是Docker

簡(jiǎn)單來(lái)說(shuō)就是將應(yīng)用程序部署到獨(dú)立的容器,每個(gè)容器相當(dāng)于一個(gè)小的linux系統(tǒng)。通過(guò)將容器進(jìn)行打包成鏡像,放到將鏡像放到任何有Docker環(huán)境的系統(tǒng)上運(yùn)行。

使用Go語(yǔ)言開發(fā),基于Apache2.0開源協(xié)議。

Docker的優(yōu)勢(shì)

  • Docker提供簡(jiǎn)單的輕量的服務(wù)器部署。
  • 可以清楚的將開發(fā)人員與運(yùn)維人員的職責(zé)分離。
  • 快速的開發(fā)生命周期。
  • 面向服務(wù)的架構(gòu),每個(gè)服務(wù)相互隔離。

Docker應(yīng)用在哪里

  • 可以使用Docker容器開發(fā)后測(cè)試然后部署服務(wù)。
  • 創(chuàng)建相互隔離的運(yùn)行環(huán)境。
  • 搭建測(cè)試環(huán)境,例如集群測(cè)試。

Docker容器的能力

  • 文件系統(tǒng)的隔離
  • 進(jìn)程的隔離
  • 網(wǎng)絡(luò)的隔離
  • 硬件資源的隔離和分組

Docker的核心組成

  • Docker Client 客戶端
  • Docker Daemon 守護(hù)進(jìn)程
  • Docker Image 鏡像
  • Docker Container 容器
  • Docker Registry 倉(cāng)庫(kù)

Docker Client與Docker Daemon

Docker是C/S架構(gòu)的程序,其中Docker Client扮演的是客戶端,Docker Daemon扮演的是服務(wù)器端。

docker Client即可是在本機(jī)也可以在遠(yuǎn)程。

Docker Image

鏡像好比容器的源代碼,保存了容器啟動(dòng)的各種條件。

Docker將一些容器運(yùn)行的系統(tǒng)與應(yīng)用服務(wù)打包起來(lái),通過(guò)聯(lián)合加載的方式運(yùn)行,這個(gè)打包起來(lái)的文件就成為鏡像。

一個(gè)鏡像可以放到另一個(gè)鏡像的底部,最下面的鏡像被稱為基礎(chǔ)鏡像。

Docker Container

Docker的容器是Dacker的執(zhí)行單元。

如果說(shuō)鏡像是打包,那么容器就是運(yùn)行打包好的鏡像。

Docker Registry

Docker倉(cāng)庫(kù)是用來(lái)保存Docker鏡像的地方,分為:

  • 公有倉(cāng)庫(kù) Docker Hub
  • 私有倉(cāng)庫(kù)

Docker入門操作

查看Docker的版本

$ docker version
$ docker info

搜索鏡像

$ docker search <鏡像名>

下載鏡像

$ docker pull <用戶名>/<鏡像名>

啟動(dòng)容器

$ docker run <用戶名>/<鏡像名> [命令]
# 在啟動(dòng)的容器中安裝Ping
# docker run <用戶名>/<鏡像名> apt-get install -y ping

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

$ docker ps

提交容器

$ docker commit <ID> <新名字>

查看指定ID的容器信息

$ docker inspect <ID>

查看有所有鏡像

$ docker images

上傳鏡像到Docker Hub

先去https://hub.docker.com/官網(wǎng)申請(qǐng)一個(gè)docker hub 帳號(hào)

$ docker login # 登錄Docker Hub
$ docker images #查看本地鏡像
$ docker tag <鏡像名> <用戶名/鏡像名> #將鏡像轉(zhuǎn)讓我的賬號(hào)下
$ docker push <用戶名>/<鏡像名>

安裝Docker

ubuntu

第一步、檢查是否支持Docker

$ uname -a 
#檢查內(nèi)核版本,必須高于3.10
$ ls -l /sys/class/misc/device-mapper
#檢查存儲(chǔ)驅(qū)動(dòng)

第二步、安裝docker

$ wget -qO- https://get.docker.com/ | sh

Centos7

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
# 刪除所有的Docker
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
# 使用 Docker 倉(cāng)庫(kù)進(jìn)行安裝
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 如果提示您接受 GPG 密鑰,請(qǐng)選是。

配置國(guó)內(nèi)的鏡像源

mkdir -p /etc/docker/
echo '{"registry-mirrors":["http://hub-mirror.c.163.com","https://registry.docker-cn.com"]}' > /etc/docker/daemon.json
systemctl daemon-reload && systemctl restart docker

容器的基本操作

普通容器

啟動(dòng)容器

$ docker run [<用戶名>/]<鏡像名>[:tag] [命令]
# 在啟動(dòng)的容器中安裝Ping
# docker run <用戶名>/<鏡像名> apt-get install -y ping

啟動(dòng)交會(huì)容器

$ docker run [--name=<名稱>] -i -t <鏡像全名> /bin/bash
# -i 表示一直保持輸入
# -t 表示打開tty終端
# --name 自定義名稱

查看容器

$ docker ps [-a][-l]
# -a 查看所有的容器
# -l 查看最新的容器

查看指定ID的容器信息

$ docker inspect <ID>

啟動(dòng)/停止容器

$ docker [-i] start/stop <容器>
# -i表示持續(xù)輸入

刪除容器

$ docker rm <容器>

守護(hù)式容器

特點(diǎn)

  • 可以長(zhǎng)期運(yùn)行
  • 沒有交互會(huì)話
  • 非常適合運(yùn)行應(yīng)用服務(wù)

命令

方法一
$ docker run -i -t <鏡像> /bin/bash
# ctrl+p ctrl+q 退出bash,但沒關(guān)閉容器
$ docker attach <正在運(yùn)行容器>
# 重新進(jìn)入正在運(yùn)行的容器
方法二
$ docker run -d <鏡像> <命令>
# -d 后臺(tái)守護(hù)

查看容器日志

$ docker logs [-f][-t][--tail=n] 容器名
# -f 持續(xù)輸出日志
# -t 日志加上時(shí)間戳
# --tail 返回最后的多少行

查看運(yùn)行中的容器的進(jìn)程

$ docker top <容器>

在運(yùn)行的容器中啟動(dòng)新的進(jìn)程

$ docker exec [-d][-i][-t] <容器名> [命令]
# -d 后臺(tái)運(yùn)行
# -i 交會(huì)運(yùn)行
# -t 打開終端

停止容器

$ docker kill/stop <容器名>
# kill 直接停止
# stop 等待進(jìn)程結(jié)束后停止

設(shè)置端口映射

$ docker run [-P][-p <port> | <port>:<port>] ...
# -P 映射容器中所有的端口
# -p 指定映射容器中某幾個(gè)端口
# eg:
$ docker run -P -i -t ubuntu /bin/bash # 映射所有的端口
$ docker run -p 80 -i -t ubuntu /bin/bash # 映射80端口
$ docker run -p 8080:80 -i -t ubuntu /bin/bash # 將內(nèi)部的80映射為8080
$ docker run -p 127.0.0.1:8080:80 -i -t ubuntu /bin/bash # 將內(nèi)部的80端口映射為127.0.0.1:8080
# 注意:如果使用5、6行的方法進(jìn)行映射,外部端口是隨機(jī)分配的

管理鏡像

概念

  • TAG:標(biāo)簽
    • 默認(rèn):latest
    • 這里多少為版本
    • eg:docker pull node:12.1.1 下載nodejs12.1.1版本

基本操作

顯示所有的鏡像

$ docker images [-q][-a] [倉(cāng)庫(kù)]
# -q 只看id
# -a 查看所有

查看鏡像的詳細(xì)

$ docker inspace <鏡像名>

刪除鏡像

$ docker rmi [-f] <鏡像名>
# -f 強(qiáng)制刪除

查找鏡像

方法1:鏡像dockerhub上查找

方法2:

$ docker search [--automated][-no-trunc][-s <num>] <鏡像名>
# --automated 只顯示自動(dòng)化選項(xiàng) 
# --no-trunc 不分頁(yè)顯示
# -s 顯示的最低num的stat鏡像

下載鏡像

$ docker pull [-a] <鏡像名>
# -a 下載匹配的所有鏡像

標(biāo)記鏡像到某個(gè)倉(cāng)庫(kù)

$ docker tag  IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

上傳鏡像到DockerHub

$ docker images #查看本地鏡像
$ docker tag <鏡像名> <用戶名/鏡像名> #將鏡像轉(zhuǎn)讓我的賬號(hào)下
$ docker push <用戶名/鏡像名:Tag> #上傳鏡像

打包鏡像

打包鏡像有兩種方法,推薦使用Dockerfie方法

使用commit打包

將部署好的容器進(jìn)行打包。

$ docker commit [-a][-m][-p] <容器> <用戶名/鏡像名:版本>
# -a "" 鏡像作者
# -m "" 打包備注
# -p 不停止鏡像打包

使用Dockerfile文件打包

第一步:創(chuàng)建Dockerfile文件

#Dockerfile
FORM <基礎(chǔ)鏡像:Tag>
MAINTAINER <用戶名> "聯(lián)系方式" #新版本推薦使用 LABEL maintainer=value
RUN <linux命令>
...
EXPOSE <端口號(hào)>

說(shuō)明:

這個(gè)EXPOSE指令實(shí)際上并不發(fā)布端口。它作為構(gòu)建映像的人和運(yùn)行容器的人之間的一種文檔類型,而這些港口將被發(fā)布。若要在運(yùn)行容器時(shí)實(shí)際發(fā)布端口,請(qǐng)使用-p旗上docker run若要發(fā)布和映射一個(gè)或多個(gè)端口,或-P標(biāo)志以發(fā)布所有公開的端口,并將它們映射到高階端口。

第二步:執(zhí)行docker build命令

$ docker build [-t <鏡像名>][--no-cache] <上下文路徑>
# -t 鏡像名稱
# --no-cache 不使用緩存構(gòu)建
# 上下文路徑:
#   docker build 會(huì)將這個(gè)路徑下所有的文件都打包上傳給 Docker 引擎,
#   引擎內(nèi)將這些內(nèi)容展開后,就能獲取到所有指定上下文中的文件了

注意不要將 / 作為<上下文路徑>,因?yàn)樗麜?huì)把硬盤上所有的數(shù)據(jù)發(fā)給docker守護(hù)進(jìn)程.

.dockerignore

創(chuàng)建.dockerignore文件,通過(guò)在該文件里添加匹配目錄,可以在執(zhí)行docker build -t xxx .命令時(shí)不上傳匹配的目錄。

#.dockerignore
*/temp* #匹配根目錄下的子目錄內(nèi)所有的以temp開頭的文件和文件夾
*/*/temp* #匹配根目錄下的子目錄的子目錄內(nèi)所有的以temp開頭的文件和文件夾
**/temp* #匹配所有目錄內(nèi)的以temp開頭的文件和文件夾
!my* #在排除文件及文件夾中允許上傳my開頭的文件及文件夾

Docker遠(yuǎn)程訪問(wèn)

Docker的配置文件在Centos7 /lib/systemd/system/docker.service

Docker守護(hù)進(jìn)程Linux上配置文件的默認(rèn)位置是/etc/docker/daemon.json或者通過(guò)--config-file參數(shù)可用于指定非默認(rèn)位置。

Docker守護(hù)進(jìn)程啟動(dòng)選項(xiàng)

  • -H unix:///var/run/docker.sock
  • -H tcp://host:port
  • -H fd://(默認(rèn))

配置開始

第一步:配置遠(yuǎn)程的Docker

vi /lib/systemd/system/docker.service

修改[Service]->ExecStart

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H 0.0.0.0:2375

重啟Docker

systemctl daemon-reload && systemctl restart docker

第二步:配置本地的系統(tǒng)環(huán)境變量

# windows
set DOCKER_HOST=tcp://遠(yuǎn)程ip

# Centos7
export DOCKER_HOST=tcp://遠(yuǎn)程ip

# 注意:以上配置都是臨時(shí)的

測(cè)試

docker info
# 是否有結(jié)果
# 如果想更準(zhǔn)確的測(cè)試,可以先將遠(yuǎn)程的Docker守護(hù)進(jìn)程配置一個(gè)labels,然后執(zhí)行命令即可

提示:

其實(shí)配置遠(yuǎn)程還有一種方法就是配置docker守護(hù)進(jìn)程的配置文件daemon.json通過(guò)配置該文件下的hosts內(nèi)的值也可以實(shí)現(xiàn),需要注意的是這兩種方法只需要使用其中一種即可。

# docker.service 
# [Service]->ExecStart
ExecStart=/usr/bin/dockerd  --containerd=/run/containerd/containerd.sock

# daemon.json
{
  "hosts":[
    "0.0.0.0:2375",
    "unix:///var/run/docker.sock"
  ]
}

Dockerfile指令

關(guān)鍵知識(shí)點(diǎn)

  • 上下文路徑:

    上下文路徑 是在使用docker build的時(shí)候最后一個(gè)參數(shù)鎖指定的路徑,通過(guò)該路徑docker客戶端會(huì)將該路徑的下的所有文件都會(huì)發(fā)送給docker守護(hù)進(jìn)程,然后在用戶執(zhí)行COPYADD的時(shí)候進(jìn)行文件復(fù)制。如果有不想發(fā)送的文件可以向.dockerignore中寫入匹配忽略路徑。

  • RUN的執(zhí)行過(guò)程

    RUN cd /app
    RUN echo "hello" > world.txt
    

    每一個(gè) RUN 都是啟動(dòng)一個(gè)容器、執(zhí)行命令、然后提交存儲(chǔ)層文件變更。第一層 RUN cd /app 的執(zhí)行僅僅是當(dāng)前進(jìn)程的工作目錄變更,一個(gè)內(nèi)存上的變化而已,其結(jié)果不會(huì)造成任何文件變更。而到第二層的時(shí)候,啟動(dòng)的是一個(gè)全新的容器,跟第一層的容器更完全沒關(guān)系,自然不可能繼承前一層構(gòu)建過(guò)程中的內(nèi)存變化。

FORM

這個(gè)FROM指令初始化新構(gòu)建階段,并設(shè)置基礎(chǔ)鏡像以后的指令。因此Dockerfile必須有FROM指令。Image可以是任何有效的Image它特別容易從公共儲(chǔ)存庫(kù)下載。

FROM [--platform=<平臺(tái)>] <image>[:<tag>] [AS <name>]
# --platform 指定平臺(tái) 如,linux/amd64, linux/arm64,或windows/amd64;默認(rèn)自動(dòng)
# image 鏡像名稱
# tag 類似于版本
# As 起別名

ARG

ARG是在當(dāng)前文件中設(shè)置變量,通過(guò)ARG定義變量可以在該文件內(nèi)引用。

ARG VERSION=latest
FROM busybox:${VERSION} # FORM busybox:latest

LABEL

LABEL指令將元數(shù)據(jù)添加到Image中。一個(gè)LABEL是鍵值對(duì)。若要在LABEL值內(nèi)使用引號(hào)和反斜杠,就像在命令行解析中一樣。

LABEL <key>=<value> <key>=<value> <key>=<value> ...

例子:

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
      that label-values can span multiple lines."

EXPOST

EXPOSE指令通知Docker容器在運(yùn)行時(shí)偵聽指定的網(wǎng)絡(luò)端口。您可以指定端口是否偵聽TCP或UDP,如果未指定協(xié)議,則默認(rèn)為TCP。

實(shí)際上他并無(wú)卵用。這里指定的端口僅僅只是作為文檔給其他的人看。

EXPOSE <port> [<port>/<protocol>...]
# port 端口號(hào)
# protocol 協(xié)議 tcp或udp

ENV

設(shè)置環(huán)境變量,該環(huán)境變量類似于linux中export的設(shè)置方法,區(qū)別在于他是永久的,所以他可以在后續(xù)的shell命令里使用該值。

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

例子:

ENV HI HELLO
RUN echo "${HI}" # Hello

COPY

復(fù)制指令,從上下文目錄中復(fù)制文件或者目錄到容器里指定路徑。

COPY [--chown=<user>:<group>] <源路徑1>...  <目標(biāo)路徑>
COPY [--chown=<user>:<group>] ["<源路徑1>",...  "<目標(biāo)路徑>"]
# [--chown=<user>:<group>] 用戶改變復(fù)制到容器內(nèi)文件的擁有者和屬組。
# <源路徑> 源文件或者源目錄,這里可以是通配符表達(dá)式,其通配符規(guī)則要滿足 Go 的 filepath.Match 規(guī)則

ADD

ADD 指令和 COPY 的使用格式一致(同樣需求下,官方推薦使用 COPY)。功能也類似,不同之處如下:

  • ADD 的優(yōu)點(diǎn):在執(zhí)行 <源文件> 為 tar 壓縮文件的話,壓縮格式為 gzip, bzip2 以及 xz 的情況下,會(huì)自動(dòng)復(fù)制并解壓到 <目標(biāo)路徑>。
  • ADD 的缺點(diǎn):在不解壓的前提下,無(wú)法復(fù)制 tar 壓縮文件。會(huì)令鏡像構(gòu)建緩存失效,從而可能會(huì)令鏡像構(gòu)建變得比較緩慢。具體是否使用,可以根據(jù)是否需要自動(dòng)解壓來(lái)決定。

RUN

執(zhí)行shell命令

CMD <shell 命令> 
CMD ["<可執(zhí)行文件或命令>","<param1>","<param2>",...] 

CMD

類似于 RUN 指令,用于運(yùn)行程序,但二者運(yùn)行的時(shí)間點(diǎn)不同:

  • CMD 在docker run 時(shí)運(yùn)行。
  • RUN 是在 docker build。

作用:為啟動(dòng)的容器指定默認(rèn)要運(yùn)行的程序,程序運(yùn)行結(jié)束,容器也就結(jié)束。CMD 指令指定的程序可被 docker run 命令行參數(shù)中指定要運(yùn)行的程序所覆蓋。

注意:如果 Dockerfile 中如果存在多個(gè) CMD 指令,僅最后一個(gè)生效。

CMD <shell 命令> 
CMD ["<可執(zhí)行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 該寫法是為 ENTRYPOINT 指令指定的程序提供默認(rèn)參數(shù)

ENTRYPOINT

類似于 CMD 指令,但其不會(huì)被 docker run 的命令行參數(shù)指定的指令所覆蓋,而且這些命令行參數(shù)會(huì)被當(dāng)作參數(shù)送給 ENTRYPOINT 指令指定的程序。

但是, 如果運(yùn)行 docker run 時(shí)使用了 --entrypoint 選項(xiàng),此選項(xiàng)的參數(shù)可當(dāng)作要運(yùn)行的程序覆蓋 ENTRYPOINT 指令指定的程序。

優(yōu)點(diǎn):在執(zhí)行 docker run 的時(shí)候可以指定 ENTRYPOINT 運(yùn)行所需的參數(shù)。

注意:如果 Dockerfile 中如果存在多個(gè) ENTRYPOINT 指令,僅最后一個(gè)生效。

可以搭配 CMD 命令使用:一般是變參才會(huì)使用 CMD ,這里的 CMD 等于是在給 ENTRYPOINT 傳參,以下示例會(huì)提到。

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

WORKDIR

指定工作目錄。用 WORKDIR 指定的工作目錄,會(huì)在構(gòu)建鏡像的每一層中都存在。(WORKDIR 指定的工作目錄,必須是提前創(chuàng)建好的)。

docker build 構(gòu)建鏡像過(guò)程中的,每一個(gè) RUN 命令都是新建的一層。只有通過(guò) WORKDIR 創(chuàng)建的目錄才會(huì)一直存在。

WORKDIR <工作目錄路徑>

USER

用于指定執(zhí)行后續(xù)命令的用戶和用戶組,這邊只是切換后續(xù)命令執(zhí)行的用戶(用戶和用戶組必須提前已經(jīng)存在)。

USER <用戶名>[:<用戶組>]

HEALTHCHECK

用于指定某個(gè)程序或者指令來(lái)監(jiān)控 docker 容器服務(wù)的運(yùn)行狀態(tài)。

HEALTHCHECK [選項(xiàng)] CMD <命令> #設(shè)置檢查容器健康狀況的命令
# HEALTHCHECK NONE:如果基礎(chǔ)鏡像有健康檢查指令,使用這行可以屏蔽掉其健康檢查指令

HEALTHCHECK [選項(xiàng)] CMD <命令> # CMD 后面跟隨的命令使用,可以參考 CMD 的用法。

ONBUILD

他不會(huì)在本次docker build的時(shí)候執(zhí)行,會(huì)在子鏡像構(gòu)建的時(shí)候執(zhí)行后面的<Dockerfile指令>。

ONBUILD <Dockerfile指令>

MAINTAINER (官方不推薦)

這個(gè)是將該鏡像的維護(hù)人的信息寫到鏡像中,這是一個(gè)舊版的寫法。

MAINTAINER <name> 

# 代替方案
LABEL maintainer=<name>

SHELL

通過(guò)該指令可以指定使用的shell解釋器。

SHELL ["<Shell解釋器>", "<默認(rèn)參數(shù)>"]

VOLUME

定義匿名數(shù)據(jù)卷。在啟動(dòng)容器時(shí)忘記掛載數(shù)據(jù)卷,會(huì)自動(dòng)掛載到匿名卷。

在啟動(dòng)容器 docker run 的時(shí)候,我們可以通過(guò) -v 參數(shù)修改掛載點(diǎn)。

作用:

  • 避免重要的數(shù)據(jù),因容器重啟而丟失,這是非常致命的。
  • 避免容器不斷變大。
VOLUME ["<路徑1>", "<路徑2>"...]
VOLUME <路徑>

Dockerfile的構(gòu)建原理

docker會(huì)在執(zhí)行每條Dockerfile的指令時(shí)會(huì)對(duì)FROM引入的基礎(chǔ)鏡像進(jìn)行操作。

每操作一步會(huì)運(yùn)行鏡像->生成容器->修改容器->提交容器->生成新的鏡像->刪除容器,然后在新的鏡像上繼續(xù)修改提交,反復(fù)如此,最后生成出最終鏡像。這些在中間生成的鏡像被稱為中間層鏡像。

我們可以通過(guò)docker history <鏡像名>來(lái)看生成鏡像的過(guò)程。

Dockerfile源文件和上下文目錄

2020/01/18  11:34                17 .dockerignore
2020/01/18  14:52               277 Dockerfile
2020/01/18  14:45    <DIR>          src
# 生成一個(gè)node的docker環(huán)境
FROM centos
LABEL maintainer="wm 15804854160@163.com"
RUN curl --silent --location https://rpm.nodesource.com/setup_12.x | bash - \
 && yum -y install nodejs
WORKDIR /root/project
COPY ./ ./
RUN cd src \
 && npm install
EXPOSE 8080:80

構(gòu)建過(guò)程

E:\PJ\程序設(shè)計(jì)\docker容器技術(shù)\dome\nodejsDockerfile>docker build -t demo .
Sending build context to Docker daemon  22.02kB
Step 1/7 : FROM centos
 ---> 470671670cac
Step 2/7 : LABEL maintainer="wm 15804854160@163.com" #修改鏡像
 ---> Running in 0a9bdf29772d #運(yùn)行0a9bdf29772d容器
Removing intermediate container 0a9bdf29772d #刪除0a9bdf29772d容器
 ---> 6bed20c22168 #生成新的鏡像
Step 3/7 : RUN curl --silent --location https://rpm.nodesource.com/setup_12.x | bash -  && yum -y install nodejs
 ---> Running in a6f52a14bfbc

## Installing the NodeSource Node.js 12.x repo...


## Inspecting system...

+ rpm -q --whatprovides redhat-release || rpm -q --whatprovides centos-release || rpm -q --whatprovides cloudlinux-release || rpm -q --whatprovides sl-release
+ uname -m

## Confirming "el8-x86_64" is supported...

+ curl -sLf -o /dev/null 'https://rpm.nodesource.com/pub_12.x/el/8/x86_64/nodesource-release-el8-1.noarch.rpm'

## As yum will try to install Node.js from the AppStream repository
instead of the NodeSource repository, the AppStream's version of Node.js has to be disabled.
## Run `sudo yum module enable -y nodejs` to reactivate the AppStream's Node.js repository.

+ yum module disable -y nodejs
CentOS-8 - AppStream                            1.3 MB/s | 5.9 MB     00:04
CentOS-8 - Base                                 190 kB/s | 4.0 MB     00:21
CentOS-8 - Extras                               367  B/s | 2.1 kB     00:05
Dependencies resolved.
================================================================================
 Package           Architecture     Version             Repository         Size
================================================================================
Disabling modules:
 nodejs

Transaction Summary
================================================================================

Complete!

## Downloading release setup RPM...

+ mktemp
+ curl -sL -o '/tmp/tmp.w4Aojk1oBL' 'https://rpm.nodesource.com/pub_12.x/el/8/x86_64/nodesource-release-el8-1.noarch.rpm'

## Installing release setup RPM...

+ rpm -i --nosignature --force '/tmp/tmp.w4Aojk1oBL'

## Cleaning up...

+ rm -f '/tmp/tmp.w4Aojk1oBL'

## Checking for existing installations...

+ rpm -qa 'node|npm' | grep -v nodesource

## Run `sudo yum install -y nodejs` to install Node.js 12.x and npm.
## You may also need development tools to build native addons:
     sudo yum install gcc-c++ make
## To install the Yarn package manager, run:
     curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
     sudo yum install yarn

Node.js Packages for Enterprise Linux 8 - x86_6  37 kB/s |  94 kB     00:02
Last metadata expiration check: 0:00:01 ago on Sun Jan 19 08:42:03 2020.
Dependencies resolved.
================================================================================
 Package          Arch   Version                               Repository  Size
================================================================================
Installing:
 nodejs           x86_64 2:12.14.1-1nodesource                 nodesource  22 M
Installing dependencies:
 python2          x86_64 2.7.16-12.module_el8.1.0+219+cf9e6ac9 AppStream  109 k
 python2-libs     x86_64 2.7.16-12.module_el8.1.0+219+cf9e6ac9 AppStream  6.0 M
 python2-pip-wheel
                  noarch 9.0.3-14.module_el8.1.0+219+cf9e6ac9  AppStream  1.2 M
 python2-setuptools-wheel
                  noarch 39.0.1-11.module_el8.1.0+219+cf9e6ac9 AppStream  289 k
Installing weak dependencies:
 python2-pip      noarch 9.0.3-14.module_el8.1.0+219+cf9e6ac9  AppStream  2.0 M
 python2-setuptools
                  noarch 39.0.1-11.module_el8.1.0+219+cf9e6ac9 AppStream  643 k
Enabling module streams:
 python27                2.7

Transaction Summary
================================================================================
Install  7 Packages

Total download size: 32 M
Installed size: 104 M
Downloading Packages:
(1/7): python2-2.7.16-12.module_el8.1.0+219+cf9 165 kB/s | 109 kB     00:00
(2/7): python2-pip-9.0.3-14.module_el8.1.0+219+ 571 kB/s | 2.0 MB     00:03
(3/7): python2-pip-wheel-9.0.3-14.module_el8.1. 409 kB/s | 1.2 MB     00:02
(4/7): python2-libs-2.7.16-12.module_el8.1.0+21 1.5 MB/s | 6.0 MB     00:03
(5/7): python2-setuptools-39.0.1-11.module_el8. 1.7 MB/s | 643 kB     00:00
(6/7): python2-setuptools-wheel-39.0.1-11.modul 805 kB/s | 289 kB     00:00
(7/7): nodejs-12.14.1-1nodesource.x86_64.rpm    1.7 MB/s |  22 MB     00:12
--------------------------------------------------------------------------------
Total                                           1.8 MB/s |  32 MB     00:17
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/python2-2.7.16-12.module_el8.1.0+219+cf9e6ac9.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - AppStream                            1.6 MB/s | 1.6 kB     00:00
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key) <security@centos.org>"
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
warning: /var/cache/dnf/nodesource-c1a37d2599ffab0c/packages/nodejs-12.14.1-1nodesource.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 34fa74dd: NOKEY
Node.js Packages for Enterprise Linux 8 - x86_6 1.6 MB/s | 1.6 kB     00:00
Importing GPG key 0x34FA74DD:
 Userid     : "NodeSource <gpg-rpm@nodesource.com>"
 Fingerprint: 2E55 207A 95D9 944B 0CC9 3261 5DDB E8D4 34FA 74DD
 From       : /etc/pki/rpm-gpg/NODESOURCE-GPG-SIGNING-KEY-EL
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : python2-setuptools-wheel-39.0.1-11.module_el8.1.0+21   1/7
  Installing       : python2-pip-wheel-9.0.3-14.module_el8.1.0+219+cf9e6a   2/7
  Installing       : python2-libs-2.7.16-12.module_el8.1.0+219+cf9e6ac9.x   3/7
  Installing       : python2-pip-9.0.3-14.module_el8.1.0+219+cf9e6ac9.noa   4/7
  Installing       : python2-setuptools-39.0.1-11.module_el8.1.0+219+cf9e   5/7
  Installing       : python2-2.7.16-12.module_el8.1.0+219+cf9e6ac9.x86_64   6/7
  Running scriptlet: python2-2.7.16-12.module_el8.1.0+219+cf9e6ac9.x86_64   6/7
  Running scriptlet: nodejs-2:12.14.1-1nodesource.x86_64                    7/7
  Installing       : nodejs-2:12.14.1-1nodesource.x86_64                    7/7
  Running scriptlet: nodejs-2:12.14.1-1nodesource.x86_64                    7/7
  Verifying        : python2-2.7.16-12.module_el8.1.0+219+cf9e6ac9.x86_64   1/7
  Verifying        : python2-libs-2.7.16-12.module_el8.1.0+219+cf9e6ac9.x   2/7
  Verifying        : python2-pip-9.0.3-14.module_el8.1.0+219+cf9e6ac9.noa   3/7
  Verifying        : python2-pip-wheel-9.0.3-14.module_el8.1.0+219+cf9e6a   4/7
  Verifying        : python2-setuptools-39.0.1-11.module_el8.1.0+219+cf9e   5/7
  Verifying        : python2-setuptools-wheel-39.0.1-11.module_el8.1.0+21   6/7
  Verifying        : nodejs-2:12.14.1-1nodesource.x86_64                    7/7

Installed:
  nodejs-2:12.14.1-1nodesource.x86_64
  python2-pip-9.0.3-14.module_el8.1.0+219+cf9e6ac9.noarch
  python2-setuptools-39.0.1-11.module_el8.1.0+219+cf9e6ac9.noarch
  python2-2.7.16-12.module_el8.1.0+219+cf9e6ac9.x86_64
  python2-libs-2.7.16-12.module_el8.1.0+219+cf9e6ac9.x86_64
  python2-pip-wheel-9.0.3-14.module_el8.1.0+219+cf9e6ac9.noarch
  python2-setuptools-wheel-39.0.1-11.module_el8.1.0+219+cf9e6ac9.noarch

Complete!
Removing intermediate container a6f52a14bfbc
 ---> 29a93e78f5e2
Step 4/7 : WORKDIR /root/project
 ---> Running in fe701814cbe8
Removing intermediate container fe701814cbe8
 ---> eda559d13b87
Step 5/7 : COPY ./ ./
 ---> da28659ab618
Step 6/7 : RUN cd src  && npm install
 ---> Running in e96081f27d89
npm WARN src@1.0.0 No description
npm WARN src@1.0.0 No repository field.

added 50 packages from 37 contributors and audited 126 packages in 169.473s
found 0 vulnerabilities

Removing intermediate container e96081f27d89
 ---> da2897f4c613
Step 7/7 : EXPOSE 8080:80
 ---> Running in db58b4e3fe1f
Removing intermediate container db58b4e3fe1f
 ---> 1447d55955ca
Successfully built 1447d55955ca
Successfully tagged demo:latest

用命令查看構(gòu)建過(guò)程和中間層鏡像

E:\PJ\程序設(shè)計(jì)\docker容器技術(shù)\dome\nodejsDockerfile>docker history demo
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
1447d55955ca        13 minutes ago      /bin/sh -c #(nop)  EXPOSE 8080:80               0B
da2897f4c613        13 minutes ago      /bin/sh -c cd src  && npm install               2.31MB
da28659ab618        16 minutes ago      /bin/sh -c #(nop) COPY dir:51e2c52b32624331c…   15.4kB
eda559d13b87        16 minutes ago      /bin/sh -c #(nop) WORKDIR /root/project         0B
29a93e78f5e2        16 minutes ago      /bin/sh -c curl --silent --location https://…   144MB
6bed20c22168        17 minutes ago      /bin/sh -c #(nop)  LABEL maintainer=wm 15804…   0B
470671670cac        33 hours ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           33 hours ago        /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>           4 days ago          /bin/sh -c #(nop) ADD file:aa54047c80ba30064…   237MB

Docker容器網(wǎng)絡(luò)基礎(chǔ)

工具安裝

$ yum install -y bridge-utils # 網(wǎng)橋管理工具
$ yum install -y net-tools # 安裝ifconfig,自行查看自己的linux不是必須的

網(wǎng)橋管理

網(wǎng)橋相當(dāng)于網(wǎng)絡(luò)中的交換機(jī)(不完全正確,但是可以這么想)。

$ brctl addbr br0 # 新建br0網(wǎng)橋
$ brctl addif br0 eth0 # 讓eth0 成為 br0 的一個(gè) interface

ifconfig命令

ifconfig工具不僅可以被用來(lái)簡(jiǎn)單地獲取網(wǎng)絡(luò)接口配置信息,還可以修改這些配置。用ifconfig命令配置的網(wǎng)卡信息,在網(wǎng)卡重啟后機(jī)器重啟后,配置就不存在。要想將上述的配置信息永遠(yuǎn)的存的電腦里,那就要修改網(wǎng)卡的配置文件了。

$ ifconfig # 查看網(wǎng)卡狀態(tài)
$ ifconfig eth0 {up|down} # 啟動(dòng)或關(guān)閉eth0網(wǎng)卡
$ ifconfig eth0 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255 # 配置eth0的Ip地址,子網(wǎng)地址,廣播地址

配置Docker的網(wǎng)橋

$ brctl addbr br0 # 新建br0網(wǎng)橋
$ ifconfig br0 192.168.1.100 netmask 255.255.255.0 # 配置br0的Ip地址,子網(wǎng)地址
$ vi /lib/systemd/system/docker.service 
# 添加docker守護(hù)進(jìn)程的啟動(dòng)參數(shù) -b=br0
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -b=br0

$ systemctl daemon-reload && systemctl restart docker

Docker容器間的通信

默認(rèn)啟動(dòng)參數(shù)的—icc=true,所以docker容器間是允許通信的的。

$ docker run -it --link <運(yùn)行中容器名>:<標(biāo)識(shí)名> <鏡像名>
# 運(yùn)行中的容器名 必須是運(yùn)行中的容器
# 標(biāo)識(shí)名 是在該容器中調(diào)用的名稱,他類型于localhost

指定容器間通信

首先配置docker守護(hù)進(jìn)程的啟動(dòng)參數(shù)

$ vi /lib/systemd/system/docker.service 
# 添加docker守護(hù)進(jìn)程的啟動(dòng)參數(shù) ---icc=false --iptables=true
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --icc=false --iptables=true
# --iptables=true 將策略寫入宿主機(jī)iptables進(jìn)行隔離控制

然后使用 --link參數(shù)啟動(dòng)

$ docker run -it --link <運(yùn)行中容器名>:<標(biāo)識(shí)名> <鏡像名>
# 運(yùn)行中的容器名 必須是運(yùn)行中的容器
# 標(biāo)識(shí)名 是在該容器中調(diào)用的名稱,他類型于localhost

現(xiàn)在該容器就與<運(yùn)行中容器名>是連通的。

Docker容器的數(shù)據(jù)卷(Data Volume)

數(shù)據(jù)卷是一個(gè)特殊的目錄,他可以繞開聯(lián)合文件系統(tǒng),為多個(gè)docker容器提供訪問(wèn)。

作用

  • 存儲(chǔ)永久的數(shù)據(jù)
  • 共享給多個(gè)docker的訪問(wèn)空間

特點(diǎn)

  • 數(shù)據(jù)卷可以在容器直接共享
  • 宿主機(jī)可以直接操作數(shù)據(jù)卷里的數(shù)據(jù)
  • 數(shù)據(jù)卷的變化不會(huì)影響鏡像
  • 數(shù)據(jù)卷一直存在,即使掛載(加載)數(shù)據(jù)卷的容器壞掉,也不會(huì)影響數(shù)據(jù)卷

掛載方式

  • volumes:Docker管理宿主機(jī)文件系統(tǒng)的一部分,默認(rèn)位于 /var/lib/docker/volumes 目錄
  • bind mounts:意為著可以存儲(chǔ)在宿主機(jī)系統(tǒng)的任意位置
  • tmpfs:掛載存儲(chǔ)在宿主機(jī)系統(tǒng)的內(nèi)存中,而不會(huì)寫入宿主機(jī)的文件系統(tǒng)(不常用)

數(shù)據(jù)卷的操作

docker volume COMMAND

COMMAND:
  create <數(shù)據(jù)卷名>    創(chuàng)建數(shù)據(jù)卷
  inspect <數(shù)據(jù)卷名>   顯示一個(gè)或多個(gè)卷上的詳細(xì)信息
  ls                  列出所有的數(shù)據(jù)卷 包括臨時(shí)的
  prune               刪除沒有用的數(shù)據(jù)卷
  rm <數(shù)據(jù)卷名>        刪除數(shù)據(jù)卷

基礎(chǔ)使用

命令方式掛載數(shù)據(jù)卷

docker run -it -v <宿主機(jī)路徑|數(shù)據(jù)卷名>:<容器內(nèi)的路徑>[:ro] <image>
# -v 掛載數(shù)據(jù)卷
# ro 只讀權(quán)限

Dockerfile掛載

FROM centos
VOLUME [ "/data" ]
# 這里的/data是容器內(nèi)的路徑
# 因?yàn)闆]有指定宿主機(jī)的位置所以他默認(rèn)掛載到 
# /var/lib/docker/volumes/xxx/_data
# xxx 是哈希值

共享其他容器的數(shù)據(jù)卷

docker run -it --volumes-from <容器名稱> <image> # 創(chuàng)建容器并且其他容器的數(shù)據(jù)卷

注意:在不指定宿主機(jī)路徑時(shí)創(chuàng)建的數(shù)據(jù)卷容器會(huì)在刪除引用他的容器后系統(tǒng)會(huì)自動(dòng)刪除這個(gè)臨時(shí)的數(shù)據(jù)卷

Docker跨主機(jī)連接

Weave通過(guò)創(chuàng)建虛擬網(wǎng)絡(luò)使docker容器能夠跨主機(jī)通信并能夠自動(dòng)相互發(fā)現(xiàn)。

第一步:安裝weave

curl -L git.io/weave -o /usr/local/bin/weave  #下載
chmod a+x /usr/local/bin/weave  #賦予執(zhí)行權(quán)限

第二步:?jiǎn)?dòng)weave

host1(master):

IP:10.130.0.1/8

weave launch
# 啟動(dòng)weave
eval $(weave env)
# 進(jìn)入weave環(huán)境
# 關(guān)閉weave需要執(zhí)行下面這條
# eval $(weave env --restore) && weave stop
docker run --name masterhost -it centos
# 啟動(dòng)一個(gè)容器名為masterhost

host2:

IP:10.130.0.2/8

weave launch 10.130.0.1
# 啟動(dòng)weave,并連接到host1
eval $(weave env)
# 進(jìn)入weave環(huán)境
# 關(guān)閉weave需要執(zhí)行下面這條
# eval $(weave env --restore) && weave stop
docker run --name node1host -it centos
# 啟動(dòng)一個(gè)容器名為 node1host

第三步:測(cè)試

host1(master)->root@masterhost:

ping node1host
# 通過(guò)√

host2->root@node1host:

ping masterhost
# 通過(guò)√

注意事項(xiàng)

如果有防火墻$HOST1$HOST2,您必須允許流量通過(guò)TCP 6783和UDP 6783/6784,這是WARW的控制和數(shù)據(jù)端口。

如果想更深入的了解weave,小編推薦大家一篇文章docker: weave 分析和實(shí)戰(zhàn)這位大神寫的文章。

最后

docker的知識(shí)點(diǎn),差不多就是這么多,對(duì)于開發(fā)崗來(lái)說(shuō)這些就差不多了,如果有運(yùn)維的朋友,你還得需要去看官方的知識(shí),來(lái)學(xué)習(xí)更多的docker知識(shí)。

差不多就這樣吧,再次感謝各位花時(shí)間可以看鄙人的文章,正好快過(guò)年了,提前祝大家新年快樂(lè)。如果可以的話可以【點(diǎn)贊】【收藏】【轉(zhuǎn)發(fā)】三連一波,鼓勵(lì)一下。

如需轉(zhuǎn)載請(qǐng)說(shuō)明出處,謝謝

byby

精彩文章

VM15安裝黑蘋果10.14.5

Hello,大家好,今天又是一個(gè)陽(yáng)光明媚的上午。今天給大家安利一個(gè)硬核教程,在VM15上安裝黑蘋果10.14.5 mojave。廢話不多說(shuō)咱們開...

GraphQL下一代API標(biāo)準(zhǔn)

GrapthQL介紹 GraphQL是Facebook開發(fā)的一種數(shù)據(jù)查詢語(yǔ)言,于2015年發(fā)布。 GraphQL是RESTful的升級(jí)版 Gra...

DDNS For NodeJs

DDNS For NodeJs GIT倉(cāng)庫(kù) 引言 DDNS For NodeJs 是使用nodejs實(shí)現(xiàn)的DDNS的工具,通過(guò)騰訊云API實(shí)現(xiàn)的...

InterfaceMapping內(nèi)網(wǎng)穿透框架(nodejs)

GIT倉(cāng)庫(kù) 項(xiàng)目介紹 基于SocketIo和express的nodejs框架,實(shí)現(xiàn)api接口的映射,主要用于通過(guò)公網(wǎng)服務(wù)器訪問(wèn)內(nèi)網(wǎng)資源。 類似于...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 0. 前言 docker是什么?docker是用GO語(yǔ)言開發(fā)的應(yīng)用容器引擎,基于容器化,沙箱機(jī)制的應(yīng)用部署技術(shù)???..
    sessionboy閱讀 4,007評(píng)論 2 49
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 9,005評(píng)論 1 21
  • 在前面兩節(jié)我們學(xué)習(xí)了如何安裝以及簡(jiǎn)單的運(yùn)行管理docker容器,在本節(jié)我們將會(huì)更多的探討關(guān)于docker鏡像的知識(shí)...
    井底蛙蛙呱呱呱閱讀 4,270評(píng)論 0 5
  • 五、Docker 端口映射 無(wú)論如何,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問(wèn)不到的。此外,除了...
    R_X閱讀 1,961評(píng)論 0 7
  • 晨曦山鄉(xiāng)風(fēng)景好 白鷺翩翩樂(lè)逍遙 池塘荷開蟬鳴噪 竹海樓閣秋來(lái)早
    左繼強(qiáng)a閱讀 454評(píng)論 10 17

友情鏈接更多精彩內(nèi)容