前言
從2017年3月開始docker在原來的基礎上分為兩個版本:Docker CE和Docker EE。
Docker CE 即社區免費版,Docker EE 即企業版,強調安全,但是需要付費。
Docker官方建議從CentOs7.0已上系統版本安裝部署。
一、docker簡介
1、Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從 Apache2.0 協議開源。
2、Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。
3、容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
4、Docker 從 17.03 版本之后分為 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版),我們用社區版就可以了。
5、Docker是通過內核虛擬化技術(namespaces及cgroups)來提供容器的資源隔離與資源限制。由於Docker通過操作系統層的虛擬化實現隔離(對操作系統的內核有要求),所以Docker容器在運行時,不需要類似虛擬機(VM)額外的操作系統開銷,從而比kvm虛擬機更輕量。也可以把docker理解為一種簡單的打包技術
docker目標
docker的主要目標是"Build,Ship and Run any App,Angwhere",構建,運輸,處處運行
構建:制作docker鏡像,打包容器的所有系統目錄文件
運輸:下載docker鏡像
運行:基於docker鏡像提供的rootfs,啟動容器
總結:只要能運行docker容器,那么docker鏡像中已經安裝好的軟件也可以運行,所以說docker是一種件的打包技術。
應用場景
1、Web 應用的自動化打包和發布。
2、自動化測試和持續集成、發布。
3、在服務型環境中部署和調整數據庫或其他的后台應用。
4、從頭編譯或者擴展現有的 OpenShift 或 Cloud Foundry 平台來搭建自己的 PaaS 環境。
docker優勢
1:解決了操作系統和軟件運行環境的依賴例如:nginx和git需要安裝的openssl版本不同,在同一台設備上安裝會造成軟件沖突
2:對於開發人員來說,再也不用擔心不會部署開發環境
3:開發環境,測試環境和生產環境高度一致。
4:讓用戶體驗產品新特性的又一種思路。
5:容器不需要進行硬件虛擬以及運行完整操作系統等額外開銷,Docker 對系統資源的利用率更高。無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳統虛擬機技術更高效。因此,相比虛擬機技術,一個相同配置的主機,往往可以運行更多數量的應用。
6:傳統的虛擬機技術啟動應用服務往往需要數分鍾,而 Docker 容器應用,由於直接運行於宿主內核,無需啟動完整的操作系統,因此可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。
7:由於 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在很多平台上運行,無論是物理機、虛擬機、公有雲、私有雲,甚至是筆記本,其運行結果是一致的。因此用戶可以很輕易的將在一個平台上運行的應用,遷移到另一個平台上,而不用擔心運行環境的變化導致應用無法正常運行的情況。
8:Docker 使用的分層存儲以及鏡像的技術,使得應用重復部分的復用更為容易,也使得應用的維護更新更加簡單,基於基礎鏡像進一步擴展鏡像也變得非常簡單。此外,Docker 團隊同各個開源項目團隊一起維護了一大批高質量的 官方鏡像,既可以直接在生產環境使用,又可以作為基礎進一步定制,大大的降低了應用服務的鏡像制作成本。
Docker與虛擬機的區別
二、docker的架構
1、docker三個基本概念:
1.鏡像(Image):Docker 鏡像(Image),就相當於是一個 root 文件系統。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 文件系統。
2. 容器(Container):鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
3.倉庫(Repository):倉庫可看着一個代碼控制中心,用來保存鏡像。
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。
Docker 容器通過 Docker 鏡像來創建。
2、docker的鏡像分層
一個完整的Docker鏡像可以支撐一個Docker容器的運行,在Docker容器運行過程中主要提供文件系統數據支撐。
Docker鏡像作為docker中最基本的概念,有以下幾個特性:
1.鏡像分層,每個鏡像都由一個或多個鏡像層組成;
2.可通過在某個鏡像加上一定的鏡像層得到新鏡像(此過程可通過編寫dockerfile或基於容器Commit實現);
3.每個鏡像層擁有唯一鏡像ID;
4.鏡像在存儲和使用時共享相同的鏡像層(根據ID),所以在pull鏡像時,已有的鏡像層會自動跳過下載;
5.每個鏡像層都是只讀,即使啟動成容器,也無法對其真正的修改,修改只會作用於最上層的容器層;
Docker容器,可以理解為一個或多個運行進程,而這些運行進程將占有相應的內存,相應的CPU計算資源,相應的虛擬網絡設備以及相應的文件系統資源。而Docker容器所占用的文件系統資源,則通過Docker鏡像的鏡像層文件來提供。
3、鏡像與容器的聯系
當啟動一個新的容器時,Docker會加載只讀鏡像,並在其之上添加一個讀寫層,即容器層。
docker 容器=鏡像+可讀層
4、鏡像存儲核心技術:聯合文件系統
鏡像的高效存儲:引入聯合文件系統,將鏡像多層文件聯合掛載到容器文件系統。
5、鏡像存儲核心技術:寫時復制(COW)
引入寫時復制(copy-on-write),需要修改文件操作時,會先從鏡像里把要寫的文件復制到自己的文件系統(容器的讀寫層)中進行修改。源鏡像層中的文件不會發生變化。
前提條件
一、內核
1.Docker運行內核要求比較高,因此一般建議使用Ubuntu這樣的平台運行,但是Docker作為一個標准容器也支持CentOS, Mac OS X, Windows等平台。目前Docker支持以下版本CentOS:
(1)CentOS7(64位)
(2)CentOS6.5(64位及以后)
2.在運行CentOS 6.5及以后版本時,需要內核版本>=2.6.32-431,因為這些內核包含了運行Docker的一些特定修改。
uname -r
注:網上很多教程說CentOS6.5必須要升級內核到3.10才能使用docker,其實是【可選】升級,但最好升級。
二、Device Mapper
1.Docker默認使用AUFS作為存儲驅動,但是AUFS並沒有被包括在Linux的主線內核中。CentOS中可以使用Device Mapper作為存儲驅動,這是在2.6.9內核版本引入的新功能。我們需要先確認是否啟用該功能:
ls -l /sys/class/misc/device-mapper
(1)如果沒有檢測到Device Mapper,需要安裝device-mapper軟件包:
sudo yum install -y device-mapper
(2)然后重新加載dm_mod內核模塊:
sudo modprobe dm_mod
(3)再次確認存儲驅動
ls -l /sys/class/misc/device-mapper
安裝
2.1.CentOS 7
2.2.1.准備
CentOS7能上外網
yum -y install gcc
yum -y install gcc-c++
卸載舊版本
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
如果yum報告未安裝任何這些軟件,表示情況正常。
2.2.2.安裝(過程版) 往下看
安裝依賴包
安裝依賴包 yum install -y yum-utils device-mapper-persistent-data lvm2 設置stable鏡像倉庫 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 或 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum軟件包索引
yum makecache fast
如果這是自添加 Docker 鏡像倉庫以來您首次刷新軟件包索引,系統將提示您接受 GPG 密鑰,並且將顯示此密鑰的指紋。驗證指紋是否正確,並且在正確的情況下接受此密鑰。指紋應匹配 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35。
安裝docker
1、安裝指定版本:
yum list docker-ce.x86_64 --showduplicates | sort -r #從高到低列出Docker-ce的版本
該軟件包名稱是軟件包名稱(docker-ce)加上版本字符串(第二列),從第一個冒號(:)一直到第一個連字符,並用連字符(-)分隔。
例如:指定版本(docker-ce-18.09.9)進行安裝:
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io # 例如: yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io
2、安裝最新版本:
yum -y install docker-ce
啟動docker
執行以下命令啟動docker:
systemctl start docker
啟動時報錯信息解決方法:
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details. systemctl status docker.service
解決方案:卸載docker重新安裝新的docker。
解決步驟:
1、卸載Docker,舊版本docker沒安裝成功直接卸載掉。
(1)查看安裝過的包:
yum list installed | grep docker
本機安裝過的舊版本:
docker-ce.x86_64
docker-ce-cli.x86_64
docker-ce-rootless-extras.x86_64
(2)刪除安裝的Docker相關的軟件包:
yum -y remove docker-ce.x86_64 yum -y remove docker-ce-cli.x86_64 yum -y remove docker-common.x86_64
2、安裝Docker
(1)查看內核版本【Docker要求Centos系統的內核版本高於3.10】
uname -r 【本機的內核版本:3.10.0-1160.11.1.el7.x86_64】
(2)把yum包更新到最新(時間可能有點長,慢慢等待......)
yum update
(3)安裝需要的軟件包。
【yum-util提供yum-config-manager功能,另外兩個是devicemapper驅動所需依賴】
yum install -y yum -utils device-mapper-persistent-data lvm2
(4)設置yum源
yum install -y yum -utils device-mapper-persistent-data lvm2
(5)查看倉庫的docker版本
yum list docker-ce --showduplicates | sort -r
(6)安裝docker
yum install docker-ce
(7)啟動docker,設置開機啟動docker。
systemctl start docker
systemctl enable docker
systemctl stop docker【補充:這是關閉docker的命令】
(8)查看版本
docker version
用一張圖總結docker命令
Docker工作流
docker安裝與啟動(手動版)
yum install -y epel-release
yum install docker-io # 安裝docker
# 配置文件vim /etc/sysconfig/docker chkconfig docker on # 加入開機啟動
service docker start # 啟動docker服務
# 基本信息查看 docker version # 查看docker的版本號,包括客戶端、服務端、依賴的Go等
docker info # 查看系統(docker)層面信息,包括管理的images, containers數等
docker pull centos 下載
docker images [ centos ] 查看 docker run -i -t centos /bin/bash 查看鏡像詳細信息 注:下面容器一節會看到,這個命令也能夠用來查看容器的詳細信息 docker inspect [image-id]
docker安裝與啟動(shell版)
安裝shell腳本
install-docker.sh #!/bin/bash # 卸載舊版本 echo "" echo "" echo "#########################################################" echo "# 卸載舊版本 -- 開始 #" echo "#########################################################" yum -y remove docker docker-common docker-selinux docker-engine echo "#########################################################" echo "# 卸載舊版本 -- 結束 #" echo "#########################################################" # 安裝需要的依賴軟件包 echo "" echo "" echo "#########################################################" echo "# 安裝需要的軟件包 -- 開始 #" echo "#########################################################" yum install -y yum-utils device-mapper-persistent-data lvm2 echo "#########################################################" echo "# 安裝需要的軟件包 -- 結束 #" echo "#########################################################" # 設置 yum 源,清華鏡像倉庫,速度很快 echo "" echo "" echo "#########################################################" echo "# 設置 yum 源 -- 開始 #" echo "#########################################################" #安裝wget,如果已安裝則會跳過 yum -y install wget #根據你的發行版下載repo文件: wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo #把軟件倉庫地址替換為 TUNA: sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo echo "#########################################################" echo "# 設置 yum 源 -- 結束 #" echo "#########################################################" # 安裝 docker-ce echo "" echo "" echo "#########################################################" echo "# 安裝 docker-ce -- 開始 #" echo "#########################################################" yum -y install docker-ce echo "#########################################################" echo "# 安裝 docker-ce -- 結束 #" echo "#########################################################" # 啟動並加入開機啟動 echo "" echo "" echo "#########################################################" echo "# 啟動並加入開機啟動 -- 開始 #" echo "#########################################################" systemctl start docker systemctl enable docker echo "#########################################################" echo "# 啟動並加入開機啟動 -- 結束 #" echo "#########################################################" # 驗證安裝是否成功 echo "" echo "" echo "#########################################################" echo "# 驗證安裝是否成功 -- 開始 #" echo "#########################################################" docker version echo "#########################################################" echo "# 驗證安裝是否成功 -- 結束 #" echo "#########################################################" # 安裝docker-compose echo "" echo "" echo "#########################################################" echo "# 安裝docker-compose -- 開始 #" echo "#########################################################" # 從國內鏡像 get.daocloud.io 快速下載 curl -L https://get.daocloud.io/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose echo "#########################################################" echo "# 安裝docker-compose -- 結束 #" echo "#########################################################" # 驗證安裝是否成功 echo "" echo "" echo "#########################################################" echo "# 驗證安裝是否成功 -- 開始 #" echo "#########################################################" docker-compose --version echo "#########################################################" echo "# 驗證安裝是否成功 -- 結束 #" echo "#########################################################" # 添加 docker 國內鏡像站點並重啟docker echo "" echo "" echo "#########################################################" echo "# 添加 docker 國內鏡像站點並重啟docker -- 開始 #" echo "#########################################################" #創建目錄:/etc/docker mkdir -p /etc/docker echo '{ "registry-mirrors": [ "https://registry.docker-cn.com" ] }' >> /etc/docker/daemon.json systemctl restart docker echo "#########################################################" echo "# 添加 docker 國內鏡像站點並重啟docker -- 結束 #" echo "#########################################################" echo "" echo "" echo "install OK!" # 提示安裝完成 echo "" echo "enjoy!" echo "songbao--"$(date +%F%n%A--%T) #輸出年月日星期時分秒 echo "" echo "" 卸載shell腳本 Uninstall-docker.sh #!/bin/bash echo "" echo "" echo "" echo "#####################################################" echo "# 刪除docker-ce相關程序及依賴 #" echo "#####################################################" yum -y remove docker-ce \ docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine echo "" echo "#####################################################" echo "# 刪除docker服務 #" echo "#####################################################" rm -rf /etc/systemd/system/docker.service.d echo "" echo "#####################################################" echo "# 刪除相關目錄 #" echo "#####################################################" rm -rf /var/lib/docker rm -rf /var/run/docker echo "" echo "#####################################################" echo "# 安裝網橋管理工具 #" echo "#####################################################" yum -y install bridge-utils echo "" echo "#####################################################" echo "# 停止並刪除docker0 #" echo "#####################################################" ifconfig docker0 down brctl delbr docker0