整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划
作者 | IronmanJay
責編 | 王曉曼
出品 | CSDN博客
Docker 基礎介紹
?
下圖為 Docker 圖標(是一個鯨魚上面是集裝箱)。
1、我們為什么要使用Docker
當我們在工作中,一款產品從開發設計到上線運行,其中需要開發人員和運維工程師,開發人員負責代碼編寫,開發產品,運維工程師需要測試環境,產品部署。這之間就會有分歧。
比如開發人員在自己的電腦上運行產品沒有問題,可是換了一個環境,運維工程師部署的時候由于操作環境和開發人員不一致,其中包括操作系統、開發環境、部署文件等等。
開發人員需要告訴運維團隊所需的全部配置文件+所有的軟件環境,也就導致產品部署出現問題,開發人員和運維工程師出現分歧。
就好比我們要開發一個電商項目,其中肯定包括 Java 環境/Tomcat/ MySQL / JDBC 驅動包/相應 jar 包等,還需要較復雜的安裝配置,并且不能跨平臺使用,如果開發人員在 Windows 上開發,而運維工程師部署產品在 Linux 上,就會導致由于環境不同的產品部署問題,就算不跨系統,而是換一臺同樣操作系統的服務器,要移植部署依然非常麻煩。為了解決這個問題,我們的 Docker 應運而生!
2、Docker是什么
說了這么多,那么 Docker 到底是什么,能幫我們做什么,且聽我慢慢道來。
首先我們要知道,Docker 是基于 Go 語言實現的云開源項目,Docker 的主要目標是“Build,Ship and Run Any App,Anywhere”,Docker 其中包括,鏡像、容器、倉庫,很簡單,目的就是通過對應用組件的封裝、分發、部署、運行等聲明周期的管理,使用戶的產品(可以是 web 應用或者數據庫應用)及其環境能夠做到“一次封裝,到處運行”。
再通俗點說,就是我們使用 Docker,使得運行在 Docker 容器上面的應用,配置好一次環境,換到別的機器上可以一鍵部署,大大簡化了操作,實現了跨平臺,跨服務器,由下而上打包,達到應用程式跨平臺間的無縫接軌運作。
一句話,Docker解決了運行環境和配置問題軟件容器,方便做持續集成并有助于整體發布的容器虛擬化技術。
3、Docker能干什么
這個需要對比來說,其實我們常用的虛擬機就和Docker類似,我將通過之前的虛擬機技術和現在和容器虛擬化技術做一個對比。
(1)之前的虛擬機技術
我們對虛擬機并不陌生,其實它也可以看作是一個Docker,是一種帶環境安裝的解決方案,可以在一個操作系統中運行另一個操作系統,對于計算機底層來說,虛擬機就是一個軟件而已,不需要的時候就可以刪掉,對其他部分毫無影響,我們也可以通過虛擬機實現不同產品的打包發布,但是它也有很多缺點,比如:資源占用多、冗余步驟多、啟動慢。
(2)容器虛擬化技術
由于前面虛擬機存在諸多問題,Linux 發展出了另一種虛擬化技術:Linux 容器,Linux 容器不是模擬一個完整的操作系統而是對進程進行隔離,有了容器,我們就可以將軟件運行所需的所有資源打包到一個隔離的容器中,容器與虛擬機不同,不需要捆綁一整套操作系統,只需要軟件工作所需的庫資源和設置。系統因此而變得高效輕量并保證部署在任何環境中的軟件都能始終如一地運行。
(3)小總結
傳統虛擬機技術是虛擬出一套硬件后,在其上運行一個完整操作系統,在該系統上再運行所需應用進程。
而容器內的應用進程直接運行于宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更為輕便。
每個容器之間互相隔離,每個容器有自己的文件系統 ,容器之間進程不會相互影響,能區分計算資源。
4、Docker的優勢
更快速的應用交付和部署;
更便捷的升級和擴縮容;
更簡單的系統運維;
更高效的計算資源利用。
Docker安裝
?
1、前提說明
目前,CentOS 僅發行版本中的內核支持 Docker。Docker 運行在CentOS-7 上,要求系統為64位、系統內核版本為3.10 以上。
Docker 運行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系統為64位、系統內核版本為 2.6.32-431 或者更高版本。
所以我們需要查看自己的Centos內核是否支持Docker,使用下面的命令,可根據上面對照看自己的Centos是否符合要求,如不符合請升級。
[ironmanjay@localhost?~]$?uname?-a Linux?localhost.localdomain?3.10.0-1062.12.1.el7.x86_64?#1?SMP?Tue?Feb?4?23:02:59?UTC?2020?x86_64?x86_64?x86_64?GNU/Linux2、具體安裝步驟
Dcoker安裝比較簡單,只要按照我的步驟一步一步走,肯定沒問題,請讀者細心。
(1)更新下載源
1、先備份 sudo?mv?/etc/yum.repos.d/CentOS-Base.repo?/etc/yum.repos.d/CentOS-Base.repo.backup 2、更換源 sudo?wget?-O?/etc/yum.repos.d/CentOS-Base.repo?http://mirrors.aliyun.com/repo/Centos-7.repo(2)更新yum包
sudo?yum?update(3)安裝相關軟件包
sudo?yum?-y?install?gcc sudo?yum?-y?install?gcc-c++ sudo?yum?install?-y?yum-utils?device-mapper-persistent-data?lvm2(4)更新yum軟件包索引
sudo?yum?makecache?fast(5)安裝Dcoker
sudo?yum?-y?install?docker-ce(6)啟動Dcoker服務
systemctl?start?docker(7)開機自啟
(8)將Docker加入到組中
sudo?groupadd?docker sudo?gpasswd?-a?[本地用戶名]?docker(9)配置鏡像加速
首先進入阿里云的容器鏡像服務網站點擊這個連接,使用支付寶淘寶登錄都可以,如下圖,復制加速器地址。
然后按照下面操作修改鏡像加速:
在打開的文件中按照下面編輯:
{"registry-mirrors":?["剛剛復制的加速器地址"] }加載配置文件:
重啟Docker服務
3、測試
(1)查看版本
docker?version如下圖:
(2)HelloWorld
docker?pull?hello-world docker?run?hello-world如下圖:
至此安裝完畢!
?
Docker常用命令
?
1、幫助命令
docker?version???????????????????#查看版本號 docker?info??????????????????????#顯示Docker系統信息,包括鏡像和容器數 docker?--help????????????????????#查看Docker有哪些命令2、鏡像命令
docker?images????????????????????#查看當前Docker中的鏡像 docker?search?某個鏡像名字????????????????#查詢某個鏡像 docker?pull?某個鏡像名字????????????????#拉取(下載)某個鏡像 docker?rmi?某個鏡像名字ID?????????????????#刪除某個鏡像3、容器基本命令(切記,有鏡像才能創建容器)
docker?run?[OPTIONS]?image?[COMMAND]?[ARG...]???#新建并啟動容器 docker?ps?[OPTIONS]?????????????????????????????#列出當前所有正在運行的容器 exit????????????????????????#容器停止退出 ctrl+P+Q????????????????????#容器不停止退出 docker?start?容器ID或者容器名????????????#啟動容器 docker?restart?容器ID或者容器名????????????#重啟容器 docker?stop?容器ID或者容器名????????????#停止容器 docker?kill?容器ID或者容器名????????????#強制停止容器 docker?rm?容器ID????????????????????#刪除已停止的容器 docker?rm?-f?$(docker?ps?-a?-q)????????????#一次性刪除多個容器 docker?ps?-a?-q?|?xargs?docker?rm????????#一次性刪除多個容器4、容器重要命令
docker?run?-d?容器名????????????????#啟動守護式容器 docker?logs?-f?-t?--tail?容器ID????????????#查看容器日志,-t是加入時間戳,-f是最新的日志打印,--tail數字顯示最后多少條docker?top?容器ID????????????????#查看容器內運行的進程 docker?inspect?容器ID????????????????#查看容器內部細節 docker?exec?-it?容器ID?bashShell????????????#進入正在運行的容器并以命令行交互 docker?attach?容器ID????????????????#重新進入Docker容器 docker?cp??容器ID:容器內路徑?目的主機路徑????????#從容器內拷貝文件到主機上Docker 鏡像
?
1、Docker鏡像是什么?
是一種UnionFS(聯合文件系統),是一種分層、輕量級并且高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下(unite several directories into a single virtual filesystem)。
Union 文件系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。
2、Docker鏡像加載原理
Docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統UnionFS。bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導加載kernel, Linux剛啟動時會加載bootfs文件系統,在Docker鏡像的最底層是bootfs。
這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和內核。當boot加載完成之后整個內核就都在內存中了,此時內存的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs。
3、Docker鏡像為什么很小
如果我們從倉庫pull一個centos只有200左右mb,但是我們的鏡像centos文件高達4G左右,因為我們的在倉庫pull的centos剔除了無用的東西,只是一個精簡的OS,rootfs可以很小,只包含了最基本的命令、工具和程序庫就可以了,因為底層直接用Host的kernel,自己只需要提供rootfs 就行了。
4、Docker分層的鏡像
如下圖所見,當我們在倉庫下載tomcat時,是一層一層下載的,這里面包含著運行tomcat的環境,就像洋蔥一樣,一層一層的最終展示給我們鏡像版的tomcat。
5、Docker鏡像為什么要采用分層結構
Docker鏡像最大的一個好處就是 - 共享資源。
比如:有多個鏡像都從相同的 base 鏡像構建而來,那么宿主機只需在磁盤上保存一份base鏡像,同時內存中也只需加載一份 base 鏡像,就可以為所有容器服務了。而且鏡像的每一層都可以被共享。
6、Docker鏡像的特點
Docker鏡像都是只讀的當容器啟動時,一個新的可寫層被加載到鏡像的頂部。這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。
Docker 容器數據卷
?
1、什么是Docker容器數據卷
首先我們先明確一個理念,我們的Redia使用RDB和AOF來實現持久化,其實我們的Docker容器數據卷就類似這個,為了實現Docker的數據持久化,當我們運用與運行的環境打包形成容器,運行可以伴隨著容器,但是我們對數據的要求希望是持久化的,而容器之間希望有可能共享數據,也就是為了能保存數據在Docker中我們使用卷。
2、Docker容器數據卷能干嗎
簡而言之,容器數據卷可以幫我們實現容器的持久化,和容器間繼承+共享數據,而什么又是卷呢?
卷就是目錄或文件,存在于一個或多個容器中,由docker掛載到容器,但不屬于聯合文件系統,因此能夠繞過Union File System提供一些用于持續存儲或共享數據的特性,卷的設計目的就是數據的持久化,完全獨立于容器的生存周期,因此Docker不會在容器刪除時刪除其掛載的數據卷。
3、怎么用數據卷(容器內添加)
我們有兩種方式來添加容器內數據卷,一種是直接命令添加,另一種是DockerFile添加,下面我們詳解。
第一種方式:直接命令添加:
(1)掛載容器內數據卷
?docker?run?-it?-v?/宿主機絕對路徑目錄:/容器內目錄?鏡像名(2)查看數據卷是否掛載成功
docker?inspect?容器ID第二種方式:DockerFile添加:
(1)根目錄下新建mydocker文件夾并進入
#?進入根目錄 cd?/ #?新建mydocker sudo?mkdir?mydocker(2)在mydocker中新建Dockerfile文件
sudo?touch?Dockerfile?????#?新建 sudo?vim?Dockerfile?????#?編輯(3)File構建
#?volume?test FROM?centos VOLUME?["/dataVolumeContainer1","/dataVolumeContainer2"] CMD?echo?"finished,--------success1" CMD?/bin/bash(4)build后生成鏡像
docker?build?Dockerfile4、注意
如果Docker掛載主機目錄Docker訪問出現cannot open directory .: Permissiondenied。
解決辦法:在掛載目錄后多加一個–privileged=true參數即可。
?
DockerFile
?
1、DockerFile是什么
Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。
2、DockerFile構建三步驟
編寫Dockerfile文件
dockerbuild
dockerrun
3、DockerFile構建過程解析
docker從基礎鏡像運行一個容器;
執行一條指令并對容器作出修改;
執行類似docker commit的操作提交一個新的鏡像層;
docker再基于剛提交的鏡像運行一個新容器;
執行dockerfile中的下一條指令直到所有指令都執行完成。
4、DockerFile體系結構(保留字指令)
FROM????????#基礎鏡像,當前新鏡像是基于哪個鏡像的 MAINTAINER????#鏡像維護者的姓名和郵箱地址 RUN????????#容器構建時需要運行的命令 EXPOSE????????#當前容器對外暴露出的端口 WORKDIR????????#指定在創建容器后,終端默認登陸的進來工作目錄 ENV????????#用來在構建鏡像過程中設置環境變量 ADD????????#將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包 COPY????????#類似ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中?<源路徑>?的文件/目錄復制到新的一層的鏡像內的?<目標路徑>?位置 VOLUME????????#容器數據卷,用于數據保存和持久化工作 CMD????????#指定一個容器啟動時要運行的命令,Dockerfile?中可以有多個?CMD?指令,但只有最后一個生效,CMD?會被?docker?run?之后的參數替換 ENTRYPOINT?????#指定一個容器啟動時要運行的命令,ENTRYPOINT?的目的和?CMD?一樣,都是在指定容器啟動程序及參數 ONBUILD????????#當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承后父鏡像的onbuild被觸發5、自定義鏡像mycentos
(1)進入根目錄新建mydocker
#進入根目錄 cd?/ #新建mydocker文件夾 sudo?mkdir?mydocker?(2)在此目錄下新建DockerFile文件
vim?DockerFile(3)編輯DockerFile
FROM?centos MAINTAINER?IronmanJay<IronmanJay@qq.com> ENV?MYPATH?/usr/localWORKDIR?$MYPATH RUN?yum?-y?install?vimRUN?yum?-y?install?net-tools EXPOSE?80 CMD?echo?$MYPATHCMD?echo?"success--------------ok"CMD?/bin/bash?(4)構建
docker?build?-t?新鏡像名字:TAG?.(5)運行
docker?run?-it?新鏡像名字:TAG?(6)列出鏡像的變更歷史
docker?history?鏡像名Docker常用安裝
?
1、總體步驟
搜索鏡像
拉取鏡像
查看鏡像
啟動鏡像
停止容器
移除容器
2、安裝tomcat
(1)dockerhub上面查找tomcat鏡像
docker?search?tomcat(2)從docker hub上拉取tomcat鏡像到本地
docker?pull?tomcat(3)dockerimages查看是否有拉取到的tomcat
docker?images(4)使用tomcat鏡像創建容器(也叫運行鏡像)
docker?run?-it?-p?8080:8080?tomcat(5)其他
-p?????????#主機端口:docker容器端口 -P?????????#隨機分配端口 i????????#交互 t????????#終端3、安裝MySQL
(1)dockerhub上面查找mysql鏡像
docker?search?mysql(2)從docker hub上(阿里云加速器)拉取mysql鏡像到本地
docker?pull?mysql(3)使用mysql鏡像創建容器(也叫運行鏡像)
docker?run?-p?12345:3306?--name?mysql?-v?/IronmanJay/mysql/conf:/etc/mysql/conf.d?-v?/IronmanJay/mysql/logs:/logs?-v?/IronmanJay/mysql/data:/var/lib/mysql?-e?MYSQL_ROOT_PASSWORD=123456?-d?mysql(4)命令說明
-p 12345:3306:????#將主機的12345端口映射到docker容器的3306端口 --name mysql:????#運行服務名字 /IronmanJay/mysql/conf:/etc/mysql/conf.d :????#將主機/IronmanJay/mysql錄下的conf/my.cnf 掛載到容器的?/etc/mysql/conf.d-v /IronmanJay/mysql/logs:/logs:????#將主機/IronmanJay/mysql目錄下的 logs 目錄掛載到容器的?/logs -v /IronmanJay/mysql/data:/var/lib/mysql :????#將主機/IronmanJay/mysql目錄下的data目錄掛載到容器的?/var/lib/mysql?-e? MYSQL_ROOT_PASSWORD=123456:????#初始化 root 用戶的密碼。-d mysql:?后臺程序運行mysql4、安裝Redis
(1)從docker hub上(阿里云加速器)拉取redis鏡像到本地
docker?pull?redis(2)使用redis鏡像創建容器(也叫運行鏡像)
?docker?run?-p?6379:6379?-v?/IronmanJay/myredis/data:/data?-v?/IronmanJay/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf??-d?redis:3.2?redis-server?/usr/local/etc/redis/redis.conf?--appendonly?yes(3)測試redis-cli連接
docker?exec?-it?運行著Redis服務的容器ID?redis-cli版權聲明:本文為CSDN博主「IronmanJay」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/IronmanJay/article/details/104677814
推薦閱讀
沒錯,你離分布式搜索只差一個Elasticsearch入門!
Python開發之:Django基于Docker實現Mysql數據庫讀寫分離、集群、主從同步詳解 | 原力計劃
全球Python調查報告:Python 2正在消亡,PyCharm比VS Code更受歡迎
無代碼來了,還要程序員嗎?
再見,Eclipse | 原力計劃
真香,朕在看了!
總結
以上是生活随笔為你收集整理的整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯启动“SaaS技术联盟”联合行业制定
- 下一篇: 【耿老师公开课】反转!物联网火爆,开发者