天天看點

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

标題

狂神Docker基礎、進階筆記,為k8s的學習預預熱

筆記來源于視訊:

狂神docker基礎篇

狂神docker進階篇

筆記中圖檔有些取自于:這位部落客的兩篇docker筆記中的一些圖檔

百度雲筆記工具包自取位址:

連結:https://pan.baidu.com/s/1VaXaj6DZoDLG0VmDdyTFWQ

提取碼:03g5

筆記和工具都是我自己去記的和找的,隻有不斷去學習分享才會更強大,有什麼錯漏的敵方歡迎指出,不要忘了給文章點個贊。

實戰全部實踐測試!!

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

了解阿裡雲

阿裡雲,阿裡巴巴集團旗下雲計算品牌,全球卓越的雲計算技術和服務提供商。創立于2009年,在杭州、北京、矽谷等地設有研發中心和營運機構。

阿裡雲創立于2009年,是全球領先的雲計算及人工智能科技公司,緻力于以線上公共服務的方式,提供安全、可靠的計算和資料處理能力,讓計算和人工智能成為普惠科技。阿裡雲服務着制造、金融、政務、交通、醫療、電信、能源等衆多領域的領軍企業,包括中國聯通、12306、中石化、中石油、飛利浦、華大基因等大型企業客戶,以及微網誌、知乎、錘子科技等明星網際網路公司。在天貓雙11全球狂歡節、12306春運購票等極富挑戰的應用場景中,阿裡雲保持着良好的運作紀錄 。

阿裡雲在全球各地部署高效節能的綠色資料中心,利用清潔計算為萬物互聯的新世界提供源源不斷的能源動力,目前開服的區域包括中國(華北、華東、華南、香港)、新加坡、美國(美東、美西)、歐洲、中東、澳洲、日本。

2014年,阿裡雲曾幫助使用者抵禦全球網際網路史上最大的DDoS攻擊,峰值流量達到每秒453.8Gb 。在Sort Benchmark 2016 排序競賽 CloudSort項目中,阿裡雲以1.44 / T B 的 排 序 花 費 打 破 了 A W S 保 持 的 4.51 /TB的排序花費打破了AWS保持的4.51 /TB的排序花費打破了AWS保持的4.51/TB紀錄 [3] 。在Sort Benchmark 2015,阿裡雲利用自研的分布式計算平台ODPS,377秒完成100TB資料排序,重新整理了Apache Spark 1406秒的世界紀錄 。

2019年3月3日淩晨,阿裡雲深夜出現故障,阿裡雲官方回複,華北2地域可用區C部分ECS伺服器等執行個體出現IO HANG [4] 持續了三個小時左右, [5] 經緊急排查處理後逐漸恢複。 2019年6月11日,阿裡雲入選“2019福布斯中國最具創新力企業榜”。

阿裡雲注冊

阿裡雲注冊十分簡單,可以用支付寶和手機号進行注冊。

官方位址:https://www.aliyun.com/?utm_content=se_1003105888

按照提示步驟進行注冊即可。

Docker學習

Docker概述

Docker為什麼會出現

一款産品:開發——上線 兩套環境,應用環境,應用配置。

開發——運維。問題:我在我的電腦上可以運作。版本更新,導緻服務不可用!對運維來說,考驗就特别大。

環境配置是十分麻煩的事情,沒一個機器都要部署環境(叢集Redis、es、Hadoop……)費時費力。

釋出一個項目(jar+(Redis MySQL jdk es Hadoop)),項目能不能都帶上環境安裝打包?

之前在一個伺服器配置一個應用的環境Redis、MySQL、jdk、es、Hadoop,配置會很阿發,不能夠跨平台。

Windows,最後釋出到Linux!

傳統:開發jar,運維來做。

現在:開發打包部署上線,一套流程走完。

java——apk——釋出(應用商店)——張三使用APP——安裝即可用

java——jar(環境)——打包項目帶上環境(鏡像)——(docker倉庫:商店)——下載下傳我們釋出的鏡像——直接運作即可

docker的出現給以上的問題,提出了解決方案。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

docker的思想來源于集裝箱!

JRE——多個應用(端口沖突)——原來都是交叉的

隔離:docker核心思想!打包裝箱,每個箱子是互相隔離的。

docker通過隔離機制,可以将伺服器利用到極緻。

本質:所有的技術都是因為出現了一些問題,需要我們去解決,才去學習。

Docker的曆史

2010年,幾個搞IT的年輕人,在美國成立了一家公司 DotCloud

做一些pass的雲計算服務,LXC有關的容器技術。

他們将自己的技術(容器化技術)命名就是docker!

docker剛剛誕生的時候,沒有引起行業的注意。DotCloud,就活不下去。

最後隻能将docker開源。

2013年docker開源。

docker開源後讓越來越多的人發現了docker的優點,docker就火了,此後docker每個月都會更新一個版本。

2014年4月9号,docker1.0釋出。

docker為什麼這麼火,因為它十分的輕巧。

在容器技術出來之前,我們都是使用虛拟化技術!

虛拟機:在Windows中裝一個VMware,通過這個軟體我們可以虛拟出一台或多台電腦,比較笨重。

虛拟機也是屬于虛拟化技術,docker容器技術,也是一種虛拟化技術。

vm : liunx centos原生鏡像(一個電腦!) 隔離,需要開啟多個虛拟機! 幾個G 幾分鐘
docker:隔離 鏡像(最核心的環境 4M + jdk + mysql)十分的輕巧,運作鏡像就可以了!小巧,幾個M、KB 秒級啟動
           

到現在,docker是一項有必要去掌握的技能。

聊聊Docker

docker是基于go語言開發的開源項目。

官網位址:https://www.docker.com

文檔位址:https://docs.docker.com

倉庫位址:https://hub.docker.com

Docker 能幹嘛

之前的虛拟技術

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習
虛拟機技術缺點:

1、 資源占用十分多

2、 備援步驟多

3、 啟動很慢!

容器化技術

容器化技術不是模拟一個完整的作業系統

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

比較Docker和虛拟機技術的不同:

傳統虛拟機,虛拟出一條硬體,運作一個完整的作業系統,然後在這個系統上安裝和運作軟體

容器内的應用直接運作在主控端的内容,容器是沒有自己的核心的,也沒有虛拟我們的硬體,是以就輕便了

每個容器間是互相隔離,每個容器内都有一個屬于自己的檔案系統,互不影響

DevOps(開發、運維)
           

應用更快速的傳遞和部署

傳統:一堆幫助文檔,安裝程式

Docker:打包鏡像釋出測試,一鍵運作

更便捷的更新和擴縮容

使用了docker之後,我們部署應用就和搭積木一樣。

項目打包為一個鏡像之後,拓展伺服器A,伺服器B

更簡單的系統運維

在容器化之後,我們開發,測試環境都是高度一緻的

更高效的計算資源利用:

Docker是核心級别的虛拟化,可以在一個實體機上運作很多的容器執行個體。伺服器的性能可以被壓榨到極緻。

Docker安裝

Docker的基本組成

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

鏡像(image):

docker鏡像就好比是一個目标,可以通過這個目标來建立容器服務,tomcat鏡像==>run==>容器(提供伺服器),通過這個鏡像可以建立多個容器(最終服務運作或者項目運作就是在容器中的)。

容器(container):

Docker利用容器技術,獨立運作一個或者一組應用,通過鏡像來建立的.

啟動,停止,删除,基本指令

目前就可以把這個容器了解為就是一個簡易的 Linux系統。

倉庫(repository):

倉庫就是存放鏡像的地方!

倉庫分為公有倉庫和私有倉庫。(很類似git)

Docker Hub是國外的。

阿裡雲…都有容器伺服器(配置鏡像加速!)

安裝Docker

環境準備

1、需要一點liunx基礎

2、centos 7

3、我們使用Xshell連接配接遠端伺服器進行操作!(其它的工具也行)

https://www.netsarang.com/en/free-for-home-school/ 申請免費Xshell網址。

4、阿裡雲伺服器

阿裡雲優惠購買位址:https://www.aliyun.com/minisite/goods?userCode=0phtycgr

購買之後需要建立安全組開放端口入口

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

剛建立的隻預設三個端口。

我們可以開放一些常用的端口。

接着要修改執行個體名稱和密碼,重新開機系統,就可以了。

接着用Xshell遠端阿裡雲伺服器就可以了。

#系統核心是3.10以上的
[[email protected] /]# uname -r
3.10.0-1062.18.1.el7.x86_64
           
#系統版本
[[email protected] /]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

           

docker 官方文檔CentOS平台安裝指南

#開始安裝
#在官方文檔檢視安裝流程

yum -y install gcc
#1、解除安裝舊的版本
[[email protected] /]# yum remove docker \
>                   docker-client \
>                   docker-client-latest \
>                   docker-common \
>                   docker-latest \
>                   docker-latest-logrotate \
>                   docker-logrotate \
>                   docker-engine
Loaded plugins: fastestmirror
No Match for argument: docker
No Match for argument: docker-client
No Match for argument: docker-client-latest
No Match for argument: docker-common
No Match for argument: docker-latest
No Match for argument: docker-latest-logrotate
No Match for argument: docker-logrotate
No Match for argument: docker-engine
No Packages marked for removal
#解除安裝完畢
#2、安裝安裝包
[[email protected] /]# yum install -y yum-utils


#3、設定鏡像的倉庫
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
#官方文檔預設是從國外的,不推薦

#推薦使用國内的,這個是阿裡雲的,十分的快。
[[email protected] /]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo

#4、更新yum的索引
[[email protected] /]# yum makecache fast

#5、安裝docker 
docker-ce 社群版 docker-ee 企業版
[[email protected] /]# yum install docker-ce docker-ce-cli containerd.io

#6、啟動docker
[[email protected] /]# systemctl start docker

#7、檢視版本 helloword測試是否成功
[[email protected] /]# docker version
Client: Docker Engine - Community
 Version:           20.10.5
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        55c4c88
 Built:             Tue Mar  2 20:33:55 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.5
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       363e9a8#8、測試Holleword
  Built:            Tue Mar  2 20:32:17 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.4
  GitCommit:        05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc:
  Version:          1.0.0-rc93
  GitCommit:        12644e614e25b05da6fd08a38ffa0cfe1903fdec
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
#8、測試Holle—word
[[email protected] /]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete 
Digest: sha256:89b647c604b2a436fc3aa56ab1ec515c26b085ac0c15b0d105bc475be15738fb
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

[[email protected] /]# docker run hello-world

Hello from Docker!#出現這句話表示成功了
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
#9、檢視剛剛下載下傳的holle-word鏡像
[[email protected] /]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED      SIZE
hello-world   latest    d1165f221234   4 days ago   13.3kB
#10、解除安裝docker
#第一步解除安裝Docker Engine,CLI和Containerd軟體包:
sudo yum remove docker-ce docker-ce-cli containerd.io

#第二步主機上的映像,容器,卷或自定義配置檔案不會自動删除。要删除所有圖像,容器和卷:

 sudo rm -rf /var/lib/docker
 sudo rm -rf /var/lib/containerd
 
           

阿裡雲鏡像加速

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

登入阿裡雲,找到這個菜單。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

點選鏡像加速器,選擇centOS系統 cope 代碼運作

mkdir -p /etc/docker#建立目錄
#添加修改配置
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://2m22qn0c.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload#關閉
systemctl restart docker#重新開機


#加速就配置好了
           

回顧HelloWorld流程

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

Docker run 流程圖

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

底層原理

Docker是怎麼工作的?

Docker是一個Client-Server結構的系統,Docker的守護程序運作在主機上。通過Socket從用戶端通路!

Docker-Server接收到Docker-Client的指令,就會執行這個指令!

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

docker為什麼比VM快

1、docker有着比虛拟機更少的抽象層。由于docker不需要Hypervisor實作硬體資源虛拟化,運作在docker容器上的程式直接使用的都是實際實體機的硬體資源。是以在CPU、記憶體使用率上docker将會在效率上有明顯優勢。

2、docker利用的是主控端的核心,而不需要Guest OS。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習
GuestOS: VM(虛拟機)裡的的系統(OS)
HostOS:實體機裡的系統(OS)
           

是以,當建立一個 容器時,docker不需要和虛拟機一樣重新加載一個作業系統核心。仍而避免引導、加載作業系統核心這個比較費時費資源的過程,當建立一個虛拟機時,虛拟機軟體需要加載GuestOS,這個建立過程是分鐘級别的。而docker由于直接利用主控端的作業系統,則省略了這個複雜的過程,是以建立一個docker容器隻需要幾秒鐘。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

之後學習完所有的指令再回過頭來看這段理論,就會很清晰。

Docker指令

基本指令

指令幫助文檔位址:https://docs.docker.com/reference/

docker version    #檢視docker的版本資訊
docker info       #顯示docker的系統資訊,包括鏡像和容器的數量
docker 指令 ——help #幫助指令
           

鏡像指令

[[email protected] /]# docker images 
REPOSITORY    TAG       IMAGE ID       CREATED      SIZE
hello-world   latest    d1165f221234   4 days ago   13.3kB
#鏡像的倉庫源  鏡像的标簽   鏡像的ID         鏡像建立的時間 鏡像的大
小

#可選項(常用)
  -a, --all   # 列出所有鏡像         
  -q, --quiet # 隻顯示鏡像的ID
  
#搜尋指令 search
[[email protected] /]# docker search mysql

#可選項
[[email protected] /]# docker search --help

Usage:  docker search [OPTIONS] TERM

Search the Docker Hub for images

Options:
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output
# --filter 隻搜尋stars大于500以上的
[[email protected] /]# docker search mysql --filter=STARS=500
NAME                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                MySQL is a widely used, open-source relation…   10593     [OK]       
mariadb              MariaDB Server is a high performing open sou…   3968      [OK]       
mysql/mysql-server   Optimized MySQL Server Docker images. Create…   778                  [OK]
percona              Percona Server is a fork of the MySQL relati…   528       [OK]   

