Docker原理和基本使用

一、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

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