Docker容器學習梳理--基礎知識(1)
Docker是PaaS 提供商 dotCloud 開源的一個基於 LXC 的高階容器引擎,原始碼託管在 Github 上, 基於go語言並遵從Apache2.0協議開源。
Docker是通過核心虛擬化技術(namespace以及cgroups等)來提供容器的資源隔離與安全保障。由於Docker通過作業系統層的虛擬化實現隔離,所以Docker容器在執行時,不需要類似虛擬機器( VM)額外的作業系統開銷,提高資源利用率。
原理:建立-->傳送-->執行
架構:C/S架構
元件:映象(Image)、容器(Container)、倉庫(Repository)
Docker與VM的區別:
docker與Openstack的對比
Docker用途:簡單配置、程式碼流水線管理、開發效率、應用隔離、伺服器整合、除錯能力、多租戶、快速部署
Docker改變了什麼?
面向產品:產品交付
面向開發:簡化環境配置
面向測試:多版本測試
面向運維:環境一致性
面向架構:自動化擴容
Docker環境的安裝部署
環境準備(centos7)
yum install -y docker systemctl start docker systemctl enable docker
映象的檢視(docker images資訊結果包括:映象倉庫、標籤、映象ID、建立時間、映象大小 )
[[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE docker.io/centos latest 60e65a8e4030 36 hours ago 196.6 MB docker.io/nginx latest 813e3731b203 9 days ago 133.8 MB docker.io/registry latest a8706c2bfd21 2 weeks ago 422.8 MB
映象的匯出、匯入和下載(可以將本機下載的映象匯出,然後將匯出檔案上傳到別的機器上,在別的機器上進行映象匯入)
[[email protected] ~]# docker pull centos [[email protected] ~]# docker save centos > /opt/centos.tar.gz 將linux-node2的映象匯出檔案上傳到linux-node1機器上,然後在linux-node1機器上匯入 [[email protected] ~]# docker load < /opt/centos.tar.gz
映象的刪除(rmi後面可以跟多個id,用空格隔開)
docker rmi container_id
[[email protected] ~]# docker rmi 813e3731b203
Docker重新命名映象名稱和TAG
# docker tag IMAGEID(映象id) REPOSITORY:TAG(倉庫:標籤)
[[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE <none> <none> 93ec41b5ed04 About an hour ago 435.9 MB [[email protected] ~]# docker tag 93ec41b5ed04 kevin/nginx:v1 [[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE kevin/nginx v1 93ec41b5ed04 About an hour ago 435.9 MB
首次建立一個簡單的容器
[[email protected] ~]# docker run centos /bin/echo "hehe" hehe
命令解讀:使用centos映象,run執行命令,使用echo命令輸出hehe
檢視容器狀態
可以使用docker ps只能看見存活的容器,docker ps -a 檢視全部的容器,結果資訊表示:
容器ID、使用的映象、執行的命令、建立的時間、狀態、埠、名稱(如果不指定,自動生成)
[[email protected] ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES daeb4d7f7aab centos "/bin/echo hehe" About a minute ago Exited (0) About a minute ago insane_einstein
建立容器
--name:指定容器名稱
-t :分配一個tty終端
-i :容器的標準輸保持開啟的狀態
[[email protected] ~]# docker run --name mydocker -t -i centos /bin/bash [[email protected] /]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 11772 1872 ? Ss 03:42 0:00 /bin/bash root 14 0.0 0.0 35888 1472 ? R+ 03:43 0:00 ps aux
這種方式建立自動進入容器,開啟的容器只執行/bin/bash;
在容器中檢視主機名
[[email protected] /]# hostname 94ab7a046f7c [[email protected] /]# exit
啟動、停止容器
[[email protected] ~]# docker stop ID
[[email protected] ~]# docker start ID
進入容器
[[email protected] ~]# docker attach 94ab7a046f7c
[[email protected] /]#
刪除容器
[[email protected] ~]# docker rm ID/名稱 加-f 強制刪除,包括正在執行中的容器
對映
隨機對映
埠的對映是系統自動分配的?
[[email protected] ~]# docker run -d -P nginx 90316d97ee975b4e62e1927a9fb31f20703556b1a3ea07880d0c68dcb5bbd3bb [[email protected] ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 90316d97ee97 nginx "nginx -g 'daemon off" 25 seconds ago Up 23 seconds 0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp ecstatic_almeida
指定對映
指定埠的對映
[[email protected] ~]# docker run -d -p 81:80 nginx 0294a8f5b4fc81ba31383a8eb98ec62b136826eba92360c84afd87bf1bf819fc [[email protected] ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0294a8f5b4fc nginx "nginx -g 'daemon off" 11 seconds ago Up 10 seconds 443/tcp, 0.0.0.0:81->80/tcp admiring_ramanujan
檢視日誌
[[email protected] ~]# docker logs +ID
資料管理
資料卷
預設掛載目錄
建立一個數據卷,名稱是volume-test1,掛載到data下預設掛載目錄
[[email protected] ~]# docker run -it --name volume-test1 -v /data centos [[email protected] /]# ls -l /data/ total 0
開啟一個新的視窗
列出容器的所有資訊,檢視mounts模組
[[email protected] ~]# docker inspect 1768d6414cfc "Mounts": [ { "Name": "55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167", "Source": "/var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data", "Destination": "/data", "Driver": "local", "Mode": "", "RW": true } ],
查詢掛載點並進入
檢視掛載的位置 [[email protected] ~]# ll /var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data 總用量 0 進入到掛載點 [[email protected] ~]# cd /var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data
建立一個cgt測試,並重新回到容器中檢視
[[email protected] _data]# mkdir cgt 去容器中檢視 [[email protected] /]# ls -l /data/ total 4 drwxr-xr-x 2 root root 4096 Jan 4 14:04 cgt
指定掛載目錄
將/opt掛載到/opt目錄下 [[email protected] ~]# docker run -it --name volume-test1 -v /opt:/opt centos
指定許可權
只需要在掛載後面加上許可權即可。
加讀寫rw;只讀ro
[[email protected] ~]# docker run -it --name volume-test1 -v /opt:/opt:rw centos
掛載單個檔案
記錄歷史記錄
[[email protected] ~]# docker run -it -v ~/.bash_history:/.bash_history centos
資料卷容器
讓一個容器可以訪問另一個容器的資料卷
啟動兩個容器
啟動nfs容器,掛在一個卷,使用-d直接在後臺執行 [[email protected] ~]# docker run -d --name nfs -v /data centos 209bc89b365ad6bc1eeae693ada01c04c2d08e9ee2b8816e624882944c116126 啟動test1容器,掛載到nfs的資料卷容器上, [[email protected] ~]# docker run -it --name test1 --volumes-from nfs centos [[email protected] /]# ls /data/ 檢視沒內容
找到nfs容器的掛載點
(可以使用名稱,不僅僅是ID)
找到nfs容器的ID [[email protected] opt]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 209bc89b365a centos "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago nfs 找到nfs容器的掛載點
[[email protected] _data]# docker inspect nfs [[email protected] opt]# cd /var/lib/docker/volumes/3938c9b1143d41340e148a4c7bc12d13b53966b15380c5b958a9e035897450d5/_data [[email protected] _data]# touch cgt
在test1上檢視
到test1上檢視 [[email protected] /]# ls /data/ cgt
注意:資料卷容器不論停止還是開啟,不影響其他容器掛載使用
如何製作映象
方式一:手動構建容器
1)建立一個容器mynginx,使用centos映象
[[email protected] ~]# docker run --name mynginx -it centos [[email protected] /]# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm [[email protected] /]# yum -y install nginx [[email protected] /]# exit exit
2)基於mynginx容器做一個映象mynginx:v1
[[email protected] ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f9c7dfb6f552 centos "/bin/bash" 3 minutes ago Exited (0) 15 seconds ago mynginx 基於mynginx這個容器做一個映象 [[email protected] ~]# docker commit -m "my nginx" f9c7dfb6f552 cgt/mynginx:v1 3f3adc859b77b2b47c3631229761bee6c7066f1c708bc01c5173c2ef5c0adce8 提交映象,同時打一個標籤叫mynginx:v1,cgt相當於你向github上提交的使用者名稱 檢視映象 [[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE cgt/mynginx v1 3f3adc859b77 About a minute ago 326.4 MB
3)基於mynginx:v1建立一個容器mynginxv1
目的是修改nginx不讓其在後臺執行
[[email protected] ~]# docker run -it --name nginxv1 cgt/mynginx:v1 [[email protected] /]# vi /etc/nginx/nginx.conf daemon off; # 不再後臺執行 [[email protected] /]# exit exit [[email protected] ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ea64c5855006 cgt/mynginx:v1 "/bin/bash" 2 minutes ago Exited (0) 42 seconds ago nginxv1
4)基於mynginxv1提交mynginxv2版本
重新提交V2版本 [[email protected] ~]# docker commit -m "my nginx" ea64c5855006 cgt/mynginx:v2 a480cdf9055ec4e640c65df6404c6ba42903ea77198a26cec75eef0e4965fe67 檢視V2映象 [[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE cgt/mynginx v2 a480cdf9055e 25 seconds ago
5)基於mynginxv2映象,建立mynginxv2容器
啟動容器,-d後臺執行,-p指定埠 在後面是映象,最後是命令(因為是yum安裝的,可以直接寫nginx,如果不是yum,那要寫絕對路徑) [[email protected] ~]# docker run -d -p 82:80 cgt/mynginx:v2 nginx 4eaf8a19034a673100f9355504628fad45e6ecbab91615afd6cb4e7a18b82171 [[email protected] ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4eaf8a19034a cgt/mynginx:v2 "nginx" 15 seconds ago Up 14 seconds 0.0.0.0:82->80/tcp elegant_leakey 可以在瀏覽器訪問82埠
方式二:Dockerfile
1)Dockerfile包含的資訊
基礎映象資訊
維護者資訊
映象操作指令
容器啟動時執行指令
2)檔案的編寫
[[email protected] ~]# mkdir /opt/dockerfile/nginx/ -p [[email protected] ~]# cd /opt/dockerfile/nginx/ 將index.html上傳到此處 [[email protected] nginx]# vim Dockerfile # This is docker file # version v1 # Author wangshibo # Base image(基礎映象) FROM centos # Maintainer(維護者資訊) MAINTAINER wangshibo [email protected] # Commands(執行命令) RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm RUN yum -y install nginx # Add(新增檔案) ADD index.html /usr/share/nginx/html/index.html # index.html是自己編寫的檔案,放在後面的目錄中,因為yum安裝後Documentroot是在這裡 RUN echo "daemon off;" >>/etc/nginx/nginx.conf EXPOSE 80 # 對外的埠 CMD ['nginx'] # 執行的命令
3)構建容器,並執行
建立newnginx容器,-t:標籤,執行/opt/dockerfile/nginx/下面的預設的Dockerfile檔案 [[email protected] nginx]# docker build -t cgt/mynginx:v3 /opt/dockerfile/nginx/ [[email protected] nginx]# docker run -d -p 83:80 cgt/mynginx:v3
Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux機器上,也可以實現虛擬化。當你真正投入容器Docker的懷抱,不但可以發現它能解決很多問題,而且還具有眾多的優點:
1)它是不可變的-作業系統,庫版本,配置,資料夾和應用都是一樣的。您可以使用通過相同QA測試的映象,使產品具有相同的表現。 2)它是輕量級的-容器的記憶體佔用非常小。不需要幾百幾千MB,它只要對主程序分配記憶體再加上幾十MB。 3)它很快速-啟動一個容器與啟動一個單程序一樣快。不需要幾分鐘,您可以在幾秒鐘內啟動一個全新的容器。
但是,許多使用者依然像對待典型的虛擬機器那樣對待容器,似乎都忘記了除了與虛擬機器相似的部分,容器還有一個很大的優點:它是一次性的。
這個“特性”本身促使使用者改變他們關於使用和管理容器的習慣;下面將會說明下在容器中不應該做這些事,以確保最大地發揮容器的作用。
1)不要在容器中儲存資料 – 容器可能被停止,銷燬,或替換。一個執行在容器中的程式版本1.0,應該很容易被1.1的版本替換且不影響或損失資料。有鑑於此,如果你需要儲存資料,請存在卷中,並且注意如果兩個容器在同一個捲上寫資料會導致崩潰。確保你的應用被設計成在共享資料儲存上寫入。 2)不要將你的應用釋出兩份 – 一些人將容器視為虛擬機器。他們中的大多數傾向於認為他們應該在現有的執行容器裡釋出自己的應用。在開發階段這樣是對的,此時你需要不斷地部署與除錯;但對於質量保證與生產中的一個連續部署的管道,你的應用本該成為映象的一部分。記住:容器應該保持不變。 3)不要建立超大映象 – 一個超大映象只會難以分發。確保你僅有執行你應用/程序的必需的檔案和庫。不要安裝不必要的包或在建立中執行更新(yum更新)。 4)不要使用單層映象 – 要對分層檔案系統有更合理的使用,始終為你的作業系統建立你自己的基礎映象層,另外一層為安全和使用者定義,一層為庫的安裝,一層為配置,最後一層為應用。這將易於重建和管理一個映象,也易於分發。 5)不要為執行中的容器建立映象 – 換言之,不要使用“docker commit”命令來建立映象。這種建立映象的方法是不可重現的也不能版本化,應該徹底避免。始終使用Dockerfile或任何其他的可完全重現的S2I(源至映象)方法。 6)不要只使用“最新”標籤 – 最新標籤就像Maven使用者的“快照”。標籤是被鼓勵使用的,尤其是當你有一個分層的檔案系統。你總不希望當你2個月之後建立映象時,驚訝地發現你的應用無法執行,因為最頂的分層被非向後相容的新版本替換,或者建立快取中有一個錯誤的“最新”版本。在生產中部署容器時應避免使用最新。 7)不要在單一容器中執行超過一個程序-容器能完美地執行單個程序(http守護程序,應用伺服器,資料庫),但是如果你不止有一個程序,管理、獲取日誌、獨立更新都會遇到麻煩。 8)不要在映象中儲存憑據。使用環境變數 –不要將映象中的任何使用者名稱/密碼寫死。使用環境變數來從容器外部獲取此資訊。 9)使用非root使用者執行程序 – “docker容器預設以root執行。(…)隨著docker的成熟,更多的安全預設選項變得可用。現如今,請求root對於其他人是危險的,可能無法在所有環境中可用。你的映象應該使用USER指令來指令容器的一個非root使用者來執行。” 10)不要依賴IP地址 – 每個容器都有自己的內部IP地址,如果你啟動並停止它地址可能會變化。如果你的應用或微服務需要與其他容器通訊,使用任何命名與(或者)環境變數來從一個容器傳遞合適資訊到另一個。
相關推薦
Docker容器學習梳理--基礎知識(1)
Docker是PaaS 提供商 dotCloud 開源的一個基於 LXC 的高階容器引擎,原始碼託管在 Github 上, 基於go語言並遵從Apache2.0協議開源。Docker是通過核心虛擬化技術(namespace以及cgroups等)來提供容器的資源隔離與安全保障。由於Docker通過作業系統層
Docker容器學習梳理--基礎知識(2)
之前已經總結了Docker容器學習梳理--基礎知識(1),但是不夠詳細,下面再完整補充下Docker學習的一些基礎。 Docker是個什麼東西 Docker是一個程式執行、測試、交付的開放平臺,Docker被設計為能夠使你快速地交付應用。 在Docker中,你可以將你的程式分為不同的基礎部分,對於每一個基
《組合語言(第3版)(王爽 著)》學習筆記一:基礎知識(1)
組合語言是直接在硬體之上工作的程式語言,我們首先要了解硬體系統的結構,才能有效地應用匯編語言對其程式設計。 彙編課程的研究重點放在如何利用硬體系統的程式設計結構和指令集有效靈活地控制系統進行工作。
Spring MVC學習記錄(一)——網站基礎知識(1)
Spring MVC學習之——網路架構及演變過程 1.軟體的三大型別:單機型別、CS型別、BS型別。 單機型別:曾經的主要軟體型別,不聯網,實現電腦的基本功能,如打字、畫圖。 CS型別:單機之後為了統一管理軟體的資料,產生了客戶端和伺服器端,客戶端管理業務,伺服器端管理資料
Docker容器學習梳理--基礎環境安裝
以下是centos系統安裝docker的操作記錄 1)第一種方法:採用系統自帶的docker安裝,但是這一般都不是最新版的docker安裝epel源[[email protected] ~]# wget http://dl.fedoraproject.org/pub/epel/epel-relea
andengine的基礎知識(1)
screen ext spl lead ger object import its xtu 使用的是AndEngine ES2。在github上可以搜索到。將所有的包下載下來在同一個工作區間即可。只是會有一些錯誤。 1.將org.andengine.examples.Hul
c++ 部分基礎知識 ---- (1)
知識 gin href com cin http targe 基礎知識 ucs 灰dtj4慚fv腺伎孕6xnhttp://www.docin.com/app/user/userinfo?userid=179253887 傅zpf攣詿4隊餵皇影http://www.doci
shell基礎知識(1)
變量 env set 基礎知識 shell基礎知識1.shell是系統跟計算機硬件交互時使用的中間介質,他是一個系統工具。如果·把計算機硬件比喻人的“軀體”,那系統內核是人的“大腦”,shell是人的“五官”。2.記錄命令歷史正常退出shell時,當前shell運行的命令會保存到.bash_h
廖雪峰網站—學習python基礎知識(三)
style 字符串 知識 code ron sar sof 轉換 () 一、判斷 1、條件判斷 age = 18 if age >= 18: print(‘your are is‘, age) print(‘adult‘) ag
Linux入門基礎知識(1)
win 字符設備 命令的使用 ESS pow 體驗 存放位置 編程 echo -e 描述計算機的組成及其功能計算機系統由硬件系統與軟件系統兩大部分組成。1.1 計算機硬件系統五大部分組成運算器、控制器、存儲器、輸入設備、輸出設備。1.2 計算機硬件系統五大部分功能解釋及作
影象處理的基礎知識(1)
第一步、對影象進行一個初步的認識: 彩色影象:每個畫素由R、G、B三個分量表示,每個通道取值範圍0~255。資料型別一般為8位無符號整形。範例: filePath = "F:\\learning\\code(1)\\Py\\1.jpg" img = cv2.imread(filePath)
嵌入式linux學習之基礎知識(一) linux檔案許可權
linux 檔案許可權相關 Linux使用者分為: 擁有者、組群(Group)、其他(Other) linux檔案的許可權總共有10位,如 -rwxrwxr-x ,分為4段。 第一段 佔1位 表示檔案的型別 - :表示普通檔案 d :表示資料夾、目錄 l :表示連結檔案,類似window
Java-----基礎知識(1)
args 基礎知識 執行 stat system void word str ava //功能:打印hello word! public class Hello { //public :表式這個類是公眾的(限制性關鍵字),一個Java文件中只能有一個 //class:表式這
Atitit web 之道 艾龍著 Atitit web 之道 艾龍艾提拉著v2 saa.docx 1. 第1章 Web程式設計基礎知識 (1) 3 1.1. 1.1 什麼是Web (1) 3 1.2.
Atitit web 之道 艾龍著 Atitit web 之道 艾龍艾提拉著v2 saa.docx 1. 第1章 Web程式設計基礎知識 (1) 3 1.1. 1.1 什麼是Web (1) 3 1.2. 1.2 Web的工作原理 (2) 3 1.3. 1.3 Int
網路通訊基礎知識(1)
網路通訊基礎知識(1) 網路通訊的發展歷程 (1)單擊階段 (2)區域網階段 (3)廣域網internet階段 (4)移動網際網路階段 (5)物聯網階段 三大網路 電信網、電視網路、網際網路 網路通訊的傳輸媒介
JS基礎知識(1)
內建型別 js有七種內建型別,七種內建型別又分為兩大型別:基本型別和物件(Object)。 六種基本型別: null,undefined,boolean,number,string,symbol。 JS 的數字型別是浮點型別的,沒有整型。NaN 也屬於 number
軟體測試基礎知識(1)
軟體測試: 從執行狀態來看分為:動態測試、靜態測試; 從按執行過程來看分為:手工測試、自動化測試; 從內容劃分來看:功能測試、易用性測試、相容性測試、文件測試等, 從用例設計來看:黑盒測試、白盒測試、灰盒測試; 按開發:單元測試、系統測試、整合測試、驗
小白的數位電路邏輯設計筆記(二)----邏輯代數基礎知識(1)
一、概述 邏輯代數,又名布林代數,開關代數。邏輯代數是一個二值代數系統,由三部分組成:常量(0和1),變數(K),基本運算子(與或非)。邏輯代數中的變數叫邏輯變數,用字母表示,取值只有0和1,但此處0和1並沒有量的概念,只是兩種對立狀態的表示方式。由邏輯變數組成的函式叫邏輯
嵌入式linux學習之基礎知識(一)
1)linux檔案的許可權 Linux使用者分為: 擁有者、組群(Group)、其他(Other) linux檔案的許可權總共有10位,如 -rwxrwxr-x ,分為4段,有4種含義。 ## 第一段 佔1位 表示檔案的型別 - :表示檔案 d :
Java部分基礎知識(1)
Java中的預設值: 基本資料型別:char預設型別: ’\u0000’ boolean預設型別:false 其他預設值 0 引用資料型別:null,用的會