Docker v19.x
logo
引言
非常感謝你能在閒暇之餘點開了小編的文章,這篇文章是2020年較爲全面的Docker19入門的一個教程,不過他更像一個Docker的手冊,所以需要你來花費較長的時間來閱讀,你可以【收藏】或者【點贊】來記錄這篇文章到【你的喜歡】裏,這樣方便你以後查閱這篇文章。有什麼問題可以評論留言,小編會在看到的第一時間給你回覆,方便的話點個【關注】鼓勵一下小編,小編還會繼續創作更多的有關IT方面的文章,謝謝。
環境
- centos7
- docker19.x
目錄
目錄
什麼是Docker
簡單來說就是將應用程序部署到獨立的容器,每個容器相當於一個小的linux系統。通過將容器進行打包成鏡像,放到將鏡像放到任何有Docker環境的系統上運行。
使用Go語言開發,基於Apache2.0開源協議。
Docker的優勢
- Docker提供簡單的輕量的服務器部署。
- 可以清楚的將開發人員與運維人員的職責分離。
- 快速的開發生命週期。
- 面向服務的架構,每個服務相互隔離。
Docker應用在哪裏
- 可以使用Docker容器開發後測試然後部署服務。
- 創建相互隔離的運行環境。
- 搭建測試環境,例如集羣測試。
Docker容器的能力
- 文件系統的隔離
- 進程的隔離
- 網絡的隔離
- 硬件資源的隔離和分組
Docker的核心組成
- Docker Client 客戶端
- Docker Daemon 守護進程
- Docker Image 鏡像
- Docker Container 容器
- Docker Registry 倉庫
Docker Client與Docker Daemon
Docker是C/S架構的程序,其中Docker Client扮演的是客戶端,Docker Daemon扮演的是服務器端。
docker Client即可是在本機也可以在遠程。
Docker Image
鏡像好比容器的源代碼,保存了容器啓動的各種條件。
Docker將一些容器運行的系統與應用服務打包起來,通過聯合加載的方式運行,這個打包起來的文件就成爲鏡像。
一個鏡像可以放到另一個鏡像的底部,最下面的鏡像被稱爲基礎鏡像。
Docker Container
Docker的容器是Dacker的執行單元。
如果說鏡像是打包,那麼容器就是運行打包好的鏡像。
Docker Registry
Docker倉庫是用來保存Docker鏡像的地方,分爲:
- 公有倉庫 Docker Hub
- 私有倉庫
Docker入門操作
查看Docker的版本
$ docker version
$ docker info
搜索鏡像
$ docker search <鏡像名>
下載鏡像
$ docker pull <用戶名>/<鏡像名>
啓動容器
$ docker run <用戶名>/<鏡像名> [命令]
# 在啓動的容器中安裝Ping
# docker run <用戶名>/<鏡像名> apt-get install -y ping
查看運行的容器
$ docker ps
提交容器
$ docker commit <ID> <新名字>
查看指定ID的容器信息
$ docker inspect <ID>
查看有所有鏡像
$ docker images
上傳鏡像到Docker Hub
先去https://hub.docker.com/官網申請一個docker hub 帳號
$ docker login # 登錄Docker Hub
$ docker images #查看本地鏡像
$ docker tag <鏡像名> <用戶名/鏡像名> #將鏡像轉讓我的賬號下
$ docker push <用戶名>/<鏡像名>
安裝Docker
ubuntu
第一步、檢查是否支持Docker
$ uname -a
#檢查內核版本,必須高於3.10
$ ls -l /sys/class/misc/device-mapper
#檢查存儲驅動
第二步、安裝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 倉庫進行安裝
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 如果提示您接受 GPG 密鑰,請選是。
配置國內的鏡像源
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
容器的基本操作
普通容器
啓動容器
$ docker run [<用戶名>/]<鏡像名>[:tag] [命令]
# 在啓動的容器中安裝Ping
# docker run <用戶名>/<鏡像名> apt-get install -y ping
啓動交會容器
$ docker run [--name=<名稱>] -i -t <鏡像全名> /bin/bash
# -i 表示一直保持輸入
# -t 表示打開tty終端
# --name 自定義名稱
查看容器
$ docker ps [-a][-l]
# -a 查看所有的容器
# -l 查看最新的容器
查看指定ID的容器信息
$ docker inspect <ID>
啓動/停止容器
$ docker [-i] start/stop <容器>
# -i表示持續輸入
刪除容器
$ docker rm <容器>
守護式容器
特點
- 可以長期運行
- 沒有交互會話
- 非常適合運行應用服務
命令
方法一
$ docker run -i -t <鏡像> /bin/bash
# ctrl+p ctrl+q 退出bash,但沒關閉容器
$ docker attach <正在運行容器>
# 重新進入正在運行的容器
方法二
$ docker run -d <鏡像> <命令>
# -d 後臺守護
查看容器日誌
$ docker logs [-f][-t][--tail=n] 容器名
# -f 持續輸出日誌
# -t 日誌加上時間戳
# --tail 返回最後的多少行
查看運行中的容器的進程
$ docker top <容器>
在運行的容器中啓動新的進程
$ docker exec [-d][-i][-t] <容器名> [命令]
# -d 後臺運行
# -i 交會運行
# -t 打開終端
停止容器
$ docker kill/stop <容器名>
# kill 直接停止
# stop 等待進程結束後停止
設置端口映射
$ docker run [-P][-p <port> | <port>:<port>] ...
# -P 映射容器中所有的端口
# -p 指定映射容器中某幾個端口
# 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 # 將內部的80映射爲8080
$ docker run -p 127.0.0.1:8080:80 -i -t ubuntu /bin/bash # 將內部的80端口映射爲127.0.0.1:8080
# 注意:如果使用5、6行的方法進行映射,外部端口是隨機分配的
管理鏡像
概念
- TAG:標籤
- 默認:latest
- 這裏多少爲版本
- eg:docker pull node:12.1.1 下載nodejs12.1.1版本
基本操作
顯示所有的鏡像
$ docker images [-q][-a] [倉庫]
# -q 只看id
# -a 查看所有
查看鏡像的詳細
$ docker inspace <鏡像名>
刪除鏡像
$ docker rmi [-f] <鏡像名>
# -f 強制刪除
查找鏡像
方法1:鏡像dockerhub上查找
方法2:
$ docker search [--automated][-no-trunc][-s <num>] <鏡像名>
# --automated 只顯示自動化選項
# --no-trunc 不分頁顯示
# -s 顯示的最低num的stat鏡像
下載鏡像
$ docker pull [-a] <鏡像名>
# -a 下載匹配的所有鏡像
標記鏡像到某個倉庫
$ docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
上傳鏡像到DockerHub
$ docker images #查看本地鏡像
$ docker tag <鏡像名> <用戶名/鏡像名> #將鏡像轉讓我的賬號下
$ docker push <用戶名/鏡像名:Tag> #上傳鏡像
打包鏡像
打包鏡像有兩種方法,推薦使用Dockerfie方法
使用commit打包
將部署好的容器進行打包。
$ docker commit [-a][-m][-p] <容器> <用戶名/鏡像名:版本>
# -a "" 鏡像作者
# -m "" 打包備註
# -p 不停止鏡像打包
使用Dockerfile文件打包
第一步:創建Dockerfile文件
#Dockerfile
FORM <基礎鏡像:Tag>
MAINTAINER <用戶名> "聯繫方式" #新版本推薦使用 LABEL maintainer=value
RUN <linux命令>
...
EXPOSE <端口號>
說明:
這個
EXPOSE
指令實際上並不發佈端口。它作爲構建映像的人和運行容器的人之間的一種文檔類型,而這些港口將被髮布。若要在運行容器時實際發佈端口,請使用-p
旗上docker run
若要發佈和映射一個或多個端口,或-P
標誌以發佈所有公開的端口,並將它們映射到高階端口。
第二步:執行docker build命令
$ docker build [-t <鏡像名>][--no-cache] <上下文路徑>
# -t 鏡像名稱
# --no-cache 不使用緩存構建
# 上下文路徑:
# docker build 會將這個路徑下所有的文件都打包上傳給 Docker 引擎,
# 引擎內將這些內容展開後,就能獲取到所有指定上下文中的文件了
注意不要將
/
作爲<上下文路徑>,因爲他會把硬盤上所有的數據發給docker守護進程.
.dockerignore
創建.dockerignore
文件,通過在該文件裏添加匹配目錄,可以在執行docker build -t xxx .
命令時不上傳匹配的目錄。
#.dockerignore
*/temp* #匹配根目錄下的子目錄內所有的以temp開頭的文件和文件夾
*/*/temp* #匹配根目錄下的子目錄的子目錄內所有的以temp開頭的文件和文件夾
**/temp* #匹配所有目錄內的以temp開頭的文件和文件夾
!my* #在排除文件及文件夾中允許上傳my開頭的文件及文件夾
Docker遠程訪問
Docker的配置文件在Centos7
/lib/systemd/system/docker.service
Docker守護進程Linux上配置文件的默認位置是
/etc/docker/daemon.json
或者通過--config-file
參數可用於指定非默認位置。
Docker守護進程啓動選項
- -H unix:///var/run/docker.sock
- -H tcp://host:port
- -H fd://(默認)
配置開始
第一步:配置遠程的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
第二步:配置本地的系統環境變量
# windows
set DOCKER_HOST=tcp://遠程ip
# Centos7
export DOCKER_HOST=tcp://遠程ip
# 注意:以上配置都是臨時的
測試
docker info
# 是否有結果
# 如果想更準確的測試,可以先將遠程的Docker守護進程配置一個labels,然後執行命令即可
提示:
其實配置遠程還有一種方法就是配置docker守護進程的配置文件
daemon.json
通過配置該文件下的hosts
內的值也可以實現,需要注意的是這兩種方法只需要使用其中一種即可。# 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指令
關鍵知識點
上下文路徑:
上下文路徑 是在使用
docker build
的時候最後一個參數鎖指定的路徑,通過該路徑docker客戶端
會將該路徑的下的所有文件都會發送給docker守護進程
,然後在用戶執行COPY
和ADD
的時候進行文件複製。如果有不想發送的文件可以向.dockerignore
中寫入匹配忽略路徑。RUN的執行過程
RUN cd /app RUN echo "hello" > world.txt
每一個
RUN
都是啓動一個容器、執行命令、然後提交存儲層文件變更。第一層RUN cd /app
的執行僅僅是當前進程的工作目錄變更,一個內存上的變化而已,其結果不會造成任何文件變更。而到第二層的時候,啓動的是一個全新的容器,跟第一層的容器更完全沒關係,自然不可能繼承前一層構建過程中的內存變化。
FORM
這個
FROM
指令初始化新構建階段,並設置基礎鏡像以後的指令。因此Dockerfile
必須有FROM
指令。Image可以是任何有效的Image它特別容易從公共儲存庫下載。
FROM [--platform=<平臺>] <image>[:<tag>] [AS <name>]
# --platform 指定平臺 如,linux/amd64, linux/arm64,或windows/amd64;默認自動
# image 鏡像名稱
# tag 類似於版本
# As 起別名
ARG
ARG是在當前文件中設置變量,通過ARG定義變量可以在該文件內引用。
ARG VERSION=latest
FROM busybox:${VERSION} # FORM busybox:latest
LABEL
LABEL
指令將元數據添加到Image中。一個LABEL
是鍵值對。若要在LABEL
值內使用引號和反斜槓,就像在命令行解析中一樣。
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容器在運行時偵聽指定的網絡端口。您可以指定端口是否偵聽TCP或UDP,如果未指定協議,則默認爲TCP。實際上他並無卵用。這裏指定的端口僅僅只是作爲文檔給其他的人看。
EXPOSE <port> [<port>/<protocol>...]
# port 端口號
# protocol 協議 tcp或udp
ENV
設置環境變量,該環境變量類似於linux中export的設置方法,區別在於他是永久的,所以他可以在後續的shell命令裏使用該值。
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
例子:
ENV HI HELLO
RUN echo "${HI}" # Hello
COPY
複製指令,從上下文目錄中複製文件或者目錄到容器裏指定路徑。
COPY [--chown=<user>:<group>] <源路徑1>... <目標路徑>
COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"]
# [--chown=<user>:<group>] 用戶改變複製到容器內文件的擁有者和屬組。
# <源路徑> 源文件或者源目錄,這裏可以是通配符表達式,其通配符規則要滿足 Go 的 filepath.Match 規則
ADD
ADD 指令和 COPY 的使用格式一致(同樣需求下,官方推薦使用 COPY)。功能也類似,不同之處如下:
- ADD 的優點:在執行 <源文件> 爲 tar 壓縮文件的話,壓縮格式爲 gzip, bzip2 以及 xz 的情況下,會自動複製並解壓到 <目標路徑>。
- ADD 的缺點:在不解壓的前提下,無法複製 tar 壓縮文件。會令鏡像構建緩存失效,從而可能會令鏡像構建變得比較緩慢。具體是否使用,可以根據是否需要自動解壓來決定。
RUN
執行shell命令
CMD <shell 命令>
CMD ["<可執行文件或命令>","<param1>","<param2>",...]
CMD
類似於 RUN 指令,用於運行程序,但二者運行的時間點不同:
- CMD 在docker run 時運行。
- RUN 是在 docker build。
作用:爲啓動的容器指定默認要運行的程序,程序運行結束,容器也就結束。CMD 指令指定的程序可被 docker run 命令行參數中指定要運行的程序所覆蓋。
注意:如果 Dockerfile 中如果存在多個 CMD 指令,僅最後一個生效。
CMD <shell 命令>
CMD ["<可執行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 該寫法是爲 ENTRYPOINT 指令指定的程序提供默認參數
ENTRYPOINT
類似於 CMD 指令,但其不會被 docker run 的命令行參數指定的指令所覆蓋,而且這些命令行參數會被當作參數送給 ENTRYPOINT 指令指定的程序。
但是, 如果運行 docker run 時使用了 --entrypoint 選項,此選項的參數可當作要運行的程序覆蓋 ENTRYPOINT 指令指定的程序。
優點:在執行 docker run 的時候可以指定 ENTRYPOINT 運行所需的參數。
注意:如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最後一個生效。
可以搭配 CMD 命令使用:一般是變參纔會使用 CMD ,這裏的 CMD 等於是在給 ENTRYPOINT 傳參,以下示例會提到。
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
WORKDIR
指定工作目錄。用 WORKDIR 指定的工作目錄,會在構建鏡像的每一層中都存在。(WORKDIR 指定的工作目錄,必須是提前創建好的)。
docker build 構建鏡像過程中的,每一個 RUN 命令都是新建的一層。只有通過 WORKDIR 創建的目錄纔會一直存在。
WORKDIR <工作目錄路徑>
USER
用於指定執行後續命令的用戶和用戶組,這邊只是切換後續命令執行的用戶(用戶和用戶組必須提前已經存在)。
USER <用戶名>[:<用戶組>]
HEALTHCHECK
用於指定某個程序或者指令來監控 docker 容器服務的運行狀態。
HEALTHCHECK [選項] CMD <命令> #設置檢查容器健康狀況的命令
# HEALTHCHECK NONE:如果基礎鏡像有健康檢查指令,使用這行可以屏蔽掉其健康檢查指令
HEALTHCHECK [選項] CMD <命令> # CMD 後面跟隨的命令使用,可以參考 CMD 的用法。
ONBUILD
他不會在本次docker build的時候執行,會在子鏡像構建的時候執行後面的<Dockerfile指令>。
ONBUILD <Dockerfile指令>
MAINTAINER (官方不推薦)
這個是將該鏡像的維護人的信息寫到鏡像中,這是一箇舊版的寫法。
MAINTAINER <name>
# 代替方案
LABEL maintainer=<name>
SHELL
通過該指令可以指定使用的shell解釋器。
SHELL ["<Shell解釋器>", "<默認參數>"]
VOLUME
定義匿名數據卷。在啓動容器時忘記掛載數據卷,會自動掛載到匿名卷。
在啓動容器 docker run 的時候,我們可以通過 -v 參數修改掛載點。
作用:
- 避免重要的數據,因容器重啓而丟失,這是非常致命的。
- 避免容器不斷變大。
VOLUME ["<路徑1>", "<路徑2>"...]
VOLUME <路徑>
Dockerfile的構建原理
docker會在執行每條Dockerfile的指令時會對FROM
引入的基礎鏡像進行操作。
每操作一步會運行鏡像->生成容器->修改容器->提交容器->生成新的鏡像->刪除容器,然後在新的鏡像上繼續修改提交,反覆如此,最後生成出最終鏡像。這些在中間生成的鏡像被稱爲中間層鏡像。
我們可以通過docker history <鏡像名>
來看生成鏡像的過程。
Dockerfile源文件和上下文目錄
2020/01/18 11:34 17 .dockerignore
2020/01/18 14:52 277 Dockerfile
2020/01/18 14:45 <DIR> src
# 生成一個node的docker環境
FROM centos
LABEL maintainer="wm [email protected]"
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
構建過程
E:\PJ\程序設計\docker容器技術\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 [email protected]" #修改鏡像
---> Running in 0a9bdf29772d #運行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) <[email protected]>"
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 <[email protected]>"
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 [email protected] No description
npm WARN [email protected] 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
用命令查看構建過程和中間層鏡像
E:\PJ\程序設計\docker容器技術\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容器網絡基礎
工具安裝
$ yum install -y bridge-utils # 網橋管理工具
$ yum install -y net-tools # 安裝ifconfig,自行查看自己的linux不是必須的
網橋管理
網橋相當於網絡中的交換機(不完全正確,但是可以這麼想)。
$ brctl addbr br0 # 新建br0網橋
$ brctl addif br0 eth0 # 讓eth0 成爲 br0 的一個 interface
ifconfig命令
ifconfig工具不僅可以被用來簡單地獲取網絡接口配置信息,還可以修改這些配置。用ifconfig命令配置的網卡信息,在網卡重啓後機器重啓後,配置就不存在。要想將上述的配置信息永遠的存的電腦裏,那就要修改網卡的配置文件了。
$ ifconfig # 查看網卡狀態
$ ifconfig eth0 {up|down} # 啓動或關閉eth0網卡
$ ifconfig eth0 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255 # 配置eth0的Ip地址,子網地址,廣播地址
配置Docker的網橋
$ brctl addbr br0 # 新建br0網橋
$ ifconfig br0 192.168.1.100 netmask 255.255.255.0 # 配置br0的Ip地址,子網地址
$ vi /lib/systemd/system/docker.service
# 添加docker守護進程的啓動參數 -b=br0
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -b=br0
$ systemctl daemon-reload && systemctl restart docker
Docker容器間的通信
默認啓動參數的
—icc=true
,所以docker容器間是允許通信的的。
$ docker run -it --link <運行中容器名>:<標識名> <鏡像名>
# 運行中的容器名 必須是運行中的容器
# 標識名 是在該容器中調用的名稱,他類型於localhost
指定容器間通信
首先配置docker守護進程的啓動參數
$ vi /lib/systemd/system/docker.service
# 添加docker守護進程的啓動參數 ---icc=false --iptables=true
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --icc=false --iptables=true
# --iptables=true 將策略寫入宿主機iptables進行隔離控制
然後使用 --link參數啓動
$ docker run -it --link <運行中容器名>:<標識名> <鏡像名>
# 運行中的容器名 必須是運行中的容器
# 標識名 是在該容器中調用的名稱,他類型於localhost
現在該容器就與<運行中容器名>是連通的。
Docker容器的數據卷(Data Volume)
數據卷是一個特殊的目錄,他可以繞開聯合文件系統,爲多個docker容器提供訪問。
作用
- 存儲永久的數據
- 共享給多個docker的訪問空間
特點
- 數據卷可以在容器直接共享
- 宿主機可以直接操作數據卷裏的數據
- 數據卷的變化不會影響鏡像
- 數據卷一直存在,即使掛載(加載)數據卷的容器壞掉,也不會影響數據卷
掛載方式
- volumes:Docker管理宿主機文件系統的一部分,默認位於 /var/lib/docker/volumes 目錄
- bind mounts:意爲着可以存儲在宿主機系統的任意位置
- tmpfs:掛載存儲在宿主機系統的內存中,而不會寫入宿主機的文件系統(不常用)
數據卷的操作
docker volume COMMAND
COMMAND:
create <數據卷名> 創建數據卷
inspect <數據卷名> 顯示一個或多個捲上的詳細信息
ls 列出所有的數據卷 包括臨時的
prune 刪除沒有用的數據卷
rm <數據卷名> 刪除數據卷
基礎使用
命令方式掛載數據卷
docker run -it -v <宿主機路徑|數據卷名>:<容器內的路徑>[:ro] <image>
# -v 掛載數據卷
# ro 只讀權限
Dockerfile掛載
FROM centos
VOLUME [ "/data" ]
# 這裏的/data是容器內的路徑
# 因爲沒有指定宿主機的位置所以他默認掛載到
# /var/lib/docker/volumes/xxx/_data
# xxx 是哈希值
共享其他容器的數據卷
docker run -it --volumes-from <容器名稱> <image> # 創建容器並且其他容器的數據卷
注意:在不指定宿主機路徑時創建的數據卷容器會在刪除引用他的容器後系統會自動刪除這個臨時的數據卷
Docker跨主機連接
Weave通過創建虛擬網絡使docker容器能夠跨主機通信並能夠自動相互發現。
第一步:安裝weave
curl -L git.io/weave -o /usr/local/bin/weave #下載
chmod a+x /usr/local/bin/weave #賦予執行權限
第二步:啓動weave
host1(master):
IP:10.130.0.1/8
weave launch
# 啓動weave
eval $(weave env)
# 進入weave環境
# 關閉weave需要執行下面這條
# eval $(weave env --restore) && weave stop
docker run --name masterhost -it centos
# 啓動一個容器名爲masterhost
host2:
IP:10.130.0.2/8
weave launch 10.130.0.1
# 啓動weave,並連接到host1
eval $(weave env)
# 進入weave環境
# 關閉weave需要執行下面這條
# eval $(weave env --restore) && weave stop
docker run --name node1host -it centos
# 啓動一個容器名爲 node1host
第三步:測試
host1(master)->root@masterhost:
ping node1host
# 通過√
host2->root@node1host:
ping masterhost
# 通過√
注意事項
如果有防火牆$HOST1
和$HOST2
,您必須允許流量通過TCP 6783和UDP 6783/6784,這是WARW的控制和數據端口。
如果想更深入的瞭解weave,小編推薦大家一篇文章docker: weave 分析和實戰這位大神寫的文章。
最後
docker的知識點,差不多就是這麼多,對於開發崗來說這些就差不多了,如果有運維的朋友,你還得需要去看官方的知識,來學習更多的docker知識。