Docker v19.x

引言
非常感謝你能在閑暇之余點(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.serviceDocker守護(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í)行COPY和ADD的時(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)資源。 類似于...