#下載下傳鏡像 docker pull 鏡像名[:tag],tag是docker-hub 商店裡面應用存在的版本号,商店中沒有的版本無法下載下傳
[[email protected] /]# docekr pull mysql
-bash: docekr: command not found
[[email protected] /]# docker pull mysql
Using default tag: latest #不寫tag,預設就是latest
latest: Pulling from library/mysql
a076a628af6f: Pull complete #分層下載下傳,docker images 核心 聯合檔案系統
f6c208f3f991: Pull complete 
88a9455a9165: Pull complete 
406c9b8427c6: Pull complete 
7c88599c0b25: Pull complete 
25b5c6debdaf: Pull complete 
43a5816f1617: Pull complete 
1a8c919e89bf: Pull complete 
9f3cf4bd1a07: Pull complete 
80539cea118d: Pull complete 
201b3cad54ce: Pull complete 
944ba37e1c06: Pull complete 
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c # 簽名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  #真實位址
#指定版本下載下傳
[[email protected] /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Already exists #檔案共用,已存在已下載下傳的檔案不再重複下載下傳,極大地節省記憶體
f6c208f3f991: Already exists 
88a9455a9165: Already exists 
406c9b8427c6: Already exists 
7c88599c0b25: Already exists 
25b5c6debdaf: Already exists 
43a5816f1617: Already exists 
1831ac1245f4: Pull complete 
37677b8c1f79: Pull complete 
27e4ac3b0f6e: Pull complete 
7227baa8c445: Pull complete 
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

[[email protected] /]# docker images 
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
hello-world   latest    d1165f221234   4 days ago    13.3kB
mysql         5.7       a70d36bc331a   7 weeks ago   449MB
mysql         latest    c8562eaf9d81   7 weeks ago   546MB

# 删除指定鏡像
[[email protected] /]# docker rmi -f a70d36bc331a
Untagged: mysql:5.7
Untagged: [email protected]:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Deleted: sha256:a70d36bc331a13d297f882d3d63137d24b804f29fa67158c40ad91d5050c39c5
Deleted: sha256:50c77bf7bcddd1f1d97789d80ac2404eec22c860c104e858620d2a2e321f0ef7
Deleted: sha256:14244329b83dfc8982398ee4104a548385652d2bffb957798ff86a419013efd6
Deleted: sha256:6d990477f90af28473eb601a9bca22253f6381e053c5a8edda0a4f027e124a3c
Deleted: sha256:ee0449796df204071589162fc16f8d65586312a40c68d1ba156c93c56f5e5ce8

#[[email protected] /]# docker rmi -f 鏡像id1 鏡像id2 鏡像id3
#删除全部鏡像
[[email protected] /]# docker rmi -f $(docker images -aq)
Untagged: hello-world:latest
Untagged: [email protected]:89b647c604b2a436fc3aa56ab1ec515c26b085ac0c15b0d105bc475be15738fb
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
Untagged: mysql:latest
Untagged: [email protected]:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
Deleted: sha256:c8562eaf9d81c779cbfc318d6e01b8e6f86907f1d41233268a2ed83b2f34e748
Deleted: sha256:1b649b85960473808c6b812fc30c3f6a3ff1c0ffdcba5c9435daf01cf7d5373a
Deleted: sha256:19cc889447050c16c797fd209fa114ee219de23facb37c00d4137a4ed4aad922
Deleted: sha256:3c793c06a026d276cf56a6a6a75527026ed9eafa7a7d21a438f7d5ed2314148e
Deleted: sha256:1e1cd89a2bc183a7fea3dab0b543e9924278321ad0921c22cc088adbf3c2e77b
Deleted: sha256:83b2015dfd000588c7c947b2d89b3be7a8e5a3abc6ab562668c358033aa779ec
Deleted: sha256:d08533f1e2acc40ad561a46fc6a76b54c739e6b24f077c183c5709e0a6885312
Deleted: sha256:4f9d91a4728e833d1062fb65a792f06e22e425f63824f260c8b5a64b776ddc38
Deleted: sha256:20bf4c759d1b0d0e6286d2145453af4e0e1b7ba3d4efa3b8bce46817ad4109de
Deleted: sha256:a9371bbdf16ac95cc72555c6ad42f79b9f03a82d964fe89d52bdc5f335a5f42a
Deleted: sha256:5b02130e449d94f51e8ff6e5f7d24802246198749ed9eb064631e63833cd8f1d
Deleted: sha256:ab74465b38bc1acb16c23091df32c5b7033ed55783386cb57acae8efff9f4b37
Deleted: sha256:cb42413394c4059335228c137fe884ff3ab8946a014014309676c25e3ac86864

#查詢全部都已經删除完畢
[[email protected] /]# docker images 
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE







           

容器指令

說明:我們有了鏡像才可以建立容器,liunx,下載下傳一個centos鏡像來測試學習

#之間講過的 直接 pull就行了
[[email protected] /]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete 
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

           

建立容器并啟動

docker run [可選參數] 

#參數說明 基本常用 全部請檢視 --help或者官方文檔
--name=“name” 容器名字 MySQL01 MySQL02,用來區分容器
-d 背景方式運作
-it 使用互動方式運作,進入容器進行檢視内容
-P  指定容器的端口 -P 8080:8080
   -P ip:主機端口:容器端口
   -P 主機端口:容器端口(常用)
   -P 容器端口
   直接指定容器端口也行
-p  随機指定端口    

# 測試啟動并進入容器
[[email protected] /]# docker run -it centos /bin/bash
[[email protected] /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

#退出容器
[[email protected] /]# exit
exit
#檢視容器内的centos,基礎版本,很多指令沒有完善。
[[email protected] /]# ls 
bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var



           

列出所有運作的容器

# docker ps 指令
# 列出目前正在運作的容器
-a # 列出目前正在運作的容器+帶出曆史運作過的容器
-n=? #顯示最近建立的容器,?表示顯示的數量。
-q #顯示容器編号
[[email protected] /]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[[email protected] /]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
eafb3befb9a5   centos         "/bin/bash"   3 minutes ago   Exited (0) 2 minutes ago             kind_sanderson
bb9ddcf15a43   d1165f221234   "/hello"      2 hours ago     Exited (0) 2 hours ago               boring_noyce
2598a89d1827   d1165f221234   "/hello"      5 hours ago     Exited (0) 5 hours ago               zen_bouman
[[email protected] /]# docker ps -n=1
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
eafb3befb9a5   centos    "/bin/bash"   9 minutes ago   Exited (0) 7 minutes ago             kind_sanderson
[[email protected] /]# docker ps -aq
eafb3befb9a5
bb9ddcf15a43
2598a89d1827

           

退出容器

exit #直接容器停止退出
Ctrl + P + Q #容器不停止退出

           

删除容器

docker rm 容器id #删除指定的容器,不能删除正在運作的容器,如需強制删除加上參數 -f
docker rm $(docker ps -aq) # 删除所有的容器
docker ps -a -q|xqrgs docker rm #删除所有的容器


[[email protected] /]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED              STATUS                      PORTS     NAMES
8c476eb7ac6e   centos         "/bin/bash"   About a minute ago   Up About a minute                     practical_cerf
eafb3befb9a5   centos         "/bin/bash"   15 minutes ago       Exited (0) 14 minutes ago             kind_sanderson
bb9ddcf15a43   d1165f221234   "/hello"      2 hours ago          Exited (0) 2 hours ago                boring_noyce
2598a89d1827   d1165f221234   "/hello"      5 hours ago          Exited (0) 5 hours ago                zen_bouman
[[email protected] /]# docker rm eafb3befb9a5 
eafb3befb9a5
[[email protected] /]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                   PORTS     NAMES
8c476eb7ac6e   centos         "/bin/bash"   2 minutes ago   Up 2 minutes                       practical_cerf
bb9ddcf15a43   d1165f221234   "/hello"      2 hours ago     Exited (0) 2 hours ago             boring_noyce
2598a89d1827   d1165f221234   "/hello"      5 hours ago     Exited (0) 5 hours ago             zen_bouman
[[email protected] /]# docker rm -f $(docker ps -aq)
8c476eb7ac6e
bb9ddcf15a43
2598a89d1827
[[email protected] /]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

           

啟動和停止容器的操作

docker start 容器id   #啟動容器
docker restart 容器id #重新開機容器
docker stop 容器id    #停止目前正在運作的容器
docker kill 容器id    #強制停止目前容器

           

常用的其它指令

背景啟動容器

#指令 docker run -d 鏡像名
[[email protected] /]# docker run -d centos
c4c3fe45386a572b76b110a521481f7d165f1e8c32a3aa359870f9364e829134
[[email protected] /]# docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[[email protected] /]# 
#問題docker PS,發現centos停止了。
#docker 容器使用背景運作,就必行要有一個前台程序,docker發現沒有應用,就會自動停止。
#Nginx,容器啟動後,發現自己沒有提供服務,就會立刻停止,就是沒有程式了
           

檢視日志

#通過shell腳本模拟日志
[[email protected] /]# docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done"
e598481e2c11f12fa301d29f361e7d2247985fba54620e81757f09f2c3c423fd
[[email protected] /]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
e598481e2c11   centos    "/bin/sh -c 'while t…"   19 seconds ago   Up 18 seconds             strange_tharp
[[email protected] /]# docker logs -tf --tail 10 e598481e2c11
2021-03-10T10:33:01.016503726Z 6666
2021-03-10T10:33:02.018478185Z 6666
2021-03-10T10:33:03.020801113Z 6666
2021-03-10T10:33:04.022784436Z 6666
2021-03-10T10:33:05.024788114Z 6666
2021-03-10T10:33:06.026739830Z 6666
2021-03-10T10:33:07.028655993Z 6666
2021-03-10T10:33:08.031886421Z 6666
2021-03-10T10:33:09.034487008Z 6666
2021-03-10T10:33:10.036418498Z 6666
2021-03-10T10:33:11.038581752Z 6666
2021-03-10T10:33:12.040528786Z 6666
2021-03-10T10:33:13.042594899Z 6666
2021-03-10T10:33:14.050412235Z 6666
2021-03-10T10:33:15.052447800Z 6666
2021-03-10T10:33:16.054290434Z 6666
2021-03-10T10:33:17.056320440Z 6666
#顯示日志
-tf           #顯示日志
--tail number #要顯示日志的條數


           

檢視容器中程序資訊

[[email protected]haimian ~]# docker top 容器id
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4253                4233                0                   08:56               pts/0               00:00:00            /bin/bash
           

檢視中繼資料

[[email protected] ~]# docker inspect 容器id
[
    {
        "Id": "9b04278c721c6a32280f5a6b2cfca4d09695197e0eb054334eff32fa9d34f4c2",
        "Created": "2021-03-11T00:56:04.357924839Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 4253,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-03-11T00:56:04.620762643Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
        "ResolvConfPath": "/var/lib/docker/containers/9b04278c721c6a32280f5a6b2cfca4d09695197e0eb054334eff32fa9d34f4c2/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/9b04278c721c6a32280f5a6b2cfca4d09695197e0eb054334eff32fa9d34f4c2/hostname",
        "HostsPath": "/var/lib/docker/containers/9b04278c721c6a32280f5a6b2cfca4d09695197e0eb054334eff32fa9d34f4c2/hosts",
        "LogPath": "/var/lib/docker/containers/9b04278c721c6a32280f5a6b2cfca4d09695197e0eb054334eff32fa9d34f4c2/9b04278c721c6a32280f5a6b2cfca4d09695197e0eb054334eff32fa9d34f4c2-json.log",
        "Name": "/nervous_tharp",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/71d8502f96fe3491087c496beed13c2a556440cd645343baf6324630f1758ef4-init/diff:/var/lib/docker/overlay2/b250fa3307e25d8fe349fc1ab141f9e17a65b53f7dd1efd8ae77a85d6a2c2f34/diff",
                "MergedDir": "/var/lib/docker/overlay2/71d8502f96fe3491087c496beed13c2a556440cd645343baf6324630f1758ef4/merged",
                "UpperDir": "/var/lib/docker/overlay2/71d8502f96fe3491087c496beed13c2a556440cd645343baf6324630f1758ef4/diff",
                "WorkDir": "/var/lib/docker/overlay2/71d8502f96fe3491087c496beed13c2a556440cd645343baf6324630f1758ef4/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "9b04278c721c",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20201204",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "433bb847363bdb8e427808cba6ab8c4ec393a7cc47c581ca46a809c56147c465",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/433bb847363b",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "946467ddce58eea2929f97f93987f75556f53e7dca2d81300e210942e6248643",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "090280e003617c467adbb6fba6bcb1342a5b5e419a82a6d1f2eb8deec3d89933",
                    "EndpointID": "946467ddce58eea2929f97f93987f75556f53e7dca2d81300e210942e6248643",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]
           

進入目前正在運作的容器

#我們通常容器都是使用背景方式運作的,需要進入容器,進行一些修改
#指令
docker exec -it 容器id /bin/bash
#測試
[[email protected] ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
9b04278c721c   centos    "/bin/bash"   18 minutes ago   Up 18 minutes             nervous_tharp
[[email protected] ~]# docker exec -it 9b04278c721c /bin/bash
[[email protected] /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[[email protected] /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 00:56 pts/0    00:00:00 /bin/bash
root        15     0  0 01:15 pts/1    00:00:00 /bin/bash
root        30    15  0 01:15 pts/1    00:00:00 ps -ef

#方式二
docker attach 容器id
#測試
[[email protected] ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
9b04278c721c   centos    "/bin/bash"   24 minutes ago   Up 24 minutes             nervous_tharp
[[email protected] ~]# docker attach 9b04278c721c
正在執行目前的代碼...

#docker exec   #進入容器後開啟一個新的終端,可以在裡面操作(常用)
#docker attach #進入容器正在執行的終端,不會啟動新的程序。
           

從容器内拷貝檔案到主機上

docker cp 容器id:容器目錄位址 主機位址

#檢視目前主機下目錄檔案
[[email protected] home]# ls
paidaxing.txt
#進入容器
[[email protected] home]# docker attach e5dfa59ded55
#建立測試檔案
[[email protected] /]# touch test.txt
[[email protected] /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  paidaxing.txt  proc  root  run  sbin  srv  sys  test.txt	tmp  usr  var
#退出容器cope到主機目錄上
[[email protected] home]# docker cp e5dfa59ded55:/test.txt /home
#檢視檔案,cope到了
[[email protected] home]# ls
paidaxing.txt  test.txt

           

學習方式:将所有的指令全部敲一遍,自己記錄筆記!

小結

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

常用代碼合集

attach    attach to a running container        #目前 shell下attach連接配接指定運作鏡像
build     build an image from a dockerfile     #通過dockerfile定制鏡像
commit    create a new image from a container  #送出目前容器為新的鏡像
cp        cope files/folders from the containers filesystem to the host path #從容器中拷貝指定檔案或目錄到主控端
create    create a new container               #建立一個新的容器,同run,但不啟動容器
diff      inspect changes on a container’s filesystem #檢視docker容器變化
events    get real time events from the server #從docker服務擷取容器實時事件
exec      run a command in an existing container #在已存在的容器上運作指令
export    stream the contents of a container as a tar archive #導出容器的内容流作為一個tar歸檔檔案[對應import]
history   show the history of an image        #展示一個鏡像形成曆史
images    list images                          #列出目前鏡像
import    create a new filesystem image from the contents of a tarball #從tar包中的内容建立一個新的檔案系統映像[對應export]
info      display system-wide information # 顯示系統相關資訊
inspect   return low-level information on a container #檢視容器詳細資訊
kill kill a running container #kill 指定docker容器
load      load an image from a tar archive #從一個tar包中加載一個鏡像[對應save]
login     register or login to the docker registry server #注冊或者登陸一個docker源伺服器
logout    log out from a docker registry server #從目前docker registry 退出
logs      fetch the logs of a container #輸出目前容器日期資訊
port      lookup the public-facing port which is nat-ed to private_port #檢視映射端口對應的容器内部端口
pause     pause all processes within a container #暫停容器
PS        list continues #列出容器清單
pull      pull an image or a repository from the docker registry server #從docker鏡像源伺服器拉取指定鏡像或者庫鏡像
push      push an image or a repository from the docker registry server #推送指定鏡像或者庫鏡像至docker源伺服器
restart   restart a running container #重新開機運作容器
rm        remove one or more containers #移除一個或者多個容器
rmi       remove one or more images #移除一個或者多個鏡像[無容器使用改鏡像才可删除,否則删除相關内容才可繼續或 -f 強制删除]
run       run a command in a new container #建立一個新的容器并運作一個指令
save      save 按 image to a tar archive #儲存一個鏡像為一個tar包[對應load]
search    search for an image on the docker hub #在docker hub中搜尋鏡像
start     start a stopped containers #啟動容器
stop      stop a running processes of a container #停止容器
top       lookup the running processes of container #檢視容器中運作的程序資訊
tag       tag an image info a repository # 給源中鏡像打标簽
UNpause   UNpause a paused container #取消暫停容器
version   show the docker version information #檢視docker版本号
wait      block until a container stops,then print its exit code #截取容器停止時的退出狀态值

           

作業練習

#1、搜尋鏡像
[[email protected] ~]# docker search Nginx
NAME                               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                              Official build of Nginx.                        14547     [OK]       
jwilder/nginx-proxy                Automated Nginx reverse proxy for docker con…   1982                 [OK]
richarvey/nginx-php-fpm            Container running Nginx + PHP-FPM capable of…   810                  [OK]
jc21/nginx-proxy-manager           Docker container for managing Nginx proxy ho…   158                  
linuxserver/nginx                  An Nginx container, brought to you by LinuxS…   142                  
tiangolo/nginx-rtmp                Docker image with Nginx using the nginx-rtmp…   115                  [OK]
jlesage/nginx-proxy-manager        Docker container for Nginx Proxy Manager        97                   [OK]
bitnami/nginx                      Bitnami nginx Docker Image                      94                   [OK]
alfg/nginx-rtmp                    NGINX, nginx-rtmp-module and FFmpeg from sou…   89                   [OK]
jasonrivers/nginx-rtmp             Docker images to host RTMP streams using NGI…   88                   [OK]
nginxdemos/hello                   NGINX webserver that serves a simple page co…   67                   [OK]
privatebin/nginx-fpm-alpine        PrivateBin running on an Nginx, php-fpm & Al…   49                   [OK]
nginx/nginx-ingress                NGINX Ingress Controller for Kubernetes         49                   
nginxinc/nginx-unprivileged        Unprivileged NGINX Dockerfiles                  31                   
schmunk42/nginx-redirect           A very simple container to redirect HTTP tra…   19                   [OK]
staticfloat/nginx-certbot          Opinionated setup for automatic TLS certs lo…   19                   [OK]
nginx/nginx-prometheus-exporter    NGINX Prometheus Exporter                       16                   
centos/nginx-112-centos7           Platform for running nginx 1.12 or building …   15                   
centos/nginx-18-centos7            Platform for running nginx 1.8 or building n…   13                   
raulr/nginx-wordpress              Nginx front-end for the official wordpress:f…   13                   [OK]
flashspys/nginx-static             Super Lightweight Nginx Image                   9                    [OK]
bitnami/nginx-ingress-controller   Bitnami Docker Image for NGINX Ingress Contr…   8                    [OK]
mailu/nginx                        Mailu nginx frontend                            8                    [OK]
ansibleplaybookbundle/nginx-apb    An APB to deploy NGINX                          2                    [OK]
wodby/nginx                        Generic nginx                                   1                    [OK]
#2、下載下傳鏡像 鏡像名稱不能大寫。。。
[[email protected] ~]# docker pull Nginx
invalid reference format: repository name must be lowercase
[[email protected] ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a076a628af6f: Pull complete 
0732ab25fa22: Pull complete 
d7f36f6fe38f: Pull complete 
f72584a26f32: Pull complete 
7125e4df9063: Pull complete 
Digest: sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
#3、檢視下載下傳好的鏡像
[[email protected] ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    f6d0b4767a6c   8 weeks ago    133MB
centos       latest    300e315adb2f   3 months ago   209MB
#4、運作容器測試
[[email protected] ~]# docker run -d --name nginx01 -p 3344:80 nginx
efb55f5c5ac7b696491a15e64b984e91c6c9868f92b2e85bc4a6439c2979c386
[[email protected] ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                  NAMES
efb55f5c5ac7   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds   0.0.0.0:3344->80/tcp   nginx01
e5dfa59ded55   centos    "/bin/bash"              5 hours ago      Up 5 hours                            heuristic_lamport
#Welcome to nginx!表示沒有問題
[[email protected] ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
#5、進入容器
[[email protected] ~]# docker exec -it nginx01 /bin/bash
[email protected]:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
[email protected]:/# cd /etc/nginx
[email protected]:/etc/nginx# ls
conf.d	fastcgi_params	koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params	uwsgi_params  win-utf

           

端口映射

-p 外部端口:容器端口
           
狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

通過公網位址通路也沒有問題

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

作業2

#docker 來裝一個Tomcat
#官方文檔給出的代碼:docker run -it --rm tomcat:9.0
#我們之前的啟動都是背景,停止了容器之後,容器還是可以,--rm 一般用來測試,用完即删
#我們不用官方這個
[[email protected] ~]# docker pull tomcat:9.0
9.0: Pulling from library/tomcat
Digest: sha256:94cc18203335e400dbafcd0633f33c53663b1c1012a13bcad58cced9cd9d1305
Status: Image is up to date for tomcat:9.0
docker.io/library/tomcat:9.0
#下載下傳成功
[[email protected] ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
tomcat       9.0       040bdb29ab37   8 weeks ago    649MB
nginx        latest    f6d0b4767a6c   8 weeks ago    133MB
centos       latest    300e315adb2f   3 months ago   209MB
#安裝步驟就不多說了,和Nginx一樣的,安裝完成之後我們啟動了容器通過端口映射,在公網範圍的時候發現沒有Tomcat初始界面。這是因為阿裡雲的原因,預設是最小的鏡像,所有不必要的都剔除掉
#保證最小的可運作環境
#但是我們發現在WebApps.dist 有我們需要的檔案,直接cope到WebApps目錄下即可。
[[email protected] ~]# docker run -d -p 3355:8080 --name tomcat01 tomcat
[[email protected] ~]# docker exec -it tomcat01 /bin/bash
[email protected]:/usr/local/tomcat# ls
BUILDING.txt	 LICENSE  README.md	 RUNNING.txt  conf  logs	    temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin	      lib   native-jni-lib  webapps  work
[email protected]:/usr/local/tomcat# cd webapps.dist
[email protected]:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager
[email protected]:/usr/local/tomcat/webapps.dist# cd ..
[email protected]:/usr/local/tomcat# cp -r webapps.dist/* webapps
[email protected]:/usr/local/tomcat# cd webapps
[email protected]:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager


           

沒有問題的。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

作業3

#部署es+kibana
#es 十分耗記憶體
#es 的資料一般需要放置到安全目錄挂在!
#--net somenetwork 網絡配置
docker network create somenetwork
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#es下載下傳好了
[[email protected] ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
tomcat          9.0       040bdb29ab37   8 weeks ago     649MB
tomcat          latest    040bdb29ab37   8 weeks ago     649MB
nginx           latest    f6d0b4767a6c   8 weeks ago     133MB
centos          latest    300e315adb2f   3 months ago    209MB
elasticsearch   7.6.2     f29a1ee41030   11 months ago   791MB

[[email protected] ~]# docker network create somenetwork
63d3626d7dc7dbe327bff56b01bceb072bb25e6eb6e1d05ab668343c825ab030
[[email protected] ~]# docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
7079aa33b1bea3526315c3ccdb2fd581f478e5f973096698202d0eacb3edffa7
[[email protected] ~]# docker stats 記憶體已經使用了70%多
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET I/O   BLOCK I/O       PIDS
7079aa33b1be   elasticsearch   0.38%     1.241GiB / 1.694GiB   73.25%    0B / 0B   265MB / 733kB   43
#記憶體太大了,我們需要修改配置設定
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

[[email protected] ~]# docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
43a90d0eee76f1776e450c639a9952ea7acdd7f2591025d264e3b2641e5db062
[[email protected] ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                            NAMES
43a90d0eee76   elasticsearch:7.6.2   "/usr/local/bin/dock…"   4 seconds ago   Up 3 seconds   0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch
#啟動之後我們發現比之前的記憶體小多了
[[email protected] ~]# docker stats

CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET I/O   BLOCK I/O        PIDS
43a90d0eee76   elasticsearch   0.02%     382.1MiB / 1.694GiB   22.03%    0B / 0B   82.9MB / 696kB   44
#沒有問題
[[email protected] ~]# curl localhost:9200
{
  "name" : "43a90d0eee76",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "isNkwujwQbCW-kK5uPTZJw",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
           

可視化

portainer
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
rancher(CI/CD用)
#下載下傳成功
[[email protected] ~]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
d1e017099d17: Pull complete 
717377b83d5c: Pull complete 
Digest: sha256:f8c2b0a9ca640edf508a8a0830cf1963a1e0d2fd9936a64104b3f658e120b868
Status: Downloaded newer image for portainer/portainer:latest
b6cac10ec0295cafc5d3646bae7eb702ce05b843ba74c8eea1aef8fbe5a17c7c

           

通過公網位址通路portainer,建立好使用者之後選擇登陸

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

我們選擇本地,可以看到一些基礎的資訊。其它的自行檢視了。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

平時用的比較少,用來測試玩玩就好了。

Docker鏡像講解

鏡像是什麼

鏡像是一種輕量級、可執行的獨立軟體保,用來打包軟體運作環境和基于運作環境開發的軟體,他包含運作某個軟體所需的所有内容,包括代碼、運作時庫、環境變量和配置檔案。所有應用,直接打包docker鏡像,就可以直接跑起來!

如何得到鏡像

  • 從遠端倉庫下載下傳
  • 别人拷貝給你
  • 自己制作一個鏡像 DockerFile

Docker鏡像加載原理

UnionFs (聯合檔案系統)

UnionFs(聯合檔案系統):Union檔案系統(UnionFs)是一種分層、輕量級并且高性能的檔案系統,他支援對檔案系統的修改作為一次送出來一層層的疊加,同時可以将不同目錄挂載到同一個虛拟檔案系統下( unite several directories into a single virtual filesystem)。Union檔案系統是 Docker鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像

特性:一次同時加載多個檔案系統,但從外面看起來,隻能看到一個檔案系統,聯合加載會把各層檔案系統疊加起來,這樣最終的檔案系統會包含所有底層的檔案和目錄。

Docker鏡像加載原理

docker的鏡像實際上由一層一層的檔案系統組成,這種層級的檔案系統UnionFS。

boots(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引導加 kernel, Linux剛啟動時會加bootfs檔案系統,在 Docker鏡像的最底層是 boots。這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和核心。當boot加載完成之後整個核心就都在記憶體中了,此時記憶體的使用權已由 bootfs轉交給核心,此時系統也會解除安裝bootfs。

rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系統中的/dev,/proc,/bin,/etc等标準目錄和檔案。 rootfs就是各種不同的作業系統發行版,比如 Ubuntu, Centos等等。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

平時我們安裝進虛拟機的CentOS都是好幾個G,為什麼Docker這裡才200M?

[[email protected] ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
tomcat                9.0       040bdb29ab37   8 weeks ago     649MB
tomcat                latest    040bdb29ab37   8 weeks ago     649MB
nginx                 latest    f6d0b4767a6c   8 weeks ago     133MB
centos                latest    300e315adb2f   3 months ago    209MB
portainer/portainer   latest    62771b0b9b09   7 months ago    79.1MB
elasticsearch         7.6.2     f29a1ee41030   11 months ago   791MB

           

對于個精簡的OS,rootfs可以很小,隻需要包合最基本的指令,工具和程式庫就可以了,因為底層直接用Host的kernel,自己隻需要提供rootfs就可以了。由此可見對于不同的Linux發行版, boots基本是一緻的, rootfs會有差別,是以不同的發行版可以公用bootfs.虛拟機是分鐘級别,容器是秒級!

分層了解

分層的鏡像

我們可以去下載下傳一個鏡像,注意觀察下載下傳的日志輸出,可以看到是一層層的在下載下傳

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

思考:為什麼Docker鏡像要采用這種分層的結構呢?

最大的好處,我覺得莫過于資源共享了!比如有多個鏡像都從相同的Base鏡像建構而來,那麼主控端隻需在磁盤上保留一份base鏡像,同時記憶體中也隻需要加載一份base鏡像,這樣就可以為所有的容器服務了,而且鏡像的每一層都可以被共享。

檢視鏡像分層的方式可以通過docker image inspect 指令

[[email protected] ~]# docker image inspect centos
[
    {
        "Id": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
        "RepoTags": [
            "centos:latest"
        ],
        "RepoDigests": [
            "[email protected]:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2020-12-08T00:22:53.076477777Z",
        "Container": "395e0bfa7301f73bc994efe15099ea56b8836c608dd32614ac5ae279976d33e4",
        "ContainerConfig": {
            "Hostname": "395e0bfa7301",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
            "Image": "sha256:6de05bdfbf9a9d403458d10de9e088b6d93d971dd5d48d18b4b6758f4554f451",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20201204",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "DockerVersion": "19.03.12",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "sha256:6de05bdfbf9a9d403458d10de9e088b6d93d971dd5d48d18b4b6758f4554f451",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20201204",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 209348104,
        "VirtualSize": 209348104,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/b250fa3307e25d8fe349fc1ab141f9e17a65b53f7dd1efd8ae77a85d6a2c2f34/merged",
                "UpperDir": "/var/lib/docker/overlay2/b250fa3307e25d8fe349fc1ab141f9e17a65b53f7dd1efd8ae77a85d6a2c2f34/diff",
                "WorkDir": "/var/lib/docker/overlay2/b250fa3307e25d8fe349fc1ab141f9e17a65b53f7dd1efd8ae77a85d6a2c2f34/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:2653d992f4ef2bfd27f94db643815aa567240c37732cae1405ad1c1309ee9859"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

           

所有的 Docker鏡像都起始于一個基礎鏡像層,當進行修改或培加新的内容時,就會在目前鏡像層之上,建立新的鏡像層。

舉一個簡單的例子,假如基于 Ubuntu Linux16.04建立一個新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加 Python包,

就會在基礎鏡像層之上建立第二個鏡像層;如果繼續添加一個安全更新檔,就會創健第三個鏡像層該像目前已經包含3個鏡像層,如下圖所示(這隻是一個用于示範的很簡單的例子)。

在添加額外的鏡像層的同時,鏡像始終保持是目前所有鏡像的組合,了解這一點.

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

在添加額外的鏡像層的同時,鏡像始終保持是目前所有鏡像的組合,了解這一點非常重要。下圖中舉了一個簡單的例子,每個鏡像層包含3個檔案,而鏡像包含了來自兩個鏡像層的6個檔案。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

上圖中的鏡像層跟之前圖中的略有區別,主要目的是便于展示檔案

下圖中展示了一個稍微複雜的三層鏡像,在外部看來整個鏡像隻有6個檔案,這是因為最上層中的檔案7是檔案5的一個更新版。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

文中情況下,上層鏡像層中的檔案覆寫了底層鏡像層中的檔案。這樣就使得檔案的更新版本作為一個新鏡像層添加到鏡像當中

Docker通過存儲引擎(新版本采用快照機制)的方式來實作鏡像層堆棧,并保證多鏡像層對外展示為統一的檔案系統

Linux上可用的存儲引撃有AUFS、 Overlay2、 Device Mapper、Btrfs以及ZFS。顧名思義,每種存儲引擎都基于 Linux中對應的

件系統或者塊裝置技術,井且每種存儲引擎都有其獨有的性能特點。

Docker在 Windows上僅支援 windowsfilter 一種存儲引擎,該引擎基于NTFS檔案系統之上實作了分層和CoW [1]。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

特點Docker 鏡像都是隻讀的,當容器啟動時,一個新的可寫層加載到鏡像的頂部!

這一層就是我們通常說的容器層,容器之下的都叫鏡像層!

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

commit鏡像

docker commit 送出容器成為一個新的副本
#指令和git原理類似
docker commit -m "送出的描述資訊" -a-"作者" 容器id 目标鏡像名:[TAG]
#實戰測試
# 1、啟動一個預設的tomcat
# 2、發現這個預設的tomcat 是沒有webapps應用,官方的鏡像預設webapps下面是沒有檔案的!
# 3、從webapps.dist拷貝檔案進去webapp
#這幾步都是之前作業裡面的就不放代碼了
#4、上傳之前修改過的Tomcat檔案
[[email protected] ~]# docker commit -a="paidaxing" -m="add webapps app" 87333a05a9f6 tomcat02:1.0
sha256:2cef4ca7716dae5564ecf80124e60bd6a7b3a487541ab5855a4812da5a209955
[[email protected] ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
tomcat02              1.0       2cef4ca7716d   6 seconds ago   654MB
tomcat                9.0       040bdb29ab37   8 weeks ago     649MB
tomcat                latest    040bdb29ab37   8 weeks ago     649MB
nginx                 latest    f6d0b4767a6c   8 weeks ago     133MB
centos                latest    300e315adb2f   3 months ago    209MB
portainer/portainer   latest    62771b0b9b09   7 months ago    79.1MB
elasticsearch         7.6.2     f29a1ee41030   11 months ago   791MB

#如果你想要儲存目前容器的狀态,就可以通過commit來送出,獲得一個鏡像,就好比我們我們使用虛拟機的快照。

#到這裡才算入門。
           

資料容器卷

什麼是容器資料卷

docker的理念回顧

将應用和環境打包成一個鏡像!

如果資料都在容器中,那麼我們容器删除,資料就會丢失! 需求:資料可以持久化。

MySQL,容器删了,删庫跑路!需求:MySQL資料可以存儲在本地!

容器之間可以有一個資料共享的技術!docker容器中産生的資料,同步到本地!

這就是卷技術!目錄的挂載,将我們容器内的目錄,挂載到liunx上面。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

總結一句話:容器的持久化和同步操作!容器間也是可以資料共享的!

使用資料卷

#方式一:直接使用指令來挂載 -v
docker run -it -v 主機目錄:容器目錄
[[email protected] ~]# docker run -it -v /home/ceshi2:/home centos /bin/bash
#在容器内部建立測試檔案
[[email protected] /]# cd /home
[[email protected] home]# ls
[[email protected] home]# touch ceshi.txt 
[[email protected] home]# ls
ceshi.txt
#在主控端上檢視挂載目錄檔案
[[email protected] ceshi2]# docker inspect 容器id
#看到目錄已經對應上了
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/ceshi2",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }

[[email protected] home]# cd /home/ceshi2
[[email protected] ceshi2]# ls
ceshi.txt
#可以看到檔案已經挂載到主控端上面了
#測試一下從主控端到容器内是否可以
#vim 進test.java編輯helloword!
[[email protected] ceshi2]# vim test.java
#從容器上列印輸出,沒有問題,資料已經挂載過來/
[[email protected] home]# cat test.java
hello word !
#好處:我們以後修改隻需要在本地修改即可,容器内會自動同步!

           

實戰:安裝MySQL

#官方文檔
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#我們自己啟動容器的指令
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
#測試連接配接:注意3310端口要在阿裡雲伺服器的安全組中打開,否則無法連接配接。
#通過sqlyog來測試

#接着我們在資料庫上建立一個test資料庫,可以在主控端data檔案中看到這個test檔案,說明檔案挂載是沒有問題的。
[[email protected] home]# cd /home/mysql
[[email protected] mysql]# ls
conf  data
[[email protected] mysql]# cd data
[[email protected] data]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem   test
#把啟動的MySQL01容器删掉之後,我們再去檢視data目錄資料也是存在的,不用再擔心删庫跑路了。
           

可以看到遠端連接配接MySQL服務沒有問題

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

具名和匿名挂載

# 匿名挂載
-v 容器内路徑!
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 檢視所有的volume(卷)的情況
[[email protected] /]# docker volume ls
DRIVER    VOLUME NAME
local     8c4f2eaefebd32b784282a017216d9f95b9ed574686c53ad104baef5a2081f83
local     22cc1a5276452507a161e1f439c5dd35e1342d48effccf4bde4459f82bee7bf8
local     28f275a528a2e7b660a062ab76d61747607a662a565a648a3fa302ef66e5c0b1
local     301f0fd19527fd0fc4c877aa5ac14401c7bd5ff144b26908fefcd7c989a03942

# 具名挂載 -P:表示随機映射端口
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
[[email protected] /]# docker volume ls
DRIVER    VOLUME NAME
local     8c4f2eaefebd32b784282a017216d9f95b9ed574686c53ad104baef5a2081f83
local     22cc1a5276452507a161e1f439c5dd35e1342d48effccf4bde4459f82bee7bf8
local     28f275a528a2e7b660a062ab76d61747607a662a565a648a3fa302ef66e5c0b1
local     301f0fd19527fd0fc4c877aa5ac14401c7bd5ff144b26908fefcd7c989a03942
local     juming-nginx

#檢視容器内路徑
[[email protected] /]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2021-03-12T15:28:59+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]
#所有的docker容器内的卷,沒有指定目錄的情況下都是在**/var/lib/docker/volumes/自定義的卷名/_data**下,
#如果指定了目錄,docker volume ls 是檢視不到的。
#我們通過具名挂載可以友善的找到我們的一個卷,大多數情況下我們使用具名挂載。

#如何确定是具名挂載還是匿名挂載,還是指定路徑挂載。
-v 容器内路徑   #匿名挂載
-v 卷名:容器内路徑 #具名挂載
-v /主控端路徑:容器内路徑 #指定路徑挂載

#拓展
# 通過 -v 容器内路徑: ro rw 改變讀寫權限
#一旦設定了容器權限,容器對我們挂載出來的内容就有限定了。
ro #readonly 隻讀
rw #readwrite 可讀可寫
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 隻要看到ro就說明這個路徑隻能通過主控端來操作,容器内部是無法操作!
           

初識Dockerfile

#Dockerfile 就是用來建構docker鏡像的建構檔案!指令腳本!先體驗一下!
#通過這個腳本可以生成鏡像,鏡像是一層一層的,腳本是一個個的指令,每個指令都是一層!
[[email protected] home]# mkdir docker-test-volume
[[email protected] home]# ls
ceshi  ceshi2  docker-test-volume  mysql  test.txt

[[email protected] docker-test-volume]# vim dockerfile1
$ vim dockerfile1
    FROM centos 					# 目前這個鏡像是以centos為基礎的

    VOLUME ["volume01","volume02"] 	# 挂載卷的卷目錄清單(多個目錄)匿名挂載

    CMD echo "-----end-----"		# 輸出一下用于測試
    CMD /bin/bash					# 預設走bash控制台
[[email protected] docker-test-volume]# cat dockerfile1
from centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash

[[email protected] docker-test-volume]# docker build -f dockerfile1 -t paidaxing/centos:9.1 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in 0063f9fc9fe7
Removing intermediate container 0063f9fc9fe7
 ---> a3d86ee7e84e
Step 3/4 : CMD echo "----end----"
 ---> Running in c3cb71e4c615
Removing intermediate container c3cb71e4c615
 ---> 37a72a286603
Step 4/4 : CMD /bin/bash
 ---> Running in ec28fafc6700
Removing intermediate container ec28fafc6700
 ---> 3bb6b30650fe
Successfully built 3bb6b30650fe
Successfully tagged paidaxing/centos:9.1
[[email protected] docker-test-volume]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
paidaxing/centos      9.1       3bb6b30650fe   24 seconds ago   209MB
tomcat02              1.0       2cef4ca7716d   7 hours ago      654MB
mysql                 5.7       a70d36bc331a   7 weeks ago      449MB
tomcat                9.0       040bdb29ab37   8 weeks ago      649MB
tomcat                latest    040bdb29ab37   8 weeks ago      649MB
nginx                 latest    f6d0b4767a6c   8 weeks ago      133MB
centos                latest    300e315adb2f   3 months ago     209MB
portainer/portainer   latest    62771b0b9b09   7 months ago     79.1MB
elasticsearch         7.6.2     f29a1ee41030   11 months ago    791MB
#開啟我們自己打包鏡像
[[email protected] docker-test-volume]# docker run -it 3bb6b30650fe /bin/bash
[[email protected] /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root  360 Mar 12 08:20 dev
drwxr-xr-x   1 root root 4096 Mar 12 08:20 etc
drwxr-xr-x   2 root root 4096 Nov  3 15:22 home
lrwxrwxrwx   1 root root    7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3 15:22 lib64 -> usr/lib64
drwx------   2 root root 4096 Dec  4 17:37 lost+found
drwxr-xr-x   2 root root 4096 Nov  3 15:22 media
drwxr-xr-x   2 root root 4096 Nov  3 15:22 mnt
drwxr-xr-x   2 root root 4096 Nov  3 15:22 opt
dr-xr-xr-x 111 root root    0 Mar 12 08:20 proc
dr-xr-x---   2 root root 4096 Dec  4 17:37 root
drwxr-xr-x  11 root root 4096 Dec  4 17:37 run
lrwxrwxrwx   1 root root    8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3 15:22 srv
dr-xr-xr-x  13 root root    0 Mar 12 08:20 sys
drwxrwxrwt   7 root root 4096 Dec  4 17:37 tmp
drwxr-xr-x  12 root root 4096 Dec  4 17:37 usr
drwxr-xr-x  20 root root 4096 Dec  4 17:37 var
drwxr-xr-x   2 root root 4096 Mar 12 08:20 volume01
drwxr-xr-x   2 root root 4096 Mar 12 08:20 volume02

[[email protected] data]# docker inspect 41f048f757fe

        "Mounts": [
            {
                "Type": "volume",
                "Name": "63a7b1f1b480889a2f5b7a38538ae0fe639d27a621c2e575c12539bee009738f",
                "Source": "/var/lib/docker/volumes/63a7b1f1b480889a2f5b7a38538ae0fe639d27a621c2e575c12539bee009738f/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "85cbb117c2fdecccfce1d22290ecc6be05078e920911b7e7051418dca04755f1",
                "Source": "/var/lib/docker/volumes/85cbb117c2fdecccfce1d22290ecc6be05078e920911b7e7051418dca04755f1/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }


           

資料卷容器

多個MySQL同步資料

命名的容器挂載資料卷

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習
[[email protected] /]# docker run -it --name docker01 paidaxing/centos:9.1
[[email protected] /]# docker run -it --name docker02 --volumes-from docker01 paidaxing/centos:9.1
#docker01容器 volume01添加測試檔案
[[email protected] /]# cd volume01
[[email protected] volume01]# ls
[[email protected] volume01]# touch ceshi.java
[[email protected] volume01]# ls
ceshi.java
#docker02 volume01也同步了檔案
[[email protected] volume01]# ls
ceshi.java
# 測試:可以删除docker01,檢視一下docker02是否可以通路這個檔案
# 測試發現:資料依舊保留在docker02中沒有被删除

#多個mysql實作資料共享
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01  mysql:5.7

#容器之間的配置資訊的傳遞,資料卷容器的生命周期一直持續到沒有容器使用為止。
#但是一旦你持久化到了本地,這個時候,本地的資料是不會删除的!

           

Dockerfile

DockerFile介紹

dockerfile是用來建構docker鏡像的檔案!指令參數腳本!

建構步驟:

1、 編寫一個dockerfile檔案

2、 docker build 建構稱為一個鏡像

3、 docker run運作鏡像

4、 docker push釋出鏡像(DockerHub 、阿裡雲倉庫)

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

點選後跳到一個Dockerfile

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

很多官方鏡像都是基礎包,很多功能沒有,我們通常會自己搭建自己的鏡像!

官方既然可以制作鏡像,那我們也可以。

DockerFile建構過程

基礎知識:

1、每個保留關鍵字(指令)都是必須是大寫字母

2、執行從上到下順序

3、#表示注釋

4、每一個指令都會建立送出一個新的鏡像曾,并送出!

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

Dockerfile是面向開發的,我們以後要釋出項目,做鏡像,就需要編寫dockerfile檔案,這個檔案十分簡單!

Docker鏡像逐漸成企業傳遞的标準,必須要掌握!

DockerFile:建構檔案,定義了一切的步驟,源代碼

DockerImages:通過DockerFile建構生成的鏡像,最終釋出和運作産品。

Docker容器:容器就是鏡像運作起來提供服務。

Dockerfile的指令

FROM				# from:基礎鏡像,一切從這裡開始建構
MAINTAINER			# maintainer:鏡像是誰寫的, 姓名+郵箱
RUN					# run:鏡像建構的時候需要運作的指令
ADD					# add:步驟,tomcat鏡像,這個tomcat壓縮包!添加内容 添加同目錄
WORKDIR				# workdir:鏡像的工作目錄
VOLUME				# volume:挂載的目錄
EXPOSE				# expose:保留端口配置
CMD					# cmd:指定這個容器啟動的時候要運作的指令,隻有最後一個會生效,可被替代
ENTRYPOINT			# entrypoint:指定這個容器啟動的時候要運作的指令,可以追加指令
ONBUILD				# onbuild:當建構一個被繼承DockerFile這個時候就會運作onbuild的指令,觸發指令
COPY				# copy:類似ADD,将我們檔案拷貝到鏡像中
ENV					# env:建構的時候設定環境變量!
           
狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

實戰測試

Docker Hub 中 99%的鏡像都是從這個基礎鏡像過來的 FROM scratch,然後配置需要的軟體和配置來進行建構。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習
#1、編寫dockerfile檔案
[[email protected] ~]# cd /home
[[email protected] home]# ls
ceshi  ceshi2  docker-test-volume  mysql  test.txt
[[email protected] home]# 
[[email protected] home]# mkdir dockerfile
[[email protected] home]# ls
ceshi  ceshi2  dockerfile  docker-test-volume  mysql  test.txt
[[email protected] home]# cd dockerfile
[[email protected] dockerfile]# ls
#2、編輯測試腳本
[[email protected] dockerfile]# vim mydockerfile-centos
[[email protected] dockerfile]# cat mydockerfile-centos
FROM centos

MAINTAINER paidaxing<#郵箱

ENW MYPATH /use/local
WOEKDIR $MYPATH 

RUN yun -y install vim
RUM yun -y install net-tools


EXPOSE 80

CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash

#3、運作腳本生成
[[email protected] dockerfile]# docker build -f mydockerfile-centos -t mycentos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/10 : FROM centos
 ---> 300e315adb2f
Step 2/10 : MAINTAINER paidaxing<#郵箱
 ---> Using cache
 ---> 46c14b4b0ba2
Step 3/10 : ENV MYPATH /use/local
 ---> Using cache
 ---> f8fff150ed37
Step 4/10 : WORKDIR $MYPATH
 ---> Using cache
 ---> bc1b77f2c74e
Step 5/10 : RUN yum -y install vim
 ---> Running in 2f9d6e664a5c
CentOS Linux 8 - AppStream                      1.8 MB/s | 6.3 MB     00:03    
CentOS Linux 8 - BaseOS                         2.0 MB/s | 2.3 MB     00:01    
CentOS Linux 8 - Extras                          10 kB/s | 9.2 kB     00:00    
Last metadata expiration check: 0:00:01 ago on Mon Mar 15 02:54:49 2021.
Dependencies resolved.
================================================================================
 Package             Arch        Version                   Repository      Size
================================================================================
Installing:
 vim-enhanced        x86_64      2:8.0.1763-15.el8         appstream      1.4 M
Installing dependencies:
 gpm-libs            x86_64      1.20.7-15.el8             appstream       39 k
 vim-common          x86_64      2:8.0.1763-15.el8         appstream      6.3 M
 vim-filesystem      noarch      2:8.0.1763-15.el8         appstream       48 k
 which               x86_64      2.21-12.el8               baseos          49 k

Transaction Summary
================================================================================
Install  5 Packages

Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm        103 kB/s |  39 kB     00:00    
(2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 396 kB/s |  48 kB     00:00    
(3/5): which-2.21-12.el8.x86_64.rpm             185 kB/s |  49 kB     00:00    
(4/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm  856 kB/s | 1.4 MB     00:01    
(5/5): vim-common-8.0.1763-15.el8.x86_64.rpm    2.0 MB/s | 6.3 MB     00:03    
--------------------------------------------------------------------------------
Total                                           1.6 MB/s | 7.8 MB     00:04     
warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS Linux 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
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : which-2.21-12.el8.x86_64                               1/5 
  Installing       : vim-filesystem-2:8.0.1763-15.el8.noarch                2/5 
  Installing       : vim-common-2:8.0.1763-15.el8.x86_64                    3/5 
  Installing       : gpm-libs-1.20.7-15.el8.x86_64                          4/5 
  Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64                          4/5 
  Installing       : vim-enhanced-2:8.0.1763-15.el8.x86_64                  5/5 
  Running scriptlet: vim-enhanced-2:8.0.1763-15.el8.x86_64                  5/5 
  Running scriptlet: vim-common-2:8.0.1763-15.el8.x86_64                    5/5 
  Verifying        : gpm-libs-1.20.7-15.el8.x86_64                          1/5 
  Verifying        : vim-common-2:8.0.1763-15.el8.x86_64                    2/5 
  Verifying        : vim-enhanced-2:8.0.1763-15.el8.x86_64                  3/5 
  Verifying        : vim-filesystem-2:8.0.1763-15.el8.noarch                4/5 
  Verifying        : which-2.21-12.el8.x86_64                               5/5 

Installed:
  gpm-libs-1.20.7-15.el8.x86_64         vim-common-2:8.0.1763-15.el8.x86_64    
  vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarch
  which-2.21-12.el8.x86_64             

Complete!
Removing intermediate container 2f9d6e664a5c
 ---> 0de061ed713e
Step 6/10 : RUN yum -y install net-tools
 ---> Running in 121a254d12c8
Last metadata expiration check: 0:00:12 ago on Mon Mar 15 02:54:49 2021.
Dependencies resolved.
================================================================================
 Package         Architecture Version                        Repository    Size
================================================================================
Installing:
 net-tools       x86_64       2.0-0.52.20160912git.el8       baseos       322 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 322 k
Installed size: 942 k
Downloading Packages:
net-tools-2.0-0.52.20160912git.el8.x86_64.rpm   897 kB/s | 322 kB     00:00    
--------------------------------------------------------------------------------
Total                                            90 kB/s | 322 kB     00:03     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1 
  Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64              1/1 
  Verifying        : net-tools-2.0-0.52.20160912git.el8.x86_64              1/1 

Installed:
  net-tools-2.0-0.52.20160912git.el8.x86_64                                     

Complete!
Removing intermediate container 121a254d12c8
 ---> 73dd2dec4a47
Step 7/10 : EXPOSE 80
 ---> Running in f77204136a2a
Removing intermediate container f77204136a2a
 ---> 4776c4559b03
Step 8/10 : CMD echo $MYPATH
 ---> Running in fc421ef0050e
Removing intermediate container fc421ef0050e
 ---> cfbfd3bde115
Step 9/10 : CMD echo "----end----"
 ---> Running in 12563e09abad
Removing intermediate container 12563e09abad
 ---> 820a8596c7f4
Step 10/10 : CMD /bin/bash
 ---> Running in efa3bf6841d5
Removing intermediate container efa3bf6841d5
 ---> 4ab2ff5bb2ba
Successfully built 4ab2ff5bb2ba
Successfully tagged mycentos:1.0
#4、檢視,測試相關指令
[[email protected] dockerfile]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
mycentos              1.0       4ab2ff5bb2ba   6 minutes ago   291MB
paidaxing/centos      9.1       3bb6b30650fe   2 days ago      209MB
tomcat02              1.0       2cef4ca7716d   3 days ago      654MB
mysql                 5.7       a70d36bc331a   7 weeks ago     449MB
tomcat                9.0       040bdb29ab37   2 months ago    649MB
tomcat                latest    040bdb29ab37   2 months ago    649MB
nginx                 latest    f6d0b4767a6c   2 months ago    133MB
centos                latest    300e315adb2f   3 months ago    209MB
portainer/portainer   latest    62771b0b9b09   7 months ago    79.1MB
elasticsearch         7.6.2     f29a1ee41030   11 months ago   791MB
[[email protected] dockerfile]# docker run -it mycentos:1.0 /bin/bash
[[email protected] local]# pwd
/use/local
[[email protected] local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

           
#我們平時拿到一個鏡像,可以用 “docker history 鏡像id” 研究一下是什麼做的

CMD 和 ENTRYPOINT差別
CMD					# 指定這個容器啟動的時候要運作的指令,隻有最後一個會生效,可被替代。
ENTRYPOINT			# 指定這個容器啟動的時候要運作的指令,可以追加指令

#測試cmd

# 編寫dockerfile檔案
vim dockerfile-test-cmd
FROM centos
CMD ["ls","-a"]					# 啟動後執行 ls -a 指令

# 建構鏡像
docker build  -f dockerfile-test-cmd -t cmd-test:0.1 .

# 運作鏡像
docker run cmd-test:0.1		# 由結果可得,運作後就執行了 ls -a 指令
.
..
.dockerenv
bin
dev
etc
home

# 想追加一個指令  -l 成為ls -al:展示清單詳細資料
docker run cmd-test:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\":
executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled 

# cmd的情況下 -l 替換了CMD["ls","-l"] 而 -l  不是指令是以報錯

測試ENTRYPOINT

# 編寫dockerfile檔案
vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]

# 建構鏡像
docker build  -f dockerfile-test-entrypoint -t cmd-test:0.1 .

# 運作鏡像
docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found ...

# 我們的指令,是直接拼接在我們得ENTRYPOINT指令後面的
docker run entrypoint-test:0.1 -l
total 56
drwxr-xr-x   1 root root 4096 May 16 06:32 .
drwxr-xr-x   1 root root 4096 May 16 06:32 ..
-rwxr-xr-x   1 root root    0 May 16 06:32 .dockerenv
lrwxrwxrwx   1 root root    7 May 11  2019 bin -> usr/bin
drwxr-xr-x   5 root root  340 May 16 06:32 dev
drwxr-xr-x   1 root root 4096 May 16 06:32 etc
drwxr-xr-x   2 root root 4096 May 11  2019 home
lrwxrwxrwx   1 root root    7 May 11  2019 lib -> usr/lib
lrwxrwxrwx   1 root root    9 May 11  2019 lib64 -> usr/lib64 ....


           

實戰Tomcat鏡像

1、準備鏡像檔案
#上傳檔案到伺服器檔案夾
#發現rz指令沒有,yum一下lrzsz
[[email protected] tomcat]# rz
-bash: rz: command not found
[[email protected] tomcat]# yum -y install lrzsz
#檢視是否安裝成功
[[email protected] tomcat]# rpm -qa lrzsz 
lrzsz-0.12.20-36.el7.x86_64
#傳輸成功後檢視檔案
[[email protected] tomcat]# ls
apache-tomcat-9.0.44.tar.gz  Dockerfile  jdk-8u281-linux-x64.tar.gz  readme.txt
[[email protected] tomcat]# ll
total 151584
-rw-r--r-- 1 root root  11487016 Mar 15 15:24 apache-tomcat-9.0.44.tar.gz
-rw-r--r-- 1 root root        96 Mar 15 15:23 Dockerfile
-rw-r--r-- 1 root root 143722924 Mar 15 11:30 jdk-8u281-linux-x64.tar.gz
-rw-r--r-- 1 root root         0 Mar 15 15:18 readme.txt
#編輯生成腳本
[[email protected] tomcat]# cat Dockerfile
FROM centos

MAINTAINER paidaxing<571022036>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u281-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.44.tar.gz /usr/local/

RUN yum -y vim
ENV MYPATH /usr/local
WORKDIR $MYPATH


ENV JAVA_HOME /usr/local/jdk.1.8.2.81
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.44
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.44
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.44/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.44/logs/catalina.out 


[[email protected] tomcat]# docker build -t diytomcat .

#釋出成功
[[email protected] tomcat]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED              SIZE
diytomcat             latest    3f9a321c0efa   About a minute ago   640MB
mycentos              1.0       4ab2ff5bb2ba   5 hours ago          291MB
paidaxing/centos      9.1       3bb6b30650fe   3 days ago           209MB
tomcat02              1.0       2cef4ca7716d   3 days ago           654MB
mysql                 5.7       a70d36bc331a   7 weeks ago          449MB
tomcat                9.0       040bdb29ab37   2 months ago         649MB
tomcat                latest    040bdb29ab37   2 months ago         649MB
nginx                 latest    f6d0b4767a6c   2 months ago         133MB
centos                latest    300e315adb2f   3 months ago         209MB
portainer/portainer   latest    62771b0b9b09   7 months ago         79.1MB
elasticsearch         7.6.2     f29a1ee41030   11 months ago        791MB
#運作
[[email protected] home]# docker run -d --net="host" -p 8080:8080 --name tomcat01   -v /home/paidaxing/build/tomcat/test:/usr/local/apache-tomcat-9.0.44/webapps/test  -v/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.44/logs diytomcat
fbeb93e7c177c401a2535153300ba55f90cc9173e732ba5c44764452704a6146
[[email protected] home]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                    NAMES
fbeb93e7c177   diytomcat   "/bin/sh -c '/usr/lo…"   9 seconds ago   Up 8 seconds   0.0.0.0:8080->8080/tcp   tomcat01
#進入容器
[[email protected] home]# docker exec -it fbeb93e7c177 /bin/bash
[[email protected] local]# ls
apache-tomcat-9.0.44  bin  etc	games  include	jdk1.8.0_281  lib  lib64  libexec  readme.txt  sbin  share  src
[[email protected] local]# pwd
/usr/local
[[email protected] local]# ls -l
total 52
drwxr-xr-x 1 root  root  4096 Mar 15 07:45 apache-tomcat-9.0.44
drwxr-xr-x 2 root  root  4096 Nov  3 15:22 bin
drwxr-xr-x 2 root  root  4096 Nov  3 15:22 etc
drwxr-xr-x 2 root  root  4096 Nov  3 15:22 games
drwxr-xr-x 2 root  root  4096 Nov  3 15:22 include
drwxr-xr-x 8 10143 10143 4096 Dec  9 12:50 jdk1.8.0_281
drwxr-xr-x 2 root  root  4096 Nov  3 15:22 lib
drwxr-xr-x 3 root  root  4096 Dec  4 17:37 lib64
drwxr-xr-x 2 root  root  4096 Nov  3 15:22 libexec
-rw-r--r-- 1 root  root     0 Mar 15 07:18 readme.txt
drwxr-xr-x 2 root  root  4096 Nov  3 15:22 sbin
drwxr-xr-x 5 root  root  4096 Dec  4 17:37 share
drwxr-xr-x 2 root  root  4096 Nov  3 15:22 src

#報錯,未解決
[[email protected] tomcat]# curl localhost:8080
curl: (56) Recv failure: Connection reset by peer


           
2、編寫Dockerfile檔案

釋出自己的鏡像

1、注冊登入Dockerhub

[[email protected] /]# docker login -u paidaxin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

#給鏡像更名,要你的hub登入名/鏡像名:版本号
[[email protected] /]# docker tag 3ec66db83b5d paidaxin/tomcat:1.0
[[email protected] /]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
diytomcat             latest    3ec66db83b5d   16 hours ago    640MB
paidaxin/tomcat       1.0       3ec66db83b5d   16 hours ago    640MB
mycentos              1.0       4ab2ff5bb2ba   23 hours ago    291MB
paidaxing/centos      9.1       3bb6b30650fe   3 days ago      209MB
tomcat02              1.0       2cef4ca7716d   4 days ago      654MB
mysql                 5.7       a70d36bc331a   8 weeks ago     449MB
tomcat                9.0       040bdb29ab37   2 months ago    649MB
tomcat                latest    040bdb29ab37   2 months ago    649MB
nginx                 latest    f6d0b4767a6c   2 months ago    133MB
centos                latest    300e315adb2f   3 months ago    209MB
portainer/portainer   latest    62771b0b9b09   7 months ago    79.1MB
elasticsearch         7.6.2     f29a1ee41030   11 months ago   791MB
#push 鏡像,和下載下傳一樣,上傳也是分層的
[[email protected] /]# docker push paidaxin/tomcat:1.0
The push refers to repository [docker.io/paidaxin/tomcat]
3840eb430363: Pushing [==>                                                ]  2.778MB/58.03MB
5a5ac5466a8f: Pushing [=======>                                           ]  2.532MB/15.9MB
24825b25e159: Pushing [>                                                  ]  2.751MB/356.6MB
413a81c31294: Pushed 
2653d992f4ef: Pushing [>                                                  ]  3.807MB/209.3MB

           

2、阿裡雲鏡像服務

1、登入阿裡雲

2、找到容器鏡像服務

3、建立命名空間

4、建立容器鏡像

5、浏覽阿裡雲資訊

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

6、push鏡像

[[email protected] /]# docker push registry.cn-chengdu.aliyuncs.com/paidaxing/paidaxing:1.0
The push refers to repository [registry.cn-chengdu.aliyuncs.com/paidaxing/paidaxing]
5c40d26fba08: Pushed 
dd4969f97241: Pushed 
1.0: digest: sha256:02c51e3116cddbeff35da5a968ce909fcb07ff1b9688faa2eaaa2c237e9f7548 size: 739

           

7、上傳成功,在鏡像倉庫檢視

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-2ySCyShE-1616133602559)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210316103417821.png)]

小結

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

Docker網絡

了解Docker 0

學習之前清空下前面的docker 鏡像、容器

# 删除全部容器
docker rm -f $(docker ps -aq)

# 删除全部鏡像
docker rmi -f $(docker images -aq)

# 檢視容器内部位址
ip address

#重新下載下傳Tomcat鏡像測試
[[email protected] /]# docker run -d -P --name tomcat01 tomcat
[[email protected] /]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
tomcat       latest    040bdb29ab37   2 months ago   649MB

#檢視容器的内部網絡位址 ip address
#發現有個143的網絡位址,是docker配置設定的
[[email protected] /]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
142: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever


#思考。liunx能不能ping通容器内部
#可以的
[[email protected] ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.074 ms


#我們每啟動一個docker容器,docker就會給docker容器配置設定一個ip,我們隻要按照了docker,就會有一個docker0橋接模式,使用的技術是veth-pair技術!
#再次檢視docker網絡資訊,發現多了一個143的網絡位址
#可以發現這個143和之前啟動的Tomcat01的142位址是對應的
[[email protected] ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:01:e9:d7 brd ff:ff:ff:ff:ff:ff
    inet 172.20.245.58/20 brd 172.20.255.255 scope global dynamic eth0
       valid_lft 314843138sec preferred_lft 314843138sec
74: br-63d3626d7dc7: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:85:3c:22:e8 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-63d3626d7dc7
       valid_lft forever preferred_lft forever
133: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 8e:80:24:0f:b4:13 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
143: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 8e:80:24:0f:b4:13 brd ff:ff:ff:ff:ff:ff link-netnsid 0
#再啟動一個Tomcat02 網卡是144   
[[email protected] /]# docker run -d -P --name tomcat02 tomcat
36de4fb03692eafe717b7b42f6b518245eede2596b73de1beb713b88fefc551d
[[email protected] /]# docker exec -it tomcat02 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
144: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
#再檢視docker網絡資訊
[[email protected] /]# docker exec -it tomcat02 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
144: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[[email protected] /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:01:e9:d7 brd ff:ff:ff:ff:ff:ff
    inet 172.20.245.58/20 brd 172.20.255.255 scope global dynamic eth0
       valid_lft 314842883sec preferred_lft 314842883sec
74: br-63d3626d7dc7: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:85:3c:22:e8 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-63d3626d7dc7
       valid_lft forever preferred_lft forever
133: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 76:b4:59:05:94:8d brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
143: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 8e:80:24:0f:b4:13 brd ff:ff:ff:ff:ff:ff link-netnsid 0
145: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 76:b4:59:05:94:8d brd ff:ff:ff:ff:ff:ff link-netnsid 1

#我們發現這個容器的網卡,都是一對對的。
# veth-pair 就是一對的虛拟裝置接口,他們都是成對出現的,一端連着協定,一端彼此相連
# 正因為有這個特性 veth-pair 充當一個橋梁,連接配接各種虛拟網絡裝置的
# OpenStac,Docker容器之間的連接配接,OVS的連接配接,都是使用evth-pair技術

#我們來測試下Tomcat01和Tomcat02是否可以ping通
#也是可以的
[[email protected] /]# docker exec -it tomcat02 ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.114 ms

# 結論:容器和容器之間是可以互相ping通
           

網圖:

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

結論:tomcat01和tomcat02公用一個路由器,docker0。

所有的容器不指定網絡的情況下,都是docker0路由的,docker會給我們的容器配置設定一個預設的可用ip。

小結

Docker使用的是Linux的橋接,主控端是一個Docker容器的網橋 docker0

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

Docker中所有網絡接口都是虛拟的,虛拟的轉發效率高(内網傳遞檔案)

隻要容器删除,對應的網橋一對就沒了!

–link

#思考一個場景:我們編寫了一個微服務,database url=ip: 項目不重新開機,資料ip換了,我們希望可以處理這個問題,可以通過名字來進行通路容器
#直接ping是ping不同的
[[email protected] /]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known

#如何解決
#通過--link可以解決
[[email protected] /]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
d5b624d5ccc5e32094beb37e6c7a8b0317c5506ea6d46baa63bb8d07fc4af95d
[[email protected] /]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.102 ms
#檢視網絡資訊
[[email protected] /]# docker network inspect fc147941dd4b

    {
        "Name": "bridge",
        "Id": "fc147941dd4b4f86f9d6991e9e4224cae145080f6898f68b15e81103c2d81b53",
        "Created": "2021-03-15T17:45:42.319600456+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1" #docker0
                }
            ]
        },
        "ConfigOnly": false,
        "Containers": {
            "36de4fb03692eafe717b7b42f6b518245eede2596b73de1beb713b88fefc551d": {
                "Name": "tomcat02",
                "EndpointID": "465e2300914d5d1362a8130b39113781dc937abbc08cbfdbf340ba9045a75276",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "3a8d9a318c825971e2969320920352b09ba059829f07bfb09a93946cad634859": {
                "Name": "tomcat01",
                "EndpointID": "5f7db6cad386842705eb4c655175c4fbbbcd80d8e7a604939adc5d825d54207f",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "d5b624d5ccc5e32094beb37e6c7a8b0317c5506ea6d46baa63bb8d07fc4af95d": {
                "Name": "tomcat03",
                "EndpointID": "5428ccd4b4a038c032f4c7925253beeae6034ec25515f1f2ceb513eb2c7b4fb5",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            }
        },
#其實這個Tomcat03是在本地配置了tomcat02的位址
#檢視hosts配置,在這裡原理發現。
[[email protected] /]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.3	tomcat02 36de4fb03692
172.17.0.4	d5b624d5ccc5

#–link 本質就是在hosts配置中添加映射

#現在使用Docker已經不建議使用–link了!

#自定義網絡,不适用docker0!

#docker0問題:不支援容器名連接配接通路!
           

自定義網絡

#檢視docker網絡
[[email protected] ~]# docker network ls
NETWORK ID     NAME          DRIVER    SCOPE
fc147941dd4b   bridge        bridge    local
a6ac3789c498   host          host      local
4d1ab894aec6   none          null      local
63d3626d7dc7   somenetwork   bridge    local

#bridge :橋接 docker(預設,自己建立也是用bridge模式)

#none :不配置網絡,一般不用

#host :和所主機共享網絡

#container :容器網絡連通(用得少!局限很大)

# 我們直接啟動的指令 --net bridge,而這個就是我們得docker0
# bridge就是docker0
docker run -d -P --name tomcat01 tomcat

等價于 => docker run -d -P --name tomcat01 --net bridge tomcat

# docker0,特點:預設,域名不能通路。 --link可以打通連接配接,但是很麻煩!
# 我們可以 自定義一個網絡
[[email protected] ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
5d36c3180b51968029b07ec3ea42955619118b3cfd5ff23629f3e3848ea5169c
[[email protected] ~]# docker network ls
NETWORK ID     NAME          DRIVER    SCOPE
fc147941dd4b   bridge        bridge    local
a6ac3789c498   host          host      local
5d36c3180b51   mynet         bridge    local
4d1ab894aec6   none          null      local
63d3626d7dc7   somenetwork   bridge    local

[[email protected] ~]# docker network inspect mynet
#重新建立容器配置設定我們自定義的網絡
[[email protected] ~]# docker run -d -P --name tomcat01 --net mynet tomcat
8225c3b0aeaf38b5680c67d91ddeff9afeded0ec4f0d8befb7107882dc114e65
[[email protected] ~]# docker run -d -P --name tomcat02 --net mynet tomcat
34d7b50e65e37a40ed08ab3021a6f8d98efcaafdd05ea3b73e14adf723c3ad35
#發現直接用容器名可以直接ping,因為都在同一個網段,不使用--link也可以直接ping
[[email protected] ~]# docker exec -it tomcat01 ping tomcat02
PING tomcat02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.079 ms
[[email protected] ~]# docker exec -it tomcat02 ping tomcat01
PING tomcat01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.092 ms


#我們自定義的網絡docker當我們維護好了對應的關系,推薦我們平時這樣使用網絡!

#好處:

#redis -不同的叢集使用不同的網絡,保證叢集是安全和健康的

#mysql-不同的叢集使用不同的網絡,保證叢集是安全和健康的

#那麼網段不同的兩個容器是否可以ping通
#建立一個tomcat03使用預設的docker0網卡
#發現是ping不同的
[[email protected] ~]# docker run -d -P --name tomcat03  tomcat
411de1e33b75e995ead240087edd02e7a358b5eb215c0c2c2b223103debc1fb0
[[email protected] ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

# 要将tomcat03 連通 tomcat02 ,連通就是将 tomcat03加到 mynet網絡
# 一個容器兩個ip(tomcat03)
#tomcat03發現添加了mynet網絡之後可以ping通
#結論:假設要跨網絡操作别人,就需要使用docker network connect 連通!
[[email protected] ~]# docker network connect mynet tomcat03
[[email protected] ~]# docker exec tomcat01 ping tomcat03
PING tomcat03 (192.168.0.4) 56(84) bytes of data.
64 bytes from tomcat03.mynet (192.168.0.4): icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from tomcat03.mynet (192.168.0.4): icmp_seq=2 ttl=64 time=0.072 ms
           

實戰:部署Redis叢集

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習
#建立Redis專屬的網絡
[[email protected] ~]# docker network create redis --subnet 172.38.0.0/16
ec86a0358f3302a1899ecc595955f3c40e58f7a321162963b9a913f315e09110
[[email protected] ~]# docker network ls
NETWORK ID     NAME          DRIVER    SCOPE
fc147941dd4b   bridge        bridge    local
a6ac3789c498   host          host      local
5d36c3180b51   mynet         bridge    local
4d1ab894aec6   none          null      local
ec86a0358f33   redis         bridge    local
63d3626d7dc7   somenetwork   bridge    local

#通過for循環建立六個Redis檔案
[[email protected] ~]# for port in $(seq 1 6);\
> do \
> mkdir -p /mydata/redis/node-${port}/conf
> touch /mydata/redis/node-${port}/conf/redis.conf
> cat << EOF >> /mydata/redis/node-${port}/conf/redis.conf
> port 6379
> bind 0.0.0.0
> cluster-enabled yes
> cluster-config-file nodes.conf
> cluster-node-timeout 5000
> cluster-announce-ip 172.38.0.1${port}
> cluster-announce-port 6379
> cluster-announce-bus-port 16379
> appendonly yes
> EOF
> done
[[email protected] ~]# ls
[[email protected] ~]# cd mydata
-bash: cd: mydata: No such file or directory
[[email protected] ~]# cd /mydata
[[email protected] mydata]# ls
redis
[[email protected] mydata]# cd redis
[[email protected] redis]# ls
node-1  node-2  node-3  node-4  node-5  node-6

#啟動服務
#Redis1
docker run -p 6371:6379 -p 16379:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#Redis2
docker run -p 6372:6379 -p 16380:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#Redis3
docker run -p 6373:6379 -p 16381:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#redis4
docker run -p 6374:6379 -p 16382:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#redis5
docker run -p 6375:6379 -p 16383:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#Redis6
docker run -p 6376:6379 -p 16384:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#全部腳本執行完了之後檢視一下已經全部挂起來了
[[email protected] ~]# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                              NAMES
2885c3c36a09   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   20 seconds ago   Up 19 seconds   0.0.0.0:6376->6379/tcp, 0.0.0.0:16384->16379/tcp   redis-6
f8fa02919e15   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   30 seconds ago   Up 29 seconds   0.0.0.0:6375->6379/tcp, 0.0.0.0:16383->16379/tcp   redis-5
cade69bb1a40   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   39 seconds ago   Up 38 seconds   0.0.0.0:6374->6379/tcp, 0.0.0.0:16382->16379/tcp   redis-4
55e1fd4f41ec   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   49 seconds ago   Up 48 seconds   0.0.0.0:6373->6379/tcp, 0.0.0.0:16381->16379/tcp   redis-3
961882696d76   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   59 seconds ago   Up 57 seconds   0.0.0.0:6372->6379/tcp, 0.0.0.0:16380->16379/tcp   redis-2
d5bb9167df2c   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   3 minutes ago    Up 3 minutes    0.0.0.0:16379->16379/tcp, 0.0.0.0:6371->6379/tcp   redis-1
#進入容器Redis-1
[[email protected] ~]# docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof  nodes.conf

#建立叢集
/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
#建立成功後進入叢集檢視相關資訊
/data # redis-cli -c
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:73
cluster_stats_messages_pong_sent:75
cluster_stats_messages_sent:148
cluster_stats_messages_ping_received:70
cluster_stats_messages_pong_received:73
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:148
127.0.0.1:6379> cluster nodes
2485d749d748c0bd373d25e2c1e6de36094e2879 172.38.0.14:[email protected] slave eff86a3299f4794d143ffb1ccb735549eb7a79c9 0 1615888137000 4 connected
eff86a3299f4794d143ffb1ccb735549eb7a79c9 172.38.0.13:[email protected] master - 0 1615888137590 3 connected 10923-16383
b4f869da6eead890365089d941f9d85e7758cf75 172.38.0.16:[email protected] slave ddd614967750281f19f41a679a77322435019499 0 1615888136588 6 connected
31efa7504ce8c14b909bc9d1f3bcce33d2fdf2a9 172.38.0.15:[email protected] slave 9b36017e9541d55d64096a1f6e366131694f57ef 0 1615888136000 5 connected
ddd614967750281f19f41a679a77322435019499 172.38.0.12:[email protected] master - 0 1615888136588 2 connected 5461-10922
9b36017e9541d55d64096a1f6e366131694f57ef 172.38.0.11:[email protected] myself,master - 0 1615888137000 1 connected 0-5460
#停掉master,看看從機是否會自動啟用
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK

[[email protected] /]# docker stop redis-3
redis-3
#沒有問題
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.38.0.14:6379
"b"

172.38.0.14:6379> cluster nodes
9b36017e9541d55d64096a1f6e366131694f57ef 172.38.0.11:[email protected] master - 0 1615888482000 1 connected 0-5460
ddd614967750281f19f41a679a77322435019499 172.38.0.12:[email protected] master - 0 1615888482827 2 connected 5461-10922
31efa7504ce8c14b909bc9d1f3bcce33d2fdf2a9 172.38.0.15:[email protected] slave 9b36017e9541d55d64096a1f6e366131694f57ef 0 1615888481000 5 connected
b4f869da6eead890365089d941f9d85e7758cf75 172.38.0.16:[email protected] slave ddd614967750281f19f41a679a77322435019499 0 1615888481323 6 connected
2485d749d748c0bd373d25e2c1e6de36094e2879 172.38.0.14:[email protected] myself,master - 0 1615888482000 7 connected 10923-16383
eff86a3299f4794d143ffb1ccb735549eb7a79c9 172.38.0.13:[email protected] master,fail - 1615888316140 1615888314000 3 connected
172.38.0.14:6379> 

           

springboot微服務打包docker鏡像

#1、建構SpringBoot項目
#建立一個hellocontroller測試
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        return "hello,paidaxing";
    }
}
#我本機的8080端口被占用了,我切換到了7788端口啟動服務通路成功
#2、打包運作

#3、編寫dockerfile
FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=7788"]

EXPOSE 7788

ENTRYPOINT ["java","-jar","/app.jar"]

#4、上傳檔案,建構鏡像

[[email protected] idea]# ll
total 16656
-rw-r--r-- 1 root root 17048669 Mar 17 11:08 demo-0.0.1-SNAPSHOT.jar
-rw-r--r-- 1 root root      120 Mar 17 11:07 Dockerfile
[[email protected] idea]# docker build -t paidaxing .
[[email protected] idea]# docker images
REPOSITORY   TAG                IMAGE ID       CREATED         SIZE
paidaxing    latest             94a761fada63   2 minutes ago   660MB
tomcat       latest             040bdb29ab37   2 months ago    649MB
redis        5.0.9-alpine3.11   3661c84ee9d0   10 months ago   29.8MB
java         8                  d23bdf5b1b1b   4 years ago     643MB

#5、運作容器通路網站
[[email protected] idea]# docker run -d -P --name paidaxing-hello paidaixing

[[email protected] idea]# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS          PORTS                     NAMES
a9f37ee2675b   paidaxing:latest   "java -jar /app.jar …"   37 seconds ago   Up 36 seconds   0.0.0.0:49161->7788/tcp   paidaxing-hello
#通路成功!!
[[email protected] idea]# curl localhost:49161
{"timestamp":"2021-03-17T03:17:17.811+00:00","status":404,"error":"Not Found","message":"","path":"/"}
[[email protected] idea]# curl localhost:49161/hello
hello,paidaxing[[email protected] idea]# 


           
狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

#檔案上傳

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

Docker Compose

簡介

dockerfile build run 手動操作,單個容器

微服務。100個微服務!依賴關系。

docker compose 來輕松高效的管理容器。定義運作多個容器。

官方文檔簡介:(https://docs.docker.com/compose/)

定義運作多個容器

YAML file配置檔案。

single command 指令

所有環境都可以使用compose。

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.

Using Compose is basically a three-step process:

Define your app’s environment with a

Dockerfile

so it can be reproduced anywhere.

dockerfile保證我們的項目在任何地方都可以運作。

Define the services that make up your app in

docker-compose.yml

so they can be run together in an isolated environment.

servers是什麼服務

docker-compose-yml 這個檔案怎麼寫

Run

docker compose up

and the Docker compose command starts and runs your entire app. You can alternatively run

docker-compose up

using the docker-compose binary.

啟動項目。

作用:批量容器編排

compose是docker官方的開源項目。需要安裝

dockerfile 讓程式在任何地方運作。 Web服務、Redis、MySQL、Nginx……多個容器

compose

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}
           

compose重要概念:

服務services:容器,應用(Web服務、Redis、MySQL、Nginx)

項目project:一組相關的容器。

安裝compose

#官方文檔下載下傳方式(非常慢)
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

#百度上找的國内鏡像位址下載下傳非常快
[[email protected] ~]# curl -L "https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   423  100   423    0     0    214      0  0:00:01  0:00:01 --:--:--   214
100 15.4M  100 15.4M    0     0  5896k      0  0:00:02  0:00:02 --:--:-- 36.5M
#檢視下載下傳目錄下是否有檔案
[[email protected] ~]# cd /usr/local/bin
[[email protected] bin]# ls
chardetect  cloud-init      docker-compose  easy_install-3.6  jsondiff   jsonpointer
cloud-id    cloud-init-per  easy_install    easy_install-3.8  jsonpatch  jsonschema

#授權
[[email protected] bin]# sudo chmod +x /usr/local/bin/docker-compose
#檢視版本資訊,查得到代表安裝成功
[[email protected] bin]# docker-compose version
docker-compose version 1.27.4, build 40524192
docker-py version: 4.3.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

           

體驗compose

#文檔位址https://docs.docker.com/compose/gettingstarted/
[[email protected] home]# mkdir composetest
[[email protected] home]# cd composetest
[[email protected] composetest]# ll
total 0
#接着按照官方文檔建立 app.py,requirements.txtDockerfile,docker-compose.yml
[[email protected] composetest]# ll
total 16
-rw-r--r-- 1 root root 513 Mar 17 15:35 app.py
-rw-r--r-- 1 root root 111 Mar 17 15:41 docker-compose.yml
-rw-r--r-- 1 root root 254 Mar 17 15:38 dockerfile
-rw-r--r-- 1 root root  12 Mar 17 15:36 requirements.txt
#思路整理
#(1)建立一個應用、(2)dockerfile應用打包為鏡像
#(3)docker-compose.yam檔案(定義整個服務需要的環境。web\redis)--完整的上線服務
#(4)啟動compose項目(docker-compose up)

#流程
#1、建立網絡
#2、執行docker-compose yaml
#3、啟動服務 docker-compose yaml
#creating composetest_web_1 ...done
#creating composetest_redis_1 ...done 

#執行的時候會報這個錯composetest_web_1 exited with code 1
#我們按照代碼的提示退出運作執行
#再執行docker-compose build
#執行完了之後再 docker-compose up
#再檢視容器已經起來了
[[email protected] composetest]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                    NAMES
fe5c2ec7b0c3   composetest_web   "flask run"              58 seconds ago   Up 57 seconds   0.0.0.0:5000->5000/tcp   composetest_web_1
827fd362ac1c   redis:alpine      "docker-entrypoint.s…"   11 minutes ago   Up 57 seconds   6379/tcp                 composetest_redis_1
#web頁面也可以正常通路
[[email protected] composetest]# curl localhost:5000
Hello World! I have been seen 1 times.
#依賴的鏡像也已經自動下載下傳
[[email protected] composetest]# docker images
REPOSITORY        TAG                IMAGE ID       CREATED          SIZE
composetest_web   latest             ac6045d1daa4   14 minutes ago   196MB
<none>            <none>             2a51e65a5d98   24 minutes ago   196MB
paidaxing         latest             94a761fada63   6 hours ago      660MB
redis             alpine             933c79ea2511   2 months ago     31.6MB
tomcat            latest             040bdb29ab37   2 months ago     649MB
python            3.7-alpine         72e4ef8abf8e   2 months ago     41.1MB
redis             5.0.9-alpine3.11   3661c84ee9d0   10 months ago    29.8MB
java              8                  d23bdf5b1b1b   4 years ago      643MB

[[email protected] composetest]# docker service ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

#預設的服務名,檔案名_服務名_num
#多個伺服器。叢集 A B _num副本數量
#服務Redis>=4個副本
#叢集狀态。服務都不可能隻有一個執行個體運作。彈性 高并發
#kubecl service負載均衡
#網絡規則
[[email protected] composetest]# docker network ls
NETWORK ID     NAME                  DRIVER    SCOPE
fc147941dd4b   bridge                bridge    local
ec3648819180   composetest_default   bridge    local#compose網絡
a6ac3789c498   host                  host      local
5d36c3180b51   mynet                 bridge    local
4d1ab894aec6   none                  null      local
ec86a0358f33   redis                 bridge    local
63d3626d7dc7   somenetwork           bridge    local
#composetest_redis_1和composetest_web_1在同一個網段
#可以通過域名直接通路。
[[email protected] composetest]# docker network inspect composetest_default

        "ConfigOnly": false,
        "Containers": {
            "827fd362ac1c2549581430d4641bc1928e60ede82b0af3fac7a703b229d32340": {
                "Name": "composetest_redis_1",
                "EndpointID": "377227b4d71ba26e4e5b88dda1986b86c045b0cb7cec159f5c4ff1a05e31f5da",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            },
            "fe5c2ec7b0c33953eba56e863dfdc2fab1f8bf40358a7b504cdc2b0989e443c2": {
                "Name": "composetest_web_1",
                "EndpointID": "3384abbc243f87da99e04824e59521ce0661d24c7fdd16b2f6c1306487a8e410",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            }
        },

#停止docker-compose down Ctrl+c
#要在項目目錄下
#docker-compose。通過docker-compose編寫yaml配置檔案。
#可以通過compose一鍵啟動所有服務、停止。
           

浏覽器上面通路也是可以的,這就是官方測試的一個web應用

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-Rhv9Ih47-1616133602564)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210317164008230.png)]

compose yaml 編寫規則

#docker-composeyaml 核心
#文檔位址:https://docs.docker.com/compose/compose-file/
#3層

version: " " #版本
service:     #服務
服務1:web
#服務配置
images
build
network
……
服務2:Redis
……
服務3:Redis
……

#其它配置 網絡/卷 全局規則
#volumes、network、configs
           

開源項目(wordpress部落格)

#docker官方文檔位址:https://docs.docker.com/compose/wordpress/

#建立一個新的檔案夾
[[email protected] home]# cd my_wordpress
[[email protected] my_wordpress]# ll
total 0

#編寫docker-compose.yml
version: "3.9" #版本
    
services:
  db:
    image: mysql:5.7#資料庫應用
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:#依賴
      - db
    image: wordpress:latest#應用2
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  
  #啟動項目docker-compose up
  #背景啟動docker-compose up -d
  [[email protected] my_wordpress]# docker compose up
#檔案準備齊全(直接一鍵啟動項目)
           

通路部落格站點進行搭建,搭建成功我們通路前台,完全沒有問題

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

實戰:計數器

#1、編寫項目微服務
#2、dockerfile建構鏡像
#3、docker-compose.yaml編排項目
#4、在伺服器上啟動

#上傳檔案
[[email protected] haimian]# ll
total 25812
-rw-r--r-- 1 root root 26421170 Mar 18 10:51 demo-0.0.1-SNAPSHOT.jar
-rw-r--r-- 1 root root      171 Mar 18 10:52 docker-compose.yml
-rw-r--r-- 1 root root      122 Mar 18 10:52 Dockerfile
#compose up 一鍵啟動
[[email protected] haimian]# docker-compose up --build

[[email protected] my_wordpress]# curl localhost:7788/hello
hello,paidadxing,thonk you with me happy1[[email protected] my_wordpress]# curl localhost:7788/hello
hello,paidadxing,thonk you with me happy2[[email protected] my_wordpress]#

#遠端通路也沒有問題。
總結:
工程、服務、容器
項目:compose:三層

工程Poriect
服務 服務
容器運作執行個體! docker k8s 容器
           

Docker Swarm

叢集

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習
#為四台服務安裝docker
#安裝完畢之後先看一下docker官方文檔swarm一些原理

           

位址:https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/

Docker Engine 1.12引入了swarm模式,使您可以建立一個或多個Docker Engine叢集,稱為swarm。一個群集由一個或多個節點組成:以群集模式運作Docker Engine 1.12或更高版本的實體機或虛拟機。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

管理節點和工作節點,操作都在manager管理節點上。

管理節點最少需要三台。

搭建叢集

[[email protected] ~]# docker swarm --help

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm

Run 'docker swarm COMMAND --help' for more information on a command.

[[email protected] ~]# docker swarm init --help

Usage:  docker swarm init [OPTIONS]

Initialize a swarm

Options:
      --advertise-addr string                  Advertised address (format: <ip|interface>[:port])
 
#建立叢集 docker swarm init 初始化一個節點
#docker swarm join 加入一個節點
#docker swarm join-token manager 擷取令牌
#docker swarm join-token worker
#docker swarm leave --force 管理節點,解散叢集
[[email protected] ~]# docker swarm init --advertise-addr 172.28.239.103
Swarm initialized: current node (681hwoonzdmw28thceumiuieq) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1- 1jr3qs75lpu6zcprc2z2ka6ye485dpqxucb19w6qcqgia9uv7j-1neo402s3yfhqzswzqw5shpji 172.28.239.103:2377

To add a manager to this swarm, run 'c' and follow the instructions.
#伺服器docker-2加入叢集成為worker節點
[[email protected] ~]# docker swarm join --token SWMTKN-1-1jr3qs75lpu6zcprc2z2ka6ye485dpqxucb19w6qcqgia9uv7j-1neo402s3yfhqzswzqw5shpji 172.28.239.103:2377
This node joined a swarm as a worker.
#檢視叢集節點資訊
[[email protected] ~]# docker node ls
ID                            HOSTNAME                  STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
681hwoonzdmw28thceumiuieq *   iZm5e7tq4538l94vqz9upjZ   Ready     Active         Leader           20.10.5
vbhakfutdb5jkom5j1n5zm5qd     iZm5e7tq4538l94vqz9uplZ   Ready     Active                          20.10.5

#讓另外兩個主機加入叢集節點成為雙主雙從
[[email protected] ~]# docker node ls
ID                            HOSTNAME                  STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
dn4dj1o6g8fn0bx9md2qmhim0     iZm5e7tq4538l94vqz9upiZ   Ready     Active         Reachable        20.10.5
681hwoonzdmw28thceumiuieq *   iZm5e7tq4538l94vqz9upjZ   Ready     Active         Leader           20.10.5
xhkwosy7afij6sphlybcukq8r     iZm5e7tq4538l94vqz9upkZ   Ready     Active                          20.10.5
vbhakfutdb5jkom5j1n5zm5qd     iZm5e7tq4538l94vqz9uplZ   Ready     Active                          20.10.5


     
           

raft協定

思考:雙主雙從已經搭設完畢,假設一個節點挂了。其它節點是否可用。

raft協定:保證 大多數節點存活才可用。叢集至少要大于三台。

#挂掉一個叢集管理節點
[[email protected] ~]# systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
  docker.socket
 #檢視另一個叢集管理節點 
 [[email protected] ~]# docker node ls
Error response from daemon: rpc error: code = DeadlineExceeded desc = context deadline exceeded

#因為是雙主,其中一個主機停了,另一個就也使用不了。
#重新挂起節點,發現可以用了,但是Leader已經不是我們挂掉的那個節點了,變成了另外一個管理節點。
[[email protected] ~]# docker node ls
ID                            HOSTNAME                  STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
dn4dj1o6g8fn0bx9md2qmhim0     iZm5e7tq4538l94vqz9upiZ   Ready     Active         Leader           20.10.5
681hwoonzdmw28thceumiuieq *   iZm5e7tq4538l94vqz9upjZ   Ready     Active         Reachable        20.10.5
xhkwosy7afij6sphlybcukq8r     iZm5e7tq4538l94vqz9upkZ   Ready     Active                          20.10.5
vbhakfutdb5jkom5j1n5zm5qd     iZm5e7tq4538l94vqz9uplZ   Ready     Active                          20.10.5

#讓一個工作節點離開叢集 docker swarm leave
[[email protected] ~]# docker node ls
ID                            HOSTNAME                  STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
dn4dj1o6g8fn0bx9md2qmhim0     iZm5e7tq4538l94vqz9upiZ   Ready     Active         Leader           20.10.5
681hwoonzdmw28thceumiuieq *   iZm5e7tq4538l94vqz9upjZ   Ready     Active         Reachable        20.10.5
xhkwosy7afij6sphlybcukq8r     iZm5e7tq4538l94vqz9upkZ   Down      Active                          20.10.5
vbhakfutdb5jkom5j1n5zm5qd     iZm5e7tq4538l94vqz9uplZ   Ready     Active                          20.10.5

#恢複離開的節點,設定其為管理節點,模式變成三主一從。
[[email protected] ~]# docker node ls
ID                            HOSTNAME                  STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
dn4dj1o6g8fn0bx9md2qmhim0     iZm5e7tq4538l94vqz9upiZ   Ready     Active         Leader           20.10.5
681hwoonzdmw28thceumiuieq     iZm5e7tq4538l94vqz9upjZ   Ready     Active         Reachable        20.10.5
cqubo1rk3hzma2ynkcf8vj7u9 *   iZm5e7tq4538l94vqz9upkZ   Ready     Active         Reachable        20.10.5
xhkwosy7afij6sphlybcukq8r     iZm5e7tq4538l94vqz9upkZ   Down      Active                          20.10.5
vbhakfutdb5jkom5j1n5zm5qd     iZm5e7tq4538l94vqz9uplZ   Ready     Active                          20.10.5
#再次down掉一個管理節點,這次我們發現其它兩個管理節點是可用的,這符合了我們raft協定大多數可用
[[email protected] ~]# docker node ls
ID                            HOSTNAME                  STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
dn4dj1o6g8fn0bx9md2qmhim0     iZm5e7tq4538l94vqz9upiZ   Ready     Active         Leader           20.10.5
681hwoonzdmw28thceumiuieq     iZm5e7tq4538l94vqz9upjZ   Ready     Active         Unreachable      20.10.5
cqubo1rk3hzma2ynkcf8vj7u9 *   iZm5e7tq4538l94vqz9upkZ   Ready     Active         Reachable        20.10.5
xhkwosy7afij6sphlybcukq8r     iZm5e7tq4538l94vqz9upkZ   Down      Active                          20.10.5
vbhakfutdb5jkom5j1n5zm5qd     iZm5e7tq4538l94vqz9uplZ   Ready     Active                          20.10.5
#我們再down掉一個管理節點,發現剩下的管理節點是不可用的。
[[email protected] ~]# docker node ls
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.

#這就能很好地了解上面那個官方網站的圖,最少需要三個主節點,保證存活大于1台的管理節點存活
#raft協定:保證大多數存活,才可使用,達到我們高可用的要求。




           

Docker swarm 叢集彈性建立服務

彈性,擴縮容,叢集

告别docker run

docker-compose ,啟動一個項目 單機

叢集:swarm service

容器>服務

容器>服務>副本

Redis服務>=10個副本

#灰階釋出,金絲雀
[[email protected] ~]# docker service --help

Usage:  docker service COMMAND

Manage services

Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated services
  update      Update a service

Run 'docker service COMMAND --help' for more information on a command.

#docker run 容器啟動!不具備擴縮容。
#docker service 服務! 具有擴縮容器,滾動更新。
[[email protected] ~]# docker service create -p 7788:80 --name my-nginx nginx
qktvdpw9j2i0543cvscc8hit9
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged

[[email protected] ~]# docker service ps my-nginx
ID             NAME         IMAGE          NODE                      DESIRED STATE   CURRENT STATE           ERROR     PORTS
ij9np5kqyliq   my-nginx.1   nginx:latest   iZm5e7tq4538l94vqz9upjZ   Running         Running 2 minutes ago 

#檢視服務 replicas
[[email protected] ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
qktvdpw9j2i0   my-nginx   replicated   1/1        nginx:latest   *:7788->80/tcp

#為服務增加副本
[[email protected] ~]# docker service update --replicas 3 my-nginx
my-nginx
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 
#我們可以通過docker ps 檢視到我們所建立的容器副本被随機配置設定到其它叢集節點上。
#檢視docker2節點,這個節點上沒有運作容器副本,但是一樣可以遠端通路服務。
[[email protected] ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
#叢集就是一個整體
#動态擴縮容
#服務,叢集中任意節點都可以通路,服務可以有多個副本動态擴縮容實作高可用

#我現在不想要那麼多副本,隻想要一個,也是可以的,我們直接更新服務為一個副本就行了
[[email protected] ~]# docker service update --replicas 1 my-nginx
my-nginx
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 
[[email protected] ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
9a33d46f1cf4   nginx:latest   "/docker-entrypoint.…"   16 minutes ago   Up 16 minutes   80/tcp    my-nginx.1.ij9np5kqyliqhejn1rrblyb95


#副本拓展docker service scale my-nginx=5
#和之前那個是一樣的,不過這個更友善。
[[email protected] ~]# docker service scale my-nginx=5
my-nginx scaled to 5
overall progress: 5 out of 5 tasks 
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5: running   [==================================================>] 
5/5: running   [==================================================>] 
verify: Service converged 
#移除服務
[[email protected] ~]# docker service rm my-nginx
my-nginx
[[email protected] ~]# docker service ls
ID        NAME      MODE      REPLICAS   IMAGE     PORTS
#docker swarm其實不難
#隻要會搭建叢集,會啟動服務,動态管理容器就可以了。




           
狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

概念總結

swarm

叢集的管理和編排,docker可以初始化一個swarm叢集,其它節點可以加入。

node

就是一個docker節點,多個節點組成了一個網絡叢集。

service

任務,可以在管理節點或工作節點來運作。

task

容器的指令

拓展

網絡模式:

swarm

overlay

ingress:特殊overlay網絡!負載均衡功能!IPVS VIP!

雖然docker在四台機子上,實際上是一個網絡。

Docker Stack

#單機
docker-compose up -d wordpress.yaml
#叢集
docker stack deploy wordpress.yaml
#案例
version: "3"

services:
  nginx:
    image: nginx:alpine
    ports:
      - 80:80
    deploy:
      mode: replicated
      replicas: 4

  visualizer:
    image: dockersamples/visualizer
    ports:
      - "9001:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:#叢集部署
      replicas: 1
      placement:
        constraints: [node.role == manager]

  portainer:
    image: portainer/portainer
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]
           

Docker Secret

安全!配置密碼。證書。

k8s裡面再深入了解。

Docker Config

配置

[[email protected] ~]# docker config --help

Usage:  docker config COMMAND

Manage Docker configs

Commands:
  create      Create a config from a file or STDIN
  inspect     Display detailed information on one or more configs
  ls          List configs
  rm          Remove one or more configs

           

結語:

–help

k8s

go語言

雲原生

CI\CD

devops是一種思想方法論,它涵蓋開發、測試、運維的整個過程。

devops強調軟體開發人員與軟體測試、軟體運維,品質保證(QA)

部門之間有效的溝通與協作。

強調通過自動化的方法管理軟體變更,軟體繼承。

使軟體從建構到測試,釋出更加快捷、可靠,最終按時傳遞。

狂神Docker基礎、進階筆記,為k8s的學習預預熱标題了解阿裡雲Docker學習

最初是瀑布模型,後來是靈活開發,現在是DevOps,這是現代開發人員建構出色的産品的技術路線。随着DevOps的興起,出現了持續內建(Continuous Integration)、持續傳遞(Continuous Delivery) 、持續部署(Continuous Deployment) 的新方法。傳統的軟體開發和傳遞方法正在迅速變得過時。從曆史上看,在靈活時代,大多數公司會每月,每季度,每兩年甚至每年釋出部署/釋出軟體。然而,現在,在DevOps時代,每周,每天,甚至每天多次是常态。當SaaS正在占領世界時,尤其如此,您可以輕松地動态更新應用程式,而無需強迫客戶下載下傳新元件。很多時候,他們甚至都不會意識到正在發生變化。開發團隊通過軟體傳遞流水線(Pipeline)實作自動化,以縮短傳遞周期,大多數團隊都有自動化流程來檢查代碼并部署到新環境。今天,我們将介紹什麼是CI / CD / CD,以及現代軟體公司如何使用工具将部署代碼的流程自動化。

持續內建的重點是将各個開發人員的工作集合到一個代碼倉庫中。通常,每天都要進行幾次,主要目的是盡早發現內建錯誤,使團隊更加緊密結合,更好地協作。

持續傳遞的目的是最小化部署或釋放過程中固有的摩擦。它的實作通常能夠将建構部署的每個步驟自動化,以便任何時刻能夠安全地完成代碼釋出(理想情況下)。

持續部署是一種更高程度的自動化,無論何時對代碼進行重大更改,都會自動進行建構/部署。

這些階段中的每一個都是傳遞管道的一部分 。在Humble和Farley的書《持續傳遞:可靠的軟體版本中,通過建構,測試和部署自動化》,解釋“對軟體的每次更改,都會在釋出過程中經曆一個複雜的過程。該過程涉及建構軟體,然後通過多個測試和部署階段進行這些建構。反過來,這需要許多人之間的合作,也許需要幾個團隊之間的合作。部署管道對此過程進行模組化,并且它在持續內建和釋出管理工具中的實作,使您能夠在從版本控制轉移到各種測試和部署,以向使用者釋出時檢視和控制每個更改的進度。”