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
相關文章
- docker基本底層原理Docker
- Docker基本使用Docker
- 【js】Redux基本原理和使用JSRedux
- 『現學現忘』Docker基礎 — 16、Docker中的基本概念和底層原理Docker
- docker的基本使用方法Docker
- Docker基本介紹及使用Docker
- Run 流程和 Docker 原理Docker
- Makefile基本規則和原理
- 整理記錄 docker 基本操作使用Docker
- go-slice實現的使用和基本原理Go
- docker 映象和容器的基本命令Docker
- 第三章Docker基本使用Docker
- 關於docker-Compose基本使用Docker
- 冷飯新炒:理解JWT的實現原理和基本使用JWT
- Android ContentProvider 基本原理和使用詳解AndroidIDE
- Docker映象提交命令commit的工作原理和使用方法DockerMIT
- 初識Netty原理(一)—— 基本使用Netty
- RxJava基本原理與使用(二)RxJava
- Docker的基本使用及DockerFile的編寫Docker
- Docker 基本操作Docker
- Docker Machine 基本DockerMac
- Docker基本操作Docker
- Docker基本管理Docker
- docker 1.2 之docker基本用法Docker
- Docker原理Docker
- 爬蟲基本原理及urllib庫的基本使用爬蟲
- Webpack 下使用 web workers 及 基本原理 和 應用場景Web
- 雲端計算基本原理和概念
- 基本功 | Litho的使用及原理剖析
- 常用輪子之EventBus基本使用及原理
- 常用輪子之Retrofit基本使用及原理
- 常用輪子之Okhttp基本使用及原理HTTP
- 初次學習 Docker Volume 的基本使用 (四)Docker
- Docker掃盲之容器與映象的基本使用Docker
- CentOS 7 使用 docker 搭建基本的 lnmp 環境CentOSDockerLNMP
- Docker 容器基本操作[Docker 系列-2]Docker
- docker 基本介紹Docker
- Docker的基本操作Docker