一天碼完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

。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章