一、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/Linux
2、具體安裝步驟
Dcoker安裝比較簡單,只要按照我的步驟一步一步走,肯定沒問題,請讀者細心。
- 更新下載源
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
- 更新yum包
sudo yum update
- 安裝相關軟件包
sudo yum -y install gcc
sudo yum -y install gcc-c++
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 更新yum軟件包索引
sudo yum makecache fast
- 安裝Dcoker
sudo yum -y install docker-ce
- 啓動Dcoker服務
systemctl start docker
- 設置開機自啓
sudo systemctl enable docker
- 將Docker加入到組中
sudo groupadd docker
sudo gpasswd -a [本地用戶名] docker
- 配置鏡像加速
首先進入阿里雲的容器鏡像服務網站點擊這個連接,使用支付寶淘寶登錄都可以,如下圖,複製加速器地址。
然後按照下面操作修改鏡像加速
sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json
在打開的文件中按照下面編輯
{
"registry-mirrors": ["剛剛複製的加速器地址"]
}
加載配置文件
sudo systemctl daemon-reload
重啓Docker服務
sudo systemctl restart docker
3、測試
- 查看版本
docker version
如下圖:
2. HelloWorld
docker pull hello-world
docker run hello-world
如下圖:
至此安裝完畢!
三、Docker常用命令
- 幫助命令
docker version #查看版本號
docker info #顯示Docker系統信息,包括鏡像和容器數
docker --help #查看Docker有哪些命令
- 鏡像命令
docker images #查看當前Docker中的鏡像
docker search 某個鏡像名字 #查詢某個鏡像
docker pull 某個鏡像名字 #拉取(下載)某個鏡像
docker rmi 某個鏡像名字ID #刪除某個鏡像
- 容器基本命令(切記,有鏡像才能創建容器)
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 #一次性刪除多個容器
- 容器重要命令
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添加,下面我們詳解。
第一種方式:直接命令添加
- 掛載容器內數據卷
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
- 查看數據卷是否掛載成功
docker inspect 容器ID
第二種方式:DockerFile添加
- 根目錄下新建mydocker文件夾並進入
# 進入根目錄
cd /
# 新建mydocker
sudo mkdir mydocker
- 在mydocker中新建Dockerfile文件
sudo touch Dockerfile # 新建
sudo vim Dockerfile # 編輯
- File構建
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
- build後生成鏡像
docker build Dockerfile
4、注意
如果Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied
解決辦法:在掛載目錄後多加一個–privileged=true參數即可
六、DockerFile
1、DockerFile是什麼
Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。
2、DockerFile構建三步驟
- 編寫Dockerfile文件
- docker build
- docker run
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
- 進入根目錄新建mydocker
#進入根目錄
cd /
#新建mydocker文件夾
sudo mkdir mydocker
- 在此目錄下新建DockerFile文件
vim DockerFile
- 編輯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
- 構建
docker build -t 新鏡像名字:TAG .
- 運行
docker run -it 新鏡像名字:TAG
- 列出鏡像的變更歷史
docker history 鏡像名
七、Docker常用安裝
1、總體步驟
- 搜索鏡像
- 拉取鏡像
- 查看鏡像
- 啓動鏡像
- 停止容器
- 移除容器
2、安裝tomcat
- docker hub上面查找tomcat鏡像
docker search tomcat
- 從docker hub上拉取tomcat鏡像到本地
docker pull tomcat
- docker images查看是否有拉取到的tomcat
docker images
- 使用tomcat鏡像創建容器(也叫運行鏡像)
docker run -it -p 8080:8080 tomcat
- 其他
-p #主機端口:docker容器端口
-P #隨機分配端口
i #交互
t #終端
3、安裝MySQL
- docker hub上面查找mysql鏡像
docker search mysql
- 從docker hub上(阿里雲加速器)拉取mysql鏡像到本地
docker pull mysql
- 使用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
- 命令說明
-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: 後臺程序運行mysql
4、安裝Redis
- 從docker hub上(阿里雲加速器)拉取redis鏡像到本地
docker pull redis
- 使用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
- 測試redis-cli連接
docker exec -it 運行着Redis服務的容器ID redis-cli