1. 程式人生 > >Docker筆記_docker基礎

Docker筆記_docker基礎

一.理解docker

  • docker提供了一個開發,打包,執行APP的平臺
  • docker把APP和底層infrastructure隔離開來
                                              Application
                                           Docker Engine
                                infrastructure(physical / virtual)

Docker Engine: 是一個 Client-Server 架構, 主要由三部分構成.

     

  1.    後臺程序 (dockerd) :  Docker daemon
  2.    REST API Server :    一套與 Docker daemon 互動的 REST API
  3.    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 的獲取: 

  1. 編寫dockerfile,build成image
  2. 從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