Docker筆記_docker基礎
一.理解docker
- docker提供了一個開發,打包,執行APP的平臺
- docker把APP和底層infrastructure隔離開來
Application Docker Engine infrastructure(physical / virtual)
Docker Engine: 是一個 Client-Server 架構, 主要由三部分構成.
- 後臺程序 (dockerd) : Docker daemon
- REST API Server : 一套與 Docker daemon 互動的 REST API
- CLI介面 (docker) : 一個命令列客戶端
通過 ps -ef | grep docker 可以看到dockerd程序
Docker的總體架構:
Docker底層技術支援:
- Namespaces: 做隔離pid, net, ipc, mnt, uts
- Control groups: 做資源限制
- Union file ststems: Container和image的分層
二.Docker Image
docker image 介紹:
- 檔案(rootfs) 和 meta data的集合
- 分層的,並且每一層都可以新增改變刪除檔案,成為一個新的image
- 不同的image可以共享相同的layer (image #2, image #4 共享Centos Image)
- Image本身是隻讀的
- (注: linux系統分為核心空間(bootfs,即Linux Kernel) 和 使用者空間(rootfs), 在bootfs上做的一些linux發行版(ubuntu, centos, debian等) 就是rootfs,這些 linux發行版屬於Base Image. Base Image 只包含rootfs,不包含bootfs,不同的base image 可以共享主機裡的Linux Kernal,這就是docker比較小巧的原因. 在base image 上可以新增修改刪除檔案(即安裝一些軟體),就會產生新的一層,從而產生一個新的image)
docker image 的獲取:
- 編寫dockerfile,build成image
- 從registry (如 docker hub)上pull image
通過新增docker使用者組,可以去掉執行docker命令時的"sudo"許可權:
sudo groupadd docker //新建一個名為docker的使用者組 sudo gpasswd -a vagrant docker //將使用者vagrant加到docker組裡 //執行完上述命令後,可能還需要重啟docker服務,重新進入vagrant虛機
1>. groupadd命令:
為了方便管理,可以對一群有相近需求的使用者新增一個組,groupadd命令可以實現這個功能,groupadd命令用於增加一個新組。
Usage: groupadd [options] GROUP
Options: -f, --force 強制建立已經存在的組(如果存在則返回成功)
-g, --gid GID 設定新建立組的識別碼,0--499保留給系統服務,可以指定500以上的唯一數值(除非用--non-unique引數)。
-o, --non-unique 允許重複使用組識別碼。
-p, --password PASSWORD 設定新組的密碼
-r, --system 建立一個系統賬號
例:新建立一個名為test的組
[email protected]:~$ sudo groupadd test
[email protected]:~$ cat /etc/group | grep test
test:x:1002:
注:/etc/group的格式
group name : password : GID : user lists
2>. gpasswd命令
gpasswd命令是Linux下工作組檔案/etc/group和/etc/gshadow管理工具。
語法:gpasswd -a user_name group_name 用於將某個使用者新增到某個使用者組
選項:-a:新增使用者到組;
-d:從組刪除使用者;
-A:指定管理員;
-M:指定組成員和-A的用途差不多;
-r:刪除密碼;
-R:限制使用者登入組,只有組中的成員才可以用newgrp加入該組。
編寫"Hello World!" Base Image:
1>. 建立一個目錄,編寫一個"Hello World"C程式,並打包成可執行的二進位制檔案
mkdir hello-world cd hello-world s //安裝vim sudo yum install vim vim hello.c //hello.c 原始檔 #include<stdio.h> int main() { printf("Hello Docker!\n"); } //安裝編譯工具gcc sudo yum install gcc sudu yum install glibc-static gcc -static hello.c -o hello //-o 用於編譯時指定輸出名稱,否則統一為a.out
2>. 將可執行c程式打包到一個dockerfile中
vim Dockerfile //編寫Dockerfile FROM scratch //Base Image的From為scratch ADD hello / //將可執行檔案hello新增到image的根目錄 CMD ["/hello"] docker build -t crownt/hello-world . //"."表示上下文為當前目錄 docker run crownt/hello-world
docker build [OPTIONS] 上下文路徑|URL 用 Dockerfile 構建映象
[OPTIONS] : -t : 指定映象的名字及tag,
-f : 顯示指定構建映象的 Dockerfile 檔案(Dockerfile 可不在當前路徑下), 如果不使用 -f,則預設將上下文路徑下的名為 Dockerfile 的檔案認為是構建映象的 "Dockerfile" 。
上下文路徑|URL: 指定構建映象的上下文的路徑,構建映象的過程中,可以且只可以引用上下文中的任何檔案docker history imageID 用於檢視指定映象的建立歷史
三.Docker Container
docker container概念:
- container通過image建立
- 在image layer之上建立了一個container layer (container layer是可讀可寫的)
- 類比面向物件:類和例項
- Image負責App的儲存和分發,Container負責App的執行
docker container ls //檢視container
docker container ls -a //檢視所有container,包括已退出的.
//其中顯示出的COMMAND欄位,就是Dockerfile中CMD的引數
//互動式執行container的方法: 通過 -it 引數
docker run centos //執行完container就退出了
docker run -it centos //container不會立即退出,而是進入了一個可以互動的centos,可以在其中進
//行讀寫
//docker常用命令:
docker image ls (docker images) //列出本地image
docker image rm imageID (docker rmi imageID) //刪除image
docker container ls (docker ps) //列出本地container
docker container ls -a (docker ps -a) //列出包括退出的container
docker container rm containerID (docker rm containerID) //刪除執行過的container,
//containerID不需要寫全
docker run -d xxx //在後臺執行xxx的docker服務
//一些高階用法:
docker container ls -aq //列出所有container的ID
docker rm $(docker container ls -aq) //一次性刪除所有container
docker container ls -f "status=exited" //列出已經退出的container
docker container ls -f "status=exited" -q //列出已經退出的container的ID
docker rm $(docker container ls -f "status=exited" -q) //刪除已退出的container