Docker原理和基本使用

wangpf2011發表於2019-02-12

一、Docker結構說明

1、Docker Client

Docker Client同Docker Daemon互動,主要工作是在Docker Daemon上完成的,包括拉取映象、編譯映象、執行容器、釋出容器等。Docker Client和Docker Daemon可以執行在同一個系統上,也可以通過遠端方式進行訪問。Docker Client和Docker Daemon之間是在Socket上通過Restful API進行互動的。

2、Docker Daemon

Docker Daemon執行在一個主機上,使用者並不是直接同Docker Daemon進行互動,而是通過Docker Client進行訪問控制

3、Docker Images

Docker Images是一個只讀模板用來建立容器Docker Container,例如一個Image可以包含一個CentOS作業系統,整個系統可以包括Apache和Web應用。Docker提供了一種簡單的方式來建立Image和更新已有的Image,使用者可以從網上下載Image,也可以自己編譯Image。

4、Docker Registry

Docker Registry是存放Image的倉庫。常見的公有倉庫Docker Registry位於Docker Hub,Docker Hub包含了大量已有的Image供使用者使用。

5、Docker Container

Docker Container就像一個資料夾包含了應用程式執行所需的所有環境每個容器都源於某一個Image。Docker Container可以執行、開始、停止、移動並刪除,並且每個容器都是完全隔離的、安全的應用。

二、Docker工作機制

1、Docker Image

Docker Image是隻讀模板,並隨容器一起啟動。每個映象可以包含多個層Docker使用Union File System將這些層組合成一個映象。Union FS可以將檔案和目錄進行透明的層疊組裝,然後形成一個單獨的檔案系統。Docker之所以輕量,就是因為使用了這些層狀的檔案系統。當使用者修改一個Docker Image時一個新的層就會被建立因此這是一個增量式修改,而不是新建一個全新的Image,這也是區別於傳統虛擬機器的特定。當釋出一個Image時只需要釋出差異的部分,因此速度非常快。

每個映象都來源於一個最基礎的映象如CentOS是一個基礎映象用於也可以使用自己建立的映象作為基礎映象如建立包含了一個Nginx伺服器的映象作為所有靜態Web應用的基礎映象。

2、Docker Registry

Docker Registry是映象的倉庫,建立完一個映象時可以推送到公共Registry,如Docker Hub,也可以推送到自己私有的Registry。使用Docker Client可以搜尋已經發布的映象,並拉取到本地。

3、Docker Container

一個容器由作業系統、使用者檔案和後設資料構成,由此可見每個容器都是根據映象來生成。這個映象告訴Docker容器包含什麼內容,執行什麼程式以及其它配置資訊。Docker Image是隻讀的,當一個容器執行一個映象時,容器會在Union FS的頂層增加檔案層。

例如執行下面一個命令,執行後出現下面資訊。

docker run -i -t centos /bin/bash

Docker Client通過run命令告訴Daemon啟動一個新容器,這個指令內部流程如下

(1)拉取CentOS作為基礎映象,Docker檢查本地是否有CentOS映象,如果不存在就自動從Docker Hub拉取。

(2)建立一個容器,一旦本地存在CentOS映象,Docker將通過它來建立容器。

(3)分配檔案系統並掛載一個RW層(讀寫層),容器是建立在檔案系統中的,並且在其之上增加了一個讀寫層由此可見容器並不會改變原始的映象。

(4)分配網路/橋接模式,建立一個橋接網路介面,使容器可以和本地主機進行通訊。

(5)設定一個IP地址,根據本地網路情況,選取一個可用的IP掛載到容器之上。

(6)啟動一個程式,這裡就是/bin/bash。

(7)抓取應用程式的輸出,將程式的stdin、stdout、stderr進行捕獲,這樣就可以看到程式的執行情況。

三、底層技術

Docker是用Go語言編寫的,同時使用了多種Linux核心功能實現我們現在所看到的功能。

1、Namespaces

Docker使用了Namespace技術來隔離工作區,也就是通常所說的容器。當容器執行時Docker建立了一系列的Namespaces。藉助Namespaces容器執行在它自己的獨立名稱空間中,而外層沒有訪問許可權。目前Docker使用了以下Namespace:

(1)PID Namespace(Process ID)使用者程式的隔離;

(2)NET Namespace(Networking)用於管理網路介面;

(3)IPC Namespace(Inter Process Communication)用於管理程式間的通訊;

(4)MNT Namespace(Mount)用於管理Mount點;

(5)UTS Namespace(Unix Timesharing System)用於隔離核心和版本資訊

2、Control Groups

Docker同時也使用了CGroups這項核心技術,通過CGroups可以限制應用程式使用的資源,這項技術可以使使用者主機更好地執行多個容器而相互間不受影響。CGroups可以限定容器使用的硬體資源,如記憶體數量、CPU數量等。

3、Union File System

Union FS用來對檔案系統進行分層,通過分層可以使映象更加輕量級和快速,Docker可以使用多種不同的Union FS,如AUFS、VFS、Btrfs等。

四、通過程式執行Web應用

這裡以在Nginx Web容器中執行一個靜態頁面為例,說明如果實際使用Docker。基礎映象使用CentOS最新版本,容器啟動後安裝Nginx(當然也可以直接拉取Nginx映象),最後編寫一個簡單的靜態頁面部署到Nginx中。

由於國內環境直接從Docker Hub下載映象會很慢,所以建議首先配置映象加速器。這裡推薦兩種配置方式。

(1)阿里雲加速器

https://cr.console.aliyun.com/cn-qingdao/mirrors

針對Docker客戶端版本大於 1.10.0 的使用者,可以通過修改daemon配置檔案/etc/docker/daemon.json來使用加速器

{
  "registry-mirrors": ["https://3t8yi7mm.mirror.aliyuncs.com"]
}

(2)DaoCloud道客加速器

執行如下指令碼,該指令碼可以將 --registry-mirror 加入到你的 Docker 配置檔案 /etc/docker/daemon.json 中。適用於 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1。

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

自動修改daemon配置檔案/etc/docker/daemon.json

{
  "registry-mirrors": ["http://f1361db2.m.daocloud.io"]
}

1、拉取CentOS最新映象到本地

docker pull centos //拉取centos最新映象
docker images //檢視本地所有映象
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        6 weeks ago         1.84kB
centos              latest              1e1148e4cc2c        2 months ago        202MB

2、執行一個centos容器

docker run -i -t -p 8088:80 --name nginxweb 1e1148e4cc2c /bin/bash

其中-p表示宿主機與容器的埠對映,此時將容器內部的80埠對映為宿主機的8088 埠,這樣就向外界暴露了8088埠,可通過Docker網橋來訪問容器內部的80埠。

3、在容器中安裝Nginx Web伺服器

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

yum install -y nginx

Nginx的預設路徑:

(1) Nginx配置路徑:/etc/nginx/

(2) PID目錄:/var/run/nginx.pid

(3) 錯誤日誌:/var/log/nginx/error.log

(4) 訪問日誌:/var/log/nginx/access.log

(5) 預設站點目錄:/usr/share/nginx/html

4、建立靜態檔案html,修改nginx配置檔案

在目錄/var/www/html下建立index.html檔案

<html>
<head>
    <title>Nginx in Docker</title>
</head>
<body>
    <h1>Hello, Docker</h1>
</body>
</html>

修改nginx配置檔案

cd /etc/nginx/
cat nginx.conf
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
}

檢視核心配置檔案nginx.conf,找到實際要修改的配置檔案/etc/nginx/conf.d/*.conf,然後對改目錄下的檔案進行修改。

cd /etc/nginx/conf.d
vim default.conf

修改目錄為/var/www/html,如下所示。

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

5、啟動nginx,訪問頁面

cd /usr/sbin
./nginx

Docker常用命令請參考:https://blog.csdn.net/wangpf2011/article/details/87025218

相關文章