docker+k8s
1 簡介
1.1 docker是什麼
- docker是開源專案,誕生於2013年初,由dotCloud公司釋出的基於Google公司的Go語言實現
- 後加入Linux基金會,遵從Apache2.0協議,專案程式碼在Github維護
- docker專案的目標是實現輕量級的作業系統虛擬化解決方案
- docker的基礎是Linux容器(LXC)等技術,在LXC上進一步封裝,讓使用者不需要關心容器管理,操作簡便
1.2 為什麼要用docker
1.2.1 docker容器虛擬化的好處
- 脫離底層物理硬體的限制,更方便的在網路上傳播,任何時間任何地點都可獲取可使用
- 新型的建立分散式應用程式,快速分發部署
- 通過容器來打包應用、解耦應用和執行平臺
- 更加節約時間,且降低部署過程中出現問題的風險
1.2.2 docker在開發和運維中的優勢
-
更快的交付和部署
使用docker開發人員可以使用映象來快速構建一套標準的開發環境
開發完之後,測試和運維人員可以直接使用完全相同的環境來部署程式碼
只要是開發測試過的程式碼就可以確保在生產環境無縫執行
docker可以快速建立和刪除容器,實現快速迭代,節約開發、測試及部署時間
-
更高的利用資源
執行docker不需要額外的虛擬化管理程式的支援
docker是核心級的虛擬化,可以實現更高的效能,同時對資源的額外需求低
與傳統虛擬機器方式相比,docker效能要提高1~2個數量級
-
更輕鬆地遷移和擴充套件
docker容器幾乎可以在任意的平臺執行,包括物理機、虛擬機器、公有云、私有云、PC等
支援主流的作業系統發行版本
高相容性可以讓使用者在不同的平臺之間輕鬆的遷移應用
-
更輕鬆的管理和更新
使用dockerfile只需小的配置修改就可以替代大量的更新工作
所有的修改都以增量的方式被髮布和更新,從而實現自動化且高效的容器管理
1.2.3 docker與虛擬機器比較
- docker容器啟動快,啟動和停止可實現秒級,相比傳統虛擬機器的分鐘級要快很多
- docker容器對系統資源需求少,一臺主機上可以同時執行數千個Docker容器
- docker通過類似git設計理念的操作來方便使用者獲取、分發和更新應用映象,儲存複用,增量更新
- docker通過Dockerfile支援靈活的自動化建立和部署機制,可以提高工作效率,並標準化流程
特性 | 容器 | 虛擬機器 |
---|---|---|
啟動速度 | 秒級 | 分鐘級 |
效能 | 接近原生 | 較好 |
記憶體 | MB級 | GB級 |
硬碟適應 | MB級 | GB級 |
執行密度 | 單臺主機支援上千個 | 單臺主機支援幾個 |
隔離性 | 安全隔離 | 完全隔離 |
遷移 | 優秀 | 一般 |
1.3 Docker與虛擬化
- Docker及其他容器技術都屬於作業系統虛擬化範疇,作業系統虛擬化最大特點是不需要額外supervisor支援
- 傳統方式是在硬體層面實現虛擬化,需要有額外的虛擬機器管理應用和虛擬機器作業系統層
- Docker容器是在作業系統層面實現虛擬化,直接複用本地主機的作業系統,因此更加輕量級
2 Docker概念與使用
2.1 docker三大核心概念
2.1.1 映象(Image)
- Docker映象(Image)相當於是一個root檔案系統。
- 如官方映象ubuntu:16.04就包含完整一整套Ubuntu16.04最小系統的root檔案系統
2.1.2 容器(Container)
- 映象(Image)和容器(Container),就像是物件導向的程式設計中的類和例項一樣
- 映象是靜態的定義,容器是映象執行的實體
- 容器可以被建立、啟動、停止、刪除、暫停等
2.1.3 倉庫(Repository)
- 用來儲存映象的倉庫
- 當我們構建好自己的映象後需要放在倉庫中。需要啟動一個映象時可以在倉庫中下載下來
2.2 Docker安裝(CentOS)
2.2.1 更換系統yum源
# 檢視作業系統核心版本
[root@ccc ~]# uname -a
Linux ccc 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
# 備份原來的yum源
[root@ccc ~]# cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
# 重新整理yum源快取
[root@ccc ~]# yum makecache
2.2.2 安裝所需基礎軟體
# 安裝必要的一些系統工具
[root@ccc ~]# sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 下載新的CentOS-Base.repo 到 /etc/yum.repos.d/
[root@ccc ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
2.2.3 安裝yum源
# 安裝yum源
[root@ccc ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.2.4 安裝並更新Docker-CE
[root@ccc ~]# yum makecache fast
[root@ccc ~]# yum -y install docker-ce
2.2.5 啟動並設定開機自啟
[root@ccc ~]# systemctl enable --now docker
2.2.6 測試啟動
[root@ccc ~]# docker info
[root@ccc ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since 一 2020-11-30 21:57:57 CST; 1min 1s ago
2.3 Docker安裝(ubuntu)
2.3.1 檢視版本資訊
# 第一種方式
root@alvin-test-os:~# uname -a
# 第二種方式
root@alvin-test-os:~# cat /proc/version
2.3.2 更新系統
root@alvin-test-os:~# apt-get update
2.3.3 安裝基礎軟體
root@alvin-test-os:~# apt-get -y install apt-transport-https ca-certificates curl software-properties-common
2.3.4 安裝GPG證照
root@alvin-test-os:~# curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - OK
2.3.5 寫入軟體源資訊
root@alvin-test-os:~# sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
2.3.6 更新並安裝Docker-CE
root@alvin-test-os:~# sudo apt-get -y update
2.3.7 啟動並檢驗
root@alvin-test-os:~# docker version
2.4 第一個Docker例項
[root@ccc ~]# docker run -d --rm --name nginx -p 80:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
bb79b6b2107f: Pull complete
5a9f1c0027a7: Downloading [==============> ] 7.457MB/26.49MB
5a9f1c0027a7: Downloading [======================> ] 12.17MB/26.49MB
166a2418f7e8: Download complete
1966ea362d23: Download complete
3 使用Docker映象
3.1 獲取映象
3.1.1 獲取映象pull
- 下載映象的格式:
- docker pull [倉庫的URL]/[名稱空間名稱]/[倉庫名稱]:[版本號]
[root@ccc ~]# docker pull busybox:latest
或
[root@ccc ~]# docker pull docker.io/library/busybox:latest
3.1.2 欄位解釋
- URL:docker.io
- 名稱空間:library
- 倉庫名稱:busybox
- 版本號:latest
[root@ccc ~]# docker pull nginx:1.17
1.17: Pulling from library/nginx
afb6ec6fdc1c: Pull complete
b90c53a0b692: Pull complete
11fa52a0fdc0: Pull complete
Digest: sha256:6fff55753e3b34e36e24e37039ee9eae1fe38a6420d8ae16ef37c92d1eb26699
Status: Downloaded newer image for nginx:1.17
docker.io/library/nginx:1.17
3.1.3 補充
- 使用docker pull命令下載會獲取並輸出映象的各層資訊
- 當不同的映象包括相同層的時候,本地僅存一份內容以減少儲存空間
3.2 檢視映象資訊
- 映象主要包括映象檔案、映象tag以及映象詳細資訊等
3.2.1 映象列表images
- docker images
- docker images ls
[root@ccc ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest bc9a0695f571 5 days ago 133MB
busybox latest dc3bacd8b5ea 6 days ago 1.23MB
- REPOSITORY映象來源:來自哪個倉庫,預設來自:hub.docker.com
- TAG映象標籤:如1.17、latest
- IMAGE ID映象ID:例如bc9a0695f571
- CREATED時間段:如5 days ago
- SIZE映象大小:133MB
3.2.2 images支援的選項
- -a 顯示所有的映象(包括臨時映象檔案)
[root@ccc ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest bc9a0695f571 5 days ago 133MB
busybox latest dc3bacd8b5ea 6 days ago 1.23MB
nginx 1.17 9beeba249f3e 6 months ago 127MB
- --digest=true|false 列出映象的數字摘要值
[root@ccc ~]# docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
nginx latest sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3 bc9a0695f571 5 days ago 133MB
busybox latest sha256:9f1c79411e054199210b4d489ae600a061595967adb643cd923f8515ad8123d2 dc3bacd8b5ea 6 days ago 1.23MB
nginx 1.17 sha256:6fff55753e3b34e36e24e37039ee9eae1fe38a6420d8ae16ef37c92d1eb26699 9beeba249f3e 6 months ago 127MB
- -q 只顯示映象ID
[root@ccc ~]# docker images -q
bc9a0695f571
dc3bacd8b5ea
9beeba249f3e
3.3 推送映象push
- docker push [映象倉庫URL]/[名稱空間名稱]/[倉庫名稱]:[版本號]
[root@Centos7 docker]# docker push registry.cn-hangzhou.aliyuncs.com/alvinos/py15-nginx:1.19.2
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/alvinos/py15-nginx]
908cf8238301: Pushed
eabfa4cd2d12: Pushed
60c688e8765e: Pushed
f431d0917d41: Pushed
07cab4339852: Pushed
1.19.2: digest: sha256:794275d96b4ab96eeb954728a7bf11156570e8372ecd5ed0cbc7280313a27d19 size: 1362
3.4 為映象新增tag
- docker tag [原映象倉庫url]/[原映象名稱空間]/[原映象倉庫名稱]:[版本號] [新映象倉庫url]/[新映象名稱空間]/[新映象倉庫名稱]:[版本號]
[root@ccc ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest bc9a0695f571 5 days ago 133MB
busybox latest dc3bacd8b5ea 6 days ago 1.23MB
nginx 1.17 9beeba249f3e 6 months ago 127MB
[root@ccc ~]# docker tag busybox:latest mybusybox:latest
[root@ccc ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest bc9a0695f571 5 days ago 133MB
mybusybox latest dc3bacd8b5ea 6 days ago 1.23MB
busybox latest dc3bacd8b5ea 6 days ago 1.23MB
nginx 1.17 9beeba249f3e 6 months ago 127MB
3.5 檢視詳細資訊inspect
- docker inspect命令獲取映象的詳細資訊,包括PID、作者、架構等
- -f 可以使用golang的模板獲取所需資訊
[root@ccc ~]# docker inspect busybox
[
{
"Id": "sha256:dc3bacd8b5ea796cea5d6070c8f145df9076f26a6bc1c8981fd5b176d37de843",
"RepoTags": [
"busybox:latest",
"mybusybox:latest"
],
...
"Metadata": {
"LastTagTime": "2020-11-30T22:39:16.14474717+08:00"
}
}
]
3.6 檢視映象歷史history
- 有些架構資訊過長可以用--no-trunc選項來輸出完整資訊
[root@ccc ~]# docker history busybox
IMAGE CREATED CREATED BY SIZE COMMENT
dc3bacd8b5ea 6 days ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 6 days ago /bin/sh -c #(nop) ADD file:7f51bbea8802a227e… 1.23MB
3.7 搜尋映象
3.7.1 搜尋映象search
- docker search [所搜尋的映象名稱]
[root@ccc ~]# docker search python
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
python Python is an interpreted, interactive, objec… 5661 [OK]
django Django is a free web application framework, … 1021 [OK]
...
- NAME:倉庫名稱
- DESCRIPTION:描述
- STARS:收藏次數
- OFFICIAL:是否是官方映象
- AUTOMATED:是否是自構建的映象
3.7.2 search支援的選項
- -f 過濾輸出內容
[root@ccc ~]# docker search python -f stars=300
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
python Python is an interpreted, interactive, objec… 5661 [OK]
django Django is a free web application framework, … 1021 [OK]
- --limit 限制輸出結果
[root@ccc ~]# docker search python --limit 3
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
python Python is an interpreted, interactive, objec… 5661 [OK]
nikolaik/python-nodejs Python with Node.js 55 [OK]
circleci/python Python is an interpreted, interactive, objec… 41
- --no-trunc 不截斷輸出結果
[root@ccc ~]# docker search python --limit 3 --no-trunc
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
python Python is an interpreted, interactive, object-oriented, open-source programming language. 5661 [OK]
nikolaik/python-nodejs Python with Node.js 55 [OK]
circleci/python Python is an interpreted, interactive, object-oriented, open-source programming language. 41
3.8 刪除rmi與清理prune映象
3.8.1 刪除映象rmi
-
刪除映象rmi
-
docker rmi [映象名稱:版本號 | 映象ID]
-
引數:
-f 強制刪除
[root@ccc ~]# docker rmi redis
Untagged: redis:latest
Untagged:
redis@sha256:5b98e32b58cdbf9f6b6f77072c4915d5ebec43912114031f37fa5fa25b032489
# -f 強制刪除映象
[root@ccc ~]# docker rmi -f redis
Untagged: redis:latest
Untagged:
redis@sha256:5b98e32b58cdbf9f6b6f77072c4915d5ebec43912114031f37fa5fa25b032489
3.8.2 清理映象
-
清理映象prune
-
docker image prune [引數]
-
引數:
-a 刪除所有未使用的映象
-f 強制刪除
# 檢視原來的映象
[root@ccc ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest bc9a0695f571 5 days ago 133MB
busybox latest dc3bacd8b5ea 6 days ago 1.23MB
mybusybox latest dc3bacd8b5ea 6 days ago 1.23MB
nginx 1.17 9beeba249f3e 6 months ago 127MB
# -a 刪除所有的未被使用的映象
[root@ccc ~]# docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: nginx:1.17
...
# -f 強制刪除映象而不進行提示
alvin@AlvindeMacBook-Pro: docker image prune -a -f
Deleted Images:
untagged: registry.cn-hangzhou.aliyuncs.com/alvinos/swoole:latest
...
3.9 構建映象commit
- docker commit [引數] [容器ID | 容器名稱:版本號]
引數:
-a : 維護者
-m : 簡介
-p : 儲存映象時,映象暫停執行
3.10 儲存映象
3.10.1 針對容器
-
export和import針對點是容器,將本機的容器匯出為映象包
-
export 針對容器儲存映象
docker export [容器名或ID] > [壓縮包名稱]
例如 docker export 3302aab7a252 > nginx.tar
-
import 針對export儲存的壓縮包
docker import [壓縮包名稱] [映象名稱]:[版本號]
- import 針對export儲存的壓縮包可以自定義映象的名稱
# 使用export儲存容器為映象
[root@ccc ~]# docker export daf9c3656be3 > nginx.tar
[root@ccc ~]# ll | grep nginx.tar
-rw-r--r-- 1 root root 135117824 9 月 24 20:51 nginx.tar
# 使用import匯入包為映象
[root@ccc ~]# docker import nginx.tar test/nginx:v1
sha256:02107323de1b074c5d2034b01eff855fec5922b45776c2721882d100ba6dd15b
[root@ccc ~]# docker images | grep test
test/nginx v1 02107323de1b 22 seconds ago 131MB
3.10.2 針對映象
-
save和load針對點是映象,將本機的映象匯入、匯出為映象包
-
save針對映象儲存映象
docker save [映象名或ID] > [壓縮包名稱]
docker save -o [壓縮包名稱] [映象名稱或ID ...]
- 當使用映象ID儲存映象時匯入時沒有映象名稱。需docker tag自己新增
- 可以同時儲存多個映象
-
load匯入映象
docker load < [壓縮包名稱]
- 僅針對save儲存的壓縮包
- 不能自定義名稱
- save儲存的更完整
# 使用save儲存映象
[root@ccc ~]# docker save 6858809bf669 > busybox.tar
[root@ccc ~]# ll | grep busy
-rw-r--r-- 1 root root 1458176 9 月 24 21:01 busybox.tar
# 使用save儲存多個映象
[root@ccc ~]# docker save -o test.tar busybox nginx:1.18.0
[root@ccc ~]# docker load < test.tar
Loaded image: busybox:latest
Loaded image: nginx:1.18.0
# 使用load匯入映象
[root@ccc ~]# docker load < busybox.tar
[root@ccc ~]# docker load -i busybox.tar
Loaded image ID:
sha256:6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3
[root@ccc ~]# docker images | grep 685880
busybox latest 6858809bf669 2 weeks ago 1.23MB
3.10.3 區別
- export匯出的映象檔案體積小於save儲存的映象
- import可以指定映象名稱,load不可以
- save可以將多個映象打包到一個檔案中,export不支援
- import匯入的映象會丟失所有歷史記錄和後設資料資訊,無法回滾
- load載入的映象沒有丟失映象的歷史,可以回滾
4 倉庫Repository
-
docker login [引數] [倉庫URL]
-
docker login --username=xxx xxx.com
-
docker push [倉庫URL]/[名稱空間]/[倉庫名稱]:[版本號]
5 使用Docker容器
5.1 建立容器run
5.1.1 格式
- docker run [option] image [cmd]
5.1.2 引數
- 容器啟動引數
-d : 以守護程式的方式執行
-p : 指定埠對映(格式:宿主主機埠:容器向外暴露的埠)
docker run -d -p 8899:80 nginx:1.19.2
-P : 隨機埠對映
docker run -d -P nginx:1.19.2
--name: 指定容器的名稱(同一臺宿主主機上的docker名稱不能重複)
將容器的名稱解析到Docker DNS
docker run -d --name nginx_name -P nginx:1.19.2
--rm:當一個容器結束了它的生命週期,就立即刪除
docker run -d --rm --name nginx_rm nginx:1.19.2
-v: 對映儲存卷(可以對映檔案及資料夾)
docker run -d -v /root/test:/usr/share/nginx/html -P nginx:1.19.2
-i : 開啟標準輸出
-t : 建立一個偽終端
-e : 在容器內設定一個環境變數
docker run -d -e NGINX_NAME=nginx nginx:1.19.2
[root@alvin-test-os ~]# docker run -d --name nginx -p 80:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
852e50cd189d: Pull complete
a29b129f4109: Pull complete
b3ddf1fa5595: Pull complete
c5df295936d3: Pull complete
232bf38931fc: Pull complete
Digest: sha256:c3a1592d2b6d275bef4087573355827b200b00ffc2d9849890a4f3aa2128c4ae
Status: Downloaded newer image for nginx:latest
6381d29d6e0ec3f6b01cf1aabb58b799ee88acf1a722e251807c9cb44e73a3e0
- docker 當中至少有一個應用程式執行在前臺
5.2 檢視執行的容器ps
5.2.1 格式
- docker ps 檢視正在執行的容器
5.2.2 引數
- -a 檢視容器(包括已經停止了的容器)
- -q 只檢視容器ID
[root@ccc ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
140d8682230f 9beeba249f3e "nginx -g 'daemon of…" 4 hours ago Up 4 hours 0.0.0.0:32769->80/tcp tender_cohen
85113c409717 bc9a0695f571 "/docker-entrypoint.…" 4 hours ago Up 4 hours 0.0.0.0:32768->80/tcp suspicious_germain
[root@ccc ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
140d8682230f 9beeba249f3e "nginx -g 'daemon of…" 4 hours ago Up 4 hours 0.0.0.0:32769->80/tcp tender_cohen
85113c409717 bc9a0695f571 "/docker-entrypoint.…" 4 hours ago Up 4 hours 0.0.0.0:32768->80/tcp suspicious_germain
a9d93f8e8df2 busybox "sh" 4 hours ago Exited (0) 4 hours ago competent_hawking
[root@ccc ~]# docker ps -q
140d8682230f
85113c409717
5.3 停止容器stop
- docker stop [容器名稱 | 容器ID]
- docker stop $(docker ps -q)
5.4 進入容器
5.4.1 attach
docker attach [容器名或ID]
- 多個視窗同時使用該命令進入該容器時,所有視窗都會同步顯示
- 如果一個視窗阻塞了,其他視窗也無法進行操作
- 所有視窗退出時,容器結束
[root@ccc ~]# docker attach nginx
127.0.0.1 - "GET / HTTP/1.1" 308 171 "-" "curl/7.59.0" 0.000 - .
5.4.2 exec
docker exec [引數] [容器名或ID] [命令]
- 相當於在容器中執行一個命令
[root@ccc ~]# docker exec -it nginx /bin/bash
nginx [ / ]$
nginx [ / ]$
5.4.3 nsenter
- 需配合docker inspect使用
[root@ccc ~]# nsenter --target $( docker inspect -f {{.State.Pid}}
nginxv1 ) --mount --uts --ipc --net --pid
mesg: ttyname failed: No such device
5.4.4 ssh
- 使用Docker容器不建議使用ssh進入Docker容器內
5.5 刪除容器rm
5.5.1 格式
- docker rm
[root@ccc ~]# docker rm nginx
5.5.2 強制刪除-f
[root@ccc ~]# docker rm -f nginx
nginx
5.6 複製
5.6.1 容器-->宿主主機
- docker cp [容器ID:容器內檔案路徑] 宿主主機路徑
[root@ccc ~]# docker cp 726b695a337c:/opt/start .
[root@ccc ~]# ls | grep start
Start
5.6.2 宿主主機-->容器
- docker cp 宿主主機路徑 [容器ID:容器內檔案路徑]
[root@ccc ~]# docker cp start 726b695a337c:/root
[root@ccc ~]# docker exec 726b695a337c ls /root
start