k8s+docker_part2

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 //mirrors.aliyun.com/repo/Centos-7.repo

2.2.3 安裝yum源

# 安裝yum源
[root@ccc ~]# yum-config-manager --add-repo //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 //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] //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

6 Docker網絡