天天看點

一天碼完docker基礎(尚矽谷B站視訊)

一整天,碼完docker基礎教程

1.首先安裝centos7并圖形化界面(我栽在沒有圖形化界面,浪費了一下午,先用指令行敲最後發現還是需要圖形化界面 然後栽了大跟頭重新安裝了一次 )虛拟機安裝在硬體上網絡選橋接模式,

圖形化界面的教程 

yum groupinstall "GNOME Desktop" "Graphical Administration Tools"
           

開始docker之旅,建議兩個顯示屏or一台電腦一個ipad,邊學邊做or記筆記 提高效率。可使用markdown記錄筆記,盡管我還沒有好的方法上傳圖檔,筆記記錄如下。

# Docker 學習記錄 容器虛拟化技術#
一次建構,處處運作
Docker是基于go語言實作的雲開源項目,隻需要一次配置好環境,換到别的機子上就可以一鍵部署好,人人簡化了操作。
解決了運作環境和配置問題軟體容器,友善做持續繼承并有助于整體釋出的容器虛拟技術。
root zh123456
# Docker可以做什麼(容器虛拟技術) #
Linex容器(LXC)不是模拟一個完整的作業系統,而是對程序進行隔離。容器與虛拟機不同,不需要捆綁一整套作業系統,隻需要軟體工作所需的庫資源和設定,系統是以而變得高效輕量。
# 與傳統虛拟機比較 #
1. 傳統虛拟機技術是虛拟出一套硬體後,在其上運作一個完整作業系統,在該系統上再運作所需應用程序
2. 而容器内的應用程序直接運作于宿主的核心,容器内沒有自己的核心,而且也沒有進行硬體虛拟。是以容器要比虛拟機更為輕便。
3. 容器之間互相隔離,每個容器都有自己的檔案系統,容器之間程序不會互相影響,能區分計算資源。

# 三大特征 #
鏡像 容器 倉庫

CentOS6.5以上


uname -r 檢視版本

鏡像:模闆(隻讀)一個鏡像可以建立多個容器
容器:執行個體 容器是用鏡像建立的運作執行個體
它可以被啟動、開始、停止、删除。每個容器都是互相隔離的。保證安全的平台
相當于一個簡易版的Linex系統和運作再其中的應用程式。
容器可讀可寫
倉庫:集中存放鏡像檔案的場所
倉庫和倉庫注冊伺服器是有差別的。倉庫注冊伺服器上往往放着多個倉庫,每個倉庫中有包含了多個鏡像,每個鏡像有不同的标簽。
倉庫分為公開倉庫和私有倉庫兩種形式國内公開倉庫包括阿裡雲、網易雲等


Docker本身是一個容器運作載體或稱之為管理引擎。我們把應用程式和配置依賴打包好形成一個可傳遞的運作環境,這個打包好的運作環境就是image鏡像檔案。隻有通過這個鏡像檔案才能生成Docker容器。image檔案可以看作是容器的模闆。Docker根據image檔案生成容器的執行個體。同一個image檔案,可以生成多個同時運作的容器執行個體。
image檔案生成的容器執行個體,本身也是一個檔案,稱為鏡像檔案
一個容器運作一種服務,當我們需要的時候,就可以通過docker用戶端建立一個對應的運作執行個體,也就是我們的容器
至于倉庫,就是放了一堆鏡像的地方,我們可以把鏡像分布到倉庫中,需要的時候從倉庫中拉下來就可以了。

# Docker原理 #
Docker是一個CS結構體系,Docker守護程序運作在主機上,然後通過Socket連接配接從用戶端通路,守護程序從用戶端接收指令并管理運作在主機上的容器。容器,是一個運作時環境

# 為什麼Docker比VM快 #
1. Docker有着比虛拟機更少的抽象層。由于Docker不需要Hypervisor實作硬體資源虛拟化,運作在docker容器上的程式直接使用的都是實際實體機的硬體資源。是以在
2. 
3. 
4. 
5. U、記憶體使用率上docker将會在效率上有明顯優勢。
2. docker利用的時主控端的核心,而不需要Guest OS.是以,當建立一個容器時,docker不需要和虛拟機一樣重新加載一個作業系統核心。是以避免引尋、加載作業系統核心傳回比較費時費資源的過程,當建立一個虛拟機時,虛拟機軟體需要加載Guest OS。而docker由于直接利用主控端的作業系統,則省略了這個過程



1. 作業系統: 與主控端共享OS  主控端OS上運作虛拟機OS
2. 存儲大小: 鏡像小,便于存儲與傳輸  鏡像龐大
3. 運作性能: 幾乎無額外性能損失 操作新系統額外的CPU、記憶體消耗
4. 移植性: 輕便、靈活、适應于Linux 笨重、與虛拟化技術耦合度高
5. 硬體親和性:面向軟體開發者 面向硬體開發者
6. 部署速度:快速,秒級   較慢

# 幫助指令 #
1. docker version 版本
2. docker info 資訊描述(加速器之類的資訊都在)
3. docker - help

# Docker 鏡像指令 #  
## docker images  本地擁有的鏡像模闆 ##
REPOSITORY  表示鏡像的倉庫源
TAG 鏡像的标簽
IMAGE ID: 鏡像ID
CREATED:鏡像建立時間
SIZE:鏡像大小
## OPTIONS ##
-a 列出本地所有的鏡像(含中間映像層)
-q 隻顯示鏡像ID
--digests:顯示鏡像的摘要資訊
--no-trunc:顯示完整的鏡像資訊

## docker search (某個鏡像的名字)##

eg: docker search tomcat
## OPTIONS ##
-s 點贊數
docker search -s 50 tomcat 超過50點贊數的tomcat
--no-trunc  完整摘要資訊
--automated  隻列出automated build類型的鏡像 

## docker pull (鏡像:TAG 預設lastest) ##


## docker rmi (鏡像)   删除某個鏡像##
eg: docker rmi hello-world

如果沒有删除(強制删除)

docker rmi -f hello-world

删除多個 docker rmi -f 鏡像名1:TAG 鏡像名2:TAG

删除全部:docker rmi -f $(docker images -qa)

# 容器指令 #
docker pull centOS

## 建立并重新開機容器 docker run[OPTIONS] Image [command] ##

eg docker run -it --name myCentors ID(具體ID) 啟動互動式容器

or docker run -it centos

進入ID myCentors

-name="容器新名字":為容器指定一個名稱
-d 背景運作容器,并傳回容器ID,也即啟動守護端容器
-i 以互動模式運作容器,通常與-t同時使用
-t 為容器重新配置設定一個僞輸入終端,通常與-i同時使用
-P 随機端口映射
-p 指定端口映射,有四種格式

**ps -ef**


## 列出目前所有正在運作的容器 docker ps [OPTIONS] ##
docker ps -l 上一個運作的
docker ps -a 過去所有的
docker ps -3 上三次運作的(不能用啦)
docker ps -q 隻顯示容器編号

## 退出容器 ##
 exit  容器停止退出

ctrl + P + Q  容器不停止退出

## 啟動容器 docker start ID ##
docker start ID
docker stop ID
docker restart ID


## 關閉容器 ##
docker stop ID 溫柔

docker kill ID 強制

## 删除已關閉的容器 ##
docker rm 容器ID
docker rm -f 容器ID

一次性删除多個
 docker rm -f $(docker ps -a -q)
  
(管道操作) docker ps -a -q | xargs docker rm


# 非互動式容器  守護程序的方式啟動 #
docker run -d

此時docker ps 無該程序 

why: **(docker機制)**Docker容器背景運作,就必須有一個前台程序
容器運作的指令如果不是那些一直挂起的指令(eg top tail)就會自動退出

eg docker run -d centos

docker run -d centos (/bin/bash) "while true; do echo hello zzhh;sleep 2;done"

有些需要背景有些前台

## 檢視容器日志 ##
docker logs -f -t --tail 容器ID
t 是加入時間戳
f 跟随最新的日志列印
tail 顯示最後多少條

docker logs -f -t --tail 3 ID 顯示最後三條log
## 檢視容器内的程序 ##

docker top ID

## 檢視容器内部細節 ##
docker inspect ID

很多内容的顯示

## 進入正在運作的容器并以指令行互動 ##
docker exec -it ID bashShell
 
重新進入 docker attach ID

上述兩個差別  attach 直接進入容器啟動指令的終端,不會啟動新的程序

exec 是在容器中打開新的終端,并且可以啟動新的程序


docker cp ID 容器内路徑 目的主機路徑

# Docker鏡像原理 #
鏡像是一種輕量級、可執行的獨立軟體包,用來打包軟體運作環境和基于運作環境開發的軟體,它包含運作某個軟體所需的所有内容,包括代碼、運作時庫、環境變量和配置檔案。

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

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


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

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

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

docker run -it  -p 8080:8080 tomcat


注:404不要慌

1.下tomcat
2.故意删除上一步鏡像生産tomcat容器的文檔
3.也即目前的tomcat運作執行個體是一個沒有文檔内容的容器,以它為模闆commit一個沒有doc的tomcat新鏡像zh/tomcat02
4.啟動我們的新鏡像并和原來的對比

docker commit -a="zh" -m="tomcat without doc" 8ac186689731 zh/tomcat:1.2  以tomcat為模闆生成新的容器

docker run -it zh/tomcat:1.2
docker run -it -p 7777:8080 zh/tomcat:1.2



docker run -d -p 7777:8080 zh/tomcat:1.2 背景運作 不會列印日志

# Docker 容器資料卷 #

目的:關閉容器後儲存容器内的資料

特點:
- 資料卷可在容器之間共享或重用資料
- 
- 
- 資料卷中的更改不會包含在鏡像的更新中
- 
- 資料卷的生命周期一直持續到沒有容器使用它為止
- 

## 容器内添加資料卷 ##
docker run -it -v/宿主内絕對路徑目錄:/容器内目錄 鏡像名


docker run -it -v /myDataVolume: /dataValumeContainer centos

(相當于挂載)

根目錄  cd /
根目錄下 ll(L)

cat host.txt  檢視檔案内容

**注** 即使關閉容器,主機修改,再開啟容器後後還是會拉取主機資料

# 指令 帶權限 #
docker inpsect ID 

docker run -it -v /主控端絕對路徑目錄:/容器内目錄:ro(隻讀) 鏡像名(可以主機寫 但是容器内無法做修改等操作 容器隻有檢視的權限 無增删改)

删除某個路徑下所有檔案
先cd .. 退出一層
然後 rm -rf (檔案名)/

# dockerfile 添加 #
1. 根目錄下建立mydocker檔案夾并進入
2. 可在Docker中使用VOLUME指令來給鏡像添加一個或多個資料卷,編寫檔案dockerfile
3. file建構
4. build 獲得自定義的鏡像
5. run


VOLUMS["/dataVolumeContainer","/dataVolumeContain2","/dataVolumeContainer3"]

	FROM centos
	VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
	CMD echo "finished,.....success1"
	CMD /bin/bash
(在該路徑下做)
docker bulid -f /mydocker/Dockerfile it zh/centos

docker run -it zh/centos

Docker挂載主機目錄Docker通路出現cannot open directory:Permisssion denied

解決方法:在挂載目錄後多加一個-privileged= true


說明:
出于移植性和分享的考慮,用-v主機目錄容器目錄這種方式不能夠直接在dockerfile中實作
由于主控端目标是依賴于特定主控端的,并不能夠保證在所有的主控端上都存在這樣的特定目錄。

## 資料卷容器 ##

容器間傳遞共享  volume from
eg  2的資料來源1 

docker run -it --name do1 zh/centos
cd dataVolumeContainer2
touch dc01_add.txt

docker run -it --name do2 --volumes-from do1 zh/centos
docker run -it --name do3 --volumes-from do1 zh/centos

do2中有add.txt

do1 do2 do3的檔案是同步的,将1删除後,do2 do3的資料依舊是同步的

dockerfile是用來建構Docker鏡像的建構檔案 編寫dockerfile build run三步

每條保留字指令都必須為大寫字母且後面要跟随至少一個參數

指令按照從上到下,順序執行

#表示注釋

每條指令都會建立一個新的鏡像層,并對鏡像進行送出

從應用軟體的角度來看,Dockerfile、Docker鏡像與Docker容器分别代表軟體的三個不同階段
1. Dockerfile是軟體的原材料 面向開發
2. Docker鏡像是軟體的傳遞品 面向傳遞
3. Docker容器則是軟體的運作态 面向部署與運維

## 保留字指令 ##
設定環境變量  檔案位置
FROM centos
MAINTAINER zzhh
ENV mypath /tmp
WORKDIR $mypath
RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80
CMD /bin/bash

列出鏡像變遷史

docker history ID

CMD 啟動一個容器是執行的指令  隻有最後的一條指令生效
ls -l 
注 CMD會被docker run 後面的參數覆寫
docker run -iwt -p 7777:8080 tomcat ls -l

ENTRYPOINT  在後追加
docker run後面的參數會被當做參數傳遞給ENTRYPOINT,之後形成新的指令組合

FROM centos
RUN yum install -y curl
CMD ["curl","-s","http://ip.cn"]
注:1020錯誤

FROM centos
RUN yum install -y curl
CMD ["curl","-s","http://ip.cn"]
ONBUILD RUN echo "your father" 如果有人繼承該容器 則會被列印
注:1020錯誤

大項目 串起來
cope 拷貝檔案和目錄到鏡像中。将從建構上下文目錄中<原路徑>的檔案/目錄複制到新的一層鏡像内的<目标路徑>


mysql 5.6

docker run -p 12345:3306 --name mysql -v /zh/mysql/conf.d:/ect/mysql/conf.d -v /zh/mysql/logs:/logs -v /zh/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6


redis
docker run -d -p 6379:6379 -v $PWD/conf/redis.conf:/usr/local/etc/redis/redis.conf -v $PWD/data:/data --name docker-redis docker.io/redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes

。