網(wǎng)站頁面布局分析企業(yè)做推廣有幾種方式
聊聊 Docker
Docker 是什么?
定義
Docker 是一款 開源的應(yīng)用容器引擎。
簡單來說,就是 以容器虛擬化技術(shù)為基礎(chǔ)的軟件??梢园褢?yīng)用程序和所依賴的包一起打包到一個(gè)可移植的鏡像中,發(fā)布到 Linux 或者 Windows 上運(yùn)行。(代碼 + 運(yùn)行環(huán)境)
虛擬機(jī)與容器技術(shù)對比
虛擬機(jī)
虛擬機(jī) 可以高效使用計(jì)算機(jī)資源(比如可以解決同一種服務(wù)端口沖突、程序依賴版本庫不同、進(jìn)程受限制等問題) ,常見的虛擬機(jī)有: vmware、virtualbox 。
虛擬機(jī)的 底層原理 是基于 hypervisor(硬件抽象層) ,也叫 虛擬機(jī)監(jiān)視器(VMM) 。
容器技術(shù)
是一種沙盒技術(shù),相互之間不會有任何接口。將應(yīng)用運(yùn)行在容器中,容器之間隔離的。
容器技術(shù)更 關(guān)注應(yīng)用本身,應(yīng)用和所依賴環(huán)境的共享和復(fù)用。
Linux Container (簡稱 LXC),是一種內(nèi)核輕量級的操作系統(tǒng)層虛擬化技術(shù),容器化技術(shù)就是基于 LXC 實(shí)現(xiàn)的。
四個(gè)維度對比
由此可見,為什么容器技術(shù)會出現(xiàn),為什么容器技術(shù)會那么流行,是因?yàn)樘摂M機(jī)有痛點(diǎn)的,容器技術(shù)就是為了解決這些痛點(diǎn)而生的。而 Docker 就是容器化技術(shù)的代表。
Docker 的應(yīng)用場景
Docker 的實(shí)現(xiàn)原理與優(yōu)勢
Docker 的技術(shù)架構(gòu)
Docker 是由 dotCloud 公司于 2013 年推出的產(chǎn)品,用 GO 語言編寫的。
Docker 有兩種發(fā)行版本 ,分別是 CE (Community Edition,社區(qū)版)和 EE (Enterprise Edition,企業(yè)版)。
Docker 是 C/S 架構(gòu)。客戶端(docker cli,執(zhí)行程序),通過命令行和 API 形式與守護(hù)進(jìn)程(docker daemon,提供 Docker 服務(wù))進(jìn)行通訊。
舉個(gè)具體的例子,在常見的虛擬機(jī)實(shí)現(xiàn)中,我們要搭建一套 LNMP 結(jié)構(gòu)的服務(wù),我們通常會建立一個(gè)虛擬機(jī),在虛擬機(jī)中安裝上 Linux 系統(tǒng),之后分別安裝 Nginx、MySQL 和 PHP。
而在 Docker 里,最佳的實(shí)踐是分別基于 Nginx、MySQL 和 PHP 的鏡像建立三個(gè)容器,分別運(yùn)行 Nginx、MySQL 和 PHP ,而它們所在的虛擬操作系統(tǒng)也直接共享于宿主機(jī)的操作系統(tǒng)。
Docker 的實(shí)現(xiàn)原理
Linux 三大技術(shù)
Docker 的實(shí)現(xiàn),主要?dú)w結(jié)于 Linux 的三大技術(shù):命名空間(Namespaces)、控制組(Control Groups)和聯(lián)合文件系統(tǒng)(Union FIle System)。
命名空間(Namespaces)
在編程語言中,命名空間的主要目的就是為了集合相同模塊的類,區(qū)分不同模塊間的同名類。
Linux 內(nèi)核的命名空間,就是 能夠?qū)⒂?jì)算機(jī)資源進(jìn)行切割劃分,形成各自獨(dú)立的空間。
如 User Namespace、Net Namespace、PID Namespace、Mount Namespace 等等。
利用 PID Namespace,Docker 就實(shí)現(xiàn)了容器中隔離程序運(yùn)行中進(jìn)程隔離這一目標(biāo)。
控制組(Control Groups)
資源控制組的作用就是 控制計(jì)算機(jī)資源 。CGroups 主要做的是硬件資源的隔離。 除了資源的隔離,還有資源分配這個(gè)關(guān)鍵性的作用。
通過 CGroups,我們 可以指定任意一個(gè)隔離環(huán)境對任意資源的占用值或占用率 ,這對于很多分布式使用場景來說是非常有用的功能。
聯(lián)合文件系統(tǒng)(Union FIle System)
一種能夠 同時(shí)掛載不同實(shí)際文件或文件夾到同一目錄,形成一種聯(lián)合文件結(jié)構(gòu)的文件系統(tǒng)。
Docker 用它解決虛擬環(huán)境對文件系統(tǒng)占用過量,實(shí)現(xiàn)虛擬環(huán)境快速啟停等問題。
Docker 大幅減少了虛擬文件系統(tǒng)對物理存儲空間的占用。(例子:Git,Git 中每進(jìn)行一次提交,Git 并不是將我們所有的內(nèi)容打包成一個(gè)版本,而只是將修改的部分進(jìn)行記錄,這樣即使我們提交很多次后,代碼庫的空間占用也不會倍數(shù)增加)
Docker 的優(yōu)勢
- 應(yīng)用的安全性、可移植性和節(jié)約成本;
- 讓自動(dòng)化部署更簡單(持續(xù)集成CI和持續(xù)部署CD,快速交付);
- 加速應(yīng)用架構(gòu)現(xiàn)代化進(jìn)程(如微服務(wù)架構(gòu));
- 充分利用服務(wù)器資源;
- 跨平臺部署和動(dòng)態(tài)伸縮(如使用K8s編排工具管理)。
Docker 的安裝
macos 安裝
安裝教程:https://www.runoob.com/docker/macos-docker-install.html
windows 安裝
安裝教程:https://www.runoob.com/docker/windows-docker-install.html 或者
https://blog.58heshihu.com/index.php/archives/286/
Linux 安裝
centos:https://www.runoob.com/docker/centos-docker-install.html
ubuntu:https://www.runoob.com/docker/ubuntu-docker-install.html
Docker 的四大核心組成
鏡像(Image)
可以理解為 一個(gè)只讀的文件包,其中包含了虛擬環(huán)境運(yùn)行最原始文件系統(tǒng)的內(nèi)容。
查看鏡像列表:docker images
鏡像命名格式:開發(fā)者 / 鏡像名字:版本號
拉取: docker pull 鏡像名稱
搜索: docker search 鏡像名稱 //從docker hub搜索
鏡像詳細(xì)信息: docker inspect 鏡像名稱/ID
刪除鏡像: docker rmi 鏡像名稱/ID
容器(Container)
簡介
在容器技術(shù)中, 容器就是用來隔離虛擬環(huán)境的基礎(chǔ)設(shè)施,而在 docker 里,它也被引申為隔離出來的虛擬環(huán)境。
容器包括
- 一個(gè) Docker 鏡像
- 一個(gè)程序運(yùn)行環(huán)境
- 一個(gè)指令集合
容器的生命周期
- Created:容器已經(jīng)被創(chuàng)建,容器所需的相關(guān)資源已經(jīng)準(zhǔn)備就緒,但容器中的程序還未處于運(yùn)行狀態(tài)
- Running:容器正在運(yùn)行,也就是容器中的應(yīng)用正在運(yùn)行
- Paused:容器已暫停,表示容器中的所有程序都處于暫停 ( 不是停止 ) 狀態(tài)
- Stopped:容器處于停止?fàn)顟B(tài),占用的資源和沙盒環(huán)境都依然存在,只是容器中的應(yīng)用程序均已停止
- Deleted:容器已刪除,相關(guān)占用的資源及存儲在 Docker 中的管理信息也都已釋放和移除
常用命令
查看正在運(yùn)行的容器列表:docker ps
所有容器:docker ps -a
創(chuàng)建啟動(dòng)容器:docker run --name redis -d redis:5.0.15
停止容器:docker stop 容器名字/ID
啟動(dòng)/重啟容器:docker start/restart 容器名字/ID
刪除容器:docker rm [-f] //-f強(qiáng)制,可以刪除正在運(yùn)行的容器
進(jìn)入容器:docker exec -it redis bash //容器內(nèi)部是虛擬出來的一個(gè)Linux
查看容器報(bào)錯(cuò)信息:docker logs 容器ID
網(wǎng)絡(luò)(Network)
容器網(wǎng)絡(luò) 實(shí)質(zhì)上也是由 Docker 為應(yīng)用程序所創(chuàng)造的虛擬環(huán)境的一部分,它能讓應(yīng)用從宿主機(jī)操作系統(tǒng)的網(wǎng)絡(luò)環(huán)境中獨(dú)立出來,形成容器自有的網(wǎng)絡(luò)設(shè)備、IP 協(xié)議棧、端口套接字、IP 路由表、防火墻等等與網(wǎng)絡(luò)相關(guān)的模塊。
-
沙盒(Sandbox)提供了容器的虛擬網(wǎng)絡(luò)棧,也就是之前所提到的端口套接字、IP 路由表、防火墻等的內(nèi)容。其實(shí)現(xiàn)隔離了容器網(wǎng)絡(luò)與宿主機(jī)網(wǎng)絡(luò),形成了完全獨(dú)立的容器網(wǎng)絡(luò)環(huán)境
-
網(wǎng)絡(luò)(Network)可以理解為 Docker 內(nèi)部的虛擬子網(wǎng),網(wǎng)絡(luò)內(nèi)的參與者相互可見并能夠進(jìn)行通訊。Docker 的這種虛擬網(wǎng)絡(luò)也是于宿主機(jī)網(wǎng)絡(luò)存在隔離關(guān)系的,其目的主要是形成容器間的安全通訊環(huán)境
-
端點(diǎn)(Endpoint)是位于容器或網(wǎng)絡(luò)隔離墻之上的洞,其主要目的是形成一個(gè)可以控制的突破封閉的網(wǎng)絡(luò)環(huán)境的出入口。當(dāng)容器的端點(diǎn)與網(wǎng)絡(luò)的端點(diǎn)形成配對后,就如同在這兩者之間搭建了橋梁,便能夠進(jìn)行數(shù)據(jù)傳輸了
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-KuxNurAy-1692625431644)(http://flt-pan.58heshihu.com/blog/typecho/llkx21og.png)]
Docker 容器網(wǎng)絡(luò)一共有 5 種網(wǎng)絡(luò)驅(qū)動(dòng) ,網(wǎng)絡(luò)驅(qū)動(dòng),分別是: Bridge Driver(網(wǎng)橋 默認(rèn))、Host Driver、Overlay Driver(集群)、MacLan Driver、None Driver。
容器之間以及宿主機(jī)與容器之間可以通過端口來進(jìn)行訪問。
常用命令
查看網(wǎng)絡(luò)列表:docker network ls
容器加入網(wǎng)絡(luò):
docker run -d --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=yes --network network_name mysql:5.7
docker run -d --name php --link mysql --network network_name php:latest
端口映射:
docker run -d --name nginx -p 8080:80 nginx:1.12 //80為容器的端口,8080可為宿主機(jī)或別的容器的端口
數(shù)據(jù)卷(Volume)
在 Docker 中,通過 bind mount、volume、tmpfs mount 這幾種方式進(jìn)行數(shù)據(jù)共享或持久化的文件或目錄,我們都稱為數(shù)據(jù)卷 (Volume)。
Docker 的數(shù)據(jù)卷一共 有 3 中掛載方式 ,分別是: Bind Mount、Volume、Tmpfs Mount
-
Bind Mount 能夠直接將宿主操作系統(tǒng)中的目錄和文件掛載到容器內(nèi)的文件系統(tǒng)中,通過指定容器外的路徑和容器內(nèi)的路徑,就可以形成掛載映射關(guān)系,在容器內(nèi)外對文件的讀寫,都是相互可見的
-
Volume 也是從宿主操作系統(tǒng)中掛載目錄到容器內(nèi),只不過這個(gè)掛載的目錄由 Docker 進(jìn)行管理,我們只需要指定容器內(nèi)的目錄,不需要關(guān)心具體掛載到了宿主操作系統(tǒng)中的哪里
-
Tmpfs Mount 支持掛載系統(tǒng)內(nèi)存中的一部分到容器的文件系統(tǒng)里,不過由于內(nèi)存和容器的特征,它的存儲并不是持久的,其中的內(nèi)容會隨著容器的停止而消失
bind mount方式:
docker run -d --name nginx_test -v /nginx/html:/usr/share/nginx/html nginx
查看容器掛在文件:
docker exec nginx_test ls /usr/share/nginx/html
利器 docker-compose
docker-compose 是用于定義和運(yùn)行多容器 Docker 應(yīng)用程序的工具(集成部署),使用 docker-compose 可以高效管理容器。
使用步驟:
1、Dockerfile 定義應(yīng)用程序的環(huán)境(定制自己的鏡像源)
2、docker-compose.yml 定義構(gòu)成應(yīng)用程序的服務(wù),多個(gè)容器一起執(zhí)行
3、docker-compose up 啟動(dòng)并運(yùn)行整個(gè)應(yīng)用程序
備注:Linux需單獨(dú)安裝docker-compose,macos和windows已經(jīng)集成
實(shí)戰(zhàn)案例 - 搭建 LNMP 環(huán)境
源碼下載: https://github.com/zhangdejian/docker_lnmp.git
請參考我的另外一篇博客: https://learnku.com/articles/39417 (Dockerfile 方式定制 lnmp 環(huán)境)
Docker 的不足
- 必須在64位機(jī)器上運(yùn)行,目前僅支持x86_64和AMD64;
- 系統(tǒng)的Linux內(nèi)核必須是3.8或者更新;
- 內(nèi)核必須支持cgroups和命名空間;
- docker對disk的管理比較有限;
- 網(wǎng)絡(luò)管理相對簡單,主要是機(jī)遇namespace隔離;
6.container隨著用戶進(jìn)程的停止而銷毀,container中的log等用戶數(shù)據(jù)不方便收集。
Docker 的學(xué)習(xí)資源
官網(wǎng): https://docs.docker.com/engine/reference/run/
中文手冊: https://docker_practice.gitee.io/zh-cn/basic_concept/image.html
菜鳥教程: https://www.runoob.com/docker/docker-tutorial.html
掘金社區(qū): https://juejin.cn/tag/Docker
開源中國: https://www.oschina.net/question/tag/docker
SegmentFault: https://segmentfault.com/t/docker
推薦入門書籍: 《Docker 技術(shù)入門與實(shí)戰(zhàn)》 、 《Docker 進(jìn)階與實(shí)戰(zhàn)》華為團(tuán)隊(duì)
看云:《Docker — 從入門到實(shí)踐》
優(yōu)秀文章:
CentOS 安裝 docker
Dockerfile 方式定制 lnmp 環(huán)境
Docker 搭建 Jenkins 實(shí)現(xiàn)自動(dòng)部署
Docker+LNMP+Jenkins+ 碼云實(shí)現(xiàn) PHP 代碼自動(dòng)化部署
Docker 操作命令大全