1. 程式人生 > >docker的認識和詳解

docker的認識和詳解

docker認識與使用

1.docker簡介

  • 什麼是容器?

    一種虛擬化的方案,作業系統級別的虛擬化,只能執行相同或相似核心的作業系統

  • docker的容器技術依賴於linux核心特性:namespace和cgroups(control group),所以只能執行linux系統

  • 容器技術的優勢

    磁碟佔用空間更少.因為使用虛擬機器部署應用不但包含了應用和其依賴的庫,還需要包含完整的作業系統,原本可能只需要幾十兆的應用,卻需要動著幾個G的作業系統來支撐,而容器只需要包含應用和依賴的庫,資源佔用大大減少,另外虛擬機器需要模擬硬體的行為,對記憶體和cpu的損耗也相當的大,所以同樣配置的伺服器,使用容器技術比使用虛擬機器能夠提供更多的服務能力,服務更多的使用者.

  • 為啥docker的出現,才真正的讓容器技術被關注起來呢?

    因為容器技術的複雜性,依賴於linux核心的很多特性,不易安裝,不易管理,不易實現自動化,而docker就是為了改變這一切而出現,所以讓容器技術被關注了

  • 什麼是docker?

    將應用程式自動部署到容器的開源引擎

    go語言編寫

  • docker目標

    提供簡單輕量的建模方式(啟動快,部署方便,充分利用系統資源)

    職責的邏輯分離(開發者只需關心容器中的應用程式,運維人員只需關心如何管理容器)(加強開發人員寫程式碼的開發環境與應用程式要部署的生產環境的一致性)

    快速高效的開發生命週期(開發測試生產部署都使用相同的環境,避免了額外的除錯和部署上的開銷)

    鼓勵使用面向服務的架構(提倡單個容器執行一個應用程式)(開發思想:高內聚,低耦合,單一任務)

    docker學習經典連結

2.docker基本組成

  • docker客戶端/守護程序 c/s架構 本地,遠端都可以訪問

  • docker映象 (image)

    容器的基石 容器基於映象啟動和執行 映象就好比容器的原始碼,儲存了啟動容器的各種條件

    層疊的只讀檔案系統: 最低端是一個引導檔案系統(bootfs),第二層是root檔案系統(rootfs)

    聯合載入(union mount)

  • docker 容器(container)

    通過映象啟動(怎麼通過?在映象上載入可寫層)(容器通過映象建立)

    啟動和執行階段

    寫時複製(copy on write)

    我們在docker中執行的程式,是通過可寫層進行的

  • docker 倉庫(registry)

    公有 私有

3.docker安裝(我使用centos的)

  • 檢視核心 uname -a

  • 檢視儲存驅動 ls -l /sys/class/misc/device-mapper

  • ubuntu中安裝docker的方式

    安裝ubuntu維護的版本

    安裝docker維護的版本

安裝ubuntu維護的版本(具體google,下面的可能老了)

sudo apt-get install docker.io
source /etc/bash_completion.d/docker.io

安裝docker維護的版本(推薦)(具體看連結的)(要配置代理,因為被牆)

1.檢視apt對https的支援
cat /usr/lib/apt/methods/https
如果不存在,執行安裝命令
apt-get isntall apt-transport-https
2.新增docker的apt倉庫
echo deb https://get.docker.io/ubuntu docker main\ > /etc/apt/sources.list.d/docker.list
//或者使用下面的命令來設定stable儲存庫:
//sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
3.新增倉庫的key(GPG 金鑰)
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
4.安裝
apt-get install lxc-docker

因為四部比較複雜,docker提供了shell指令碼
apt-get install curl
//curl -sSL https://get.docker.com/ubuntu/ | sudo sh
wget  https://get.docker.com/ | sh

  • 非root使用者不想sudo,設定
sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudO service docker restart

或者:
以非root使用者可以直接執行docker時,
需要執行 sudo usermod -aG docker runoob 命令,
然後重新登陸,否則會報錯

安裝docker維護的版本(centos)

docker升級

解除安裝系統安裝的docker,再次安裝就是新的了

阿里雲安裝docker

Docker從1.13版本之後採用時間線的方式作為版本號,分為社群版CE和企業版EE。

#.可以檢視所有倉庫中所有docker版本,並選擇特定版本安裝
yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64            17.09.0.ce-1.el7.centos            docker-ce-stable
docker-ce.x86_64            17.09.0.ce-1.el7.centos            @docker-ce-stable
docker-ce.x86_64            17.06.2.ce-1.el7.centos            docker-ce-stable
docker-ce.x86_64            17.06.1.ce-1.el7.centos            docker-ce-stable
docker-ce.x86_64            17.06.0.ce-1.el7.centos            docker-ce-stable
docker-ce.x86_64            17.03.2.ce-1.el7.centos            docker-ce-stable
docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
如yum install docker-ce-17.09.0.ce

4.doecker容器

啟動容器

docker run {image} [command] [arg...]

啟動互動式容器:

docker run -i -t {image} /bin/bash

另一種建立容器,單未實際啟動

docker create ...

檢視建立的容器

docker ps [-a](所有的) [-l](最新的)

docker inspect id/name //檢視詳細

自定義容器名

docker run --naem=ee -i -t {image} /bin/bash

重新啟動停止的容器

docker start [-i] id/name

刪除停止的容器

docker rm id /name

docker rm $(docker ps -aq)刪除所有停止的容器

5.docker守護式容器

第一種啟動守護式容器

docker run -i -t {image}/bin/bash

然後ctrl+p ctrl+q

附加到執行中的容器(進入正在執行的容器)

docker attach id/name

第二種啟動守護式容器

docker run -d {image}[command] [arg...] //-d只是在後臺執行命令,命令執行完還是會退出,所以後面一般加點讓命令不能結束的語句 比如迴圈和在前臺執行啥的

如:docker run -d centos nginx -g "daemon off"

檢視容器日誌

docker logs [-f][-t][-tail]id/name

-f,–follow跟蹤

-t 加上時間

-tail 結尾多少條 預設-tail = all

檢視執行中的容器內程序

docker top id/name

在執行中的容器內啟動新程序

docker exec [-d][-i][-t] id/name [command] [arg...]

停止守護式容器

docker stop id/name 發出結束的訊號,等待結束,返回容器id/name

docker kill id/name 直接殺死容器

重啟守護式容器

docker restart id/name

6.在容器中部署靜態網站

設定容器的埠對映

docker run [-P][-p] {image}

-P 容器中所有埠都對映

-p ip:hostport:containerport

步驟

docker run -p 80 --naem web -i -t centos /bin/bash
容器內:
yum install nginx 
簡單配置nginx

檢視埠對映

docker port id/name

7.docker映象

檢視docker驅動和位置

docker info

列出映象

docker images [options] [repository]

option: -a,–all

-f,–force

–no-trunc,

-q,–quiet,只顯示id

repository倉庫(本地) 和 前面 registry倉庫(遠端源) 是不同的

tag 標籤

檢視映象詳細資訊

docker inspect [-f] repository:tag

-f,–force

修改映象repository名稱和tag名稱

docker tag old_repository:old new_repository:new_tag

刪除映象

docker rmi[-f][--no-prune] {id}/{repository:tag}

-f,–force

–no-prune

docker rmi $(docker images -q) //刪除全部映象

查詢映象

docker hub 網站查詢

命令查詢docker search[--automated][--no-trunc][-s] {term} 最多返回 25個結果

-s,–start

拉取映象

docker pull [-a] name:tag

-a,–all

修改映象源,映象加速:(安裝的時候已經修改)

cd /etc/docker
vim daemon.json
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
//引數配置是docker守護程序執行時使用的,所以用重啟

daocloud網站的源也不錯

推送映象

docker push naem:tag

推的的修改的部分,不是整個映象,不然人家遠端伺服器就空間gg了

構建映象

儲存對容器的修改,並再次使用

自定義映象的能力

以軟體的形式打包並分發服務及其執行環境

  • 使用commit,通過容器構建

docker commit [options] {container_id/container_name} repository[:tag]

-a, --author

-m,–messager

-p,–pause

  • 使用bulid,通過dockerfile檔案構建

docker build [options] path|url

–force-rm=false

–no-cache=false

–pull=false

-q,–quiet=false

–rm=true

-t,–tag=“name”

//1.建立dockerfile檔案
FROM    centos:6.7
MAINTAINER      Fisher "[email protected]"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D
//每一個指令都會在映象上建立一個新的層(中間層),每一個指令的字首都必須是大寫的。
//RUN 指令告訴docker 在(以該映象啟動的容器中)/(映象內)執行命令,安裝了什麼...

//2.使用docker build

8.docker客戶端和守護程序

client —> daemoe

  • 命令

  • remote api

restful api風格

STDIN,STDOUT,STDERR

C/S連線方式:

unix:///var/run/doker.sock

tcp://host:port

fd://socketfd

nc -U /var/run/docker.sock //通過socket建立通訊
GET /info HTTP/1.1 //通過remote api方式互動

docker守護程序的配置和操作

//啟動
systemctl start docker
//停止
systemctl stop docker
//重啟
systemctl restart docker

docker的啟動選項

docker -d [options]

-d,守護形式執行

[options]:

  • 執行相關的選項
  • 伺服器連線相關
  • remote api相關
  • 儲存相關
  • registry相關
  • 網路設定相關

find / -name 'docker.service' -print

9.docker的遠端訪問

(就是通過宿主機的ip訪問docker守護程序<docker伺服器>)

伺服器啟動選項配置,提供遠端訪問

使用upstart的ubuntu下docker的配置

//修改/etc/default/docker
DOCKER_OPTS="--label name=docker_server_1 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
//然後用另一臺伺服器訪問
wget/curl ip:2375 info
//因為unix:///var/run/doker.sock
docker info //還是伺服器本地的 不然會出錯

但是舊版docker在新版ubuntu配置不成功,這是因為/etc/default/docker檔案是為upstartSysVInit準備的(正如檔案第一行註釋所言),而使用service命令時並不會讀取它,因此我們可以做如下更改:

在/etc/systemd/system/docker.service.d/Using_Environment_File.conf下新增
EnvironmentFile=-/etc/default/docker
ExecStart=/usr/bin/docker daemon $DOCKER_OPTS

centos下docker配置:(lable必須小寫)

//修改/etc/sysconfig/docker檔案,在最後增加一行DOCKER_OPTS
DOCKER_OPTS="--label name=docker_server_1 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
//DOCKER_OPTS="-H unix://var/run/docker.sock"
//修改/usr/lib/systemd/system/docker.service 
//在[Service]的ExexStart=下面增加一行$DOCKER_OPTS
ExecStart=/usr/bin/dockerd-current \ 
          $DOCKER_OPTS
EnvironmentFile=-/etc/sysconfig/docker

注意:也可以直接在ExecStart後面追加-H unix:///var/run/docker.sock -H 0.0.0.0:2375

新版docker不會自動帶有/etc/sysconfig/docker檔案,要自己建立

方式2:
在啟用服務後
systemctl enable docker
可以直接編輯 /etc/systemd/system/multi-user.target.wants/docker.service 檔案來進行配置。
vim /etc/systemd/system/multi-user.target.wants/docker.service
在檔案中找到 ExecStart= 這一行,並且在其行尾新增上所需的配置。
//適合使用systemd的ubuntu和centos

可能有點亂,那就不理解上面了:不用理啥系統,都適合的https://icbd.github.io/wiki/notes/2018/03/27/docker-config.html (經典)

客戶端配置,訪問遠端

//方式1
docker -H tcp://ip:2375 info
//方式2
export DOCKER_HOST="tcp://ip:2375"
docker info //就是遠端的了
export DOCKER_HOST=""
docker info //本地的了

docker在daemon.json下的配置

//修改daemon配置:/etc/docker/daemon.json,新增如下行:
{"hosts": ["fd://", "tcp://0.0.0.0:2375"]}

如果重啟後發現無法啟動 docker 服務,檢查一下服務日誌,看看是不是之前執行過那些加速器網站的指令碼,如果有做過類似的事情,檢查一下是不是被建立了 /etc/docker/daemon.json 以配置加速器,如果是的話,刪掉這個檔案,然後在重啟服務。

使用配置檔案是件好事,比如修改配置不必重啟服務,只需傳送 SIGHUP 訊號即可。但需要注意,目前在 dockerd 中使用配置檔案時,無法輸出當前生效配置,並且當 dockerd 的引數和 daemon.json 檔案中的配置有所重複時,並不是一個優先順序覆蓋另一個,而是會直接導致引擎啟動失敗。很多人發現配了加速器後 Docker 啟動不起來了就是這個原因。解決辦法很簡單,去掉重複項。不過在這些問題解決前,建議使用修改 docker.service 這類做法來實現配置,而不是使用配置檔案 daemon.json。方便 ps -ef | grep dockerd 一眼看到實際配置情況。

10.docekrfile指令

//註釋

#xxx

//指令
大寫XXX 引數

#First Docker file
FROM ubuntu:14.04
MAINTAINER dormancypress "[email protected]"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
  • FROM [:] //第一條必須是它 ,指定基礎映象

  • MAINTAINER //作者資訊

  • RUN //shell模式

    以/bin/sh -c command執行

  • RUN [“executable”,“param1”,“param2”] //exec模式

    RUN ["/bin/bash","-c",“echo hello”] //指定其他形式的shell執行

    在映象構建過程中執行,每個run命令都會在當前映象上層建立一個映象來執行命令

  • EXPOSE […]//執行執行該映象的容器使用的埠,只是告訴,還是要在run中指定-p引數

  • CMD

    CMD [“executable”,“param1”,“param2”] //exec模式

    CMD //shell模式

    CMD 指令在容器執行時執行的,並且如果run指定了容器執行時要執行的命令,CMD指令的會被覆蓋,不會執行.

    CMD [“param1”,“param2”] //作為ENTERYPOINT指令的預設引數

  • ENTERYPOINT

    ENTERYPOINT [“executable”,“param1”,“param2”] //exec模式

    ENTERYPOINT //shell模式

    和CMD很相似,但是不會被run指定了容器執行時要執行的命令覆蓋,但可以使用docker run --entrypoint覆蓋

  • ADD

  • COPY

    都是複製檔案

    ADD <src>...<dest> ADD["<src>"..."<dest>"](適用於檔案路徑中有空格的情況)

    COPY<src>...<dest> COPY["<src>”..."<dest>”](適用於檔案路徑中有空格的情況)

    src:本地的相對路徑

    dest:映象中的絕對路徑

    ADD vs COPY

    ADD包含類似tar的解壓功能
    如果單純複製檔案,Docker推薦使用COPY

  • VOLUME ["/data"] 指定資料卷

  • WORKDIR 執行容器工作目錄

    如果使用了相對路徑,會一直傳遞下去

    WORKDIR/a
    WORKDIR b
    WORKDIR c
    RUN pwd

    /a/b/c

  • ENV 指定環境變數

  • USER user 指定使用什麼使用者執行

    USER user USER user:group USER user:gid USER uid USER uid:gid USER uid:group

    預設是root使用者

  • ONBUILD [instruction]

    映象觸發器 當一個映象被其他映象作為基礎映象時執行 會在構建過程中插入指令

    不會在此次構建中執行,在此次構建的映象作為基礎映象時才會執行

dockerfile構建過程

從基礎映象執行一個容器
執行一條指令,對容器做出修改
執行類似docker commit的操作,提交一個新的映象層
再基於剛提交的映象執行一個新容器
執行Docker中的下一條指令,直至所有指令執行完畢

docker build -t="ee_ubuntu" .

build會刪除中間層容器,但是沒刪除中間層映象,所以可以進行除錯,檢查錯誤

構建快取:構建過程會快取,再次同樣的構建,就會使用快取

不使用快取:docker bulid --no-cache 或者在dockerfile檔案中使用ENV REFRESH_DATE 2017-08-0x的修改來標識快取重新整理的時間,其實就是通過修改使構建過程不一樣

檢視映象構建的過程docker history <imgae>

11.docker容器的網路連線

docker容器的網路基礎

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:90:ac:ee:eb  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0

linux虛擬網橋 是資料鏈路層

可以設定ip地址

相當於擁有一個隱藏的虛擬網絡卡

預設分配 ip 172.17.0.1 netmask 255.255.0.0

ip是三層協議的內容,不應該出現在二層協議的裝置上,但是虛擬網橋是通用網路裝置抽象的一種,只要是網路裝置就可以設定ip

網橋管理工具

bridge-utils工具

命令是brctl

brctl show

修改docker0地址

ifconfig docker0 192.168.200.1 netmask 255.255.255.0

自定義虛擬網橋

新增虛擬網橋
brctl addbr br0
ifconfig br0 192.168.100.1 netmask 255.255.255.0
更改docker守護程序的啟動配置
DOCKER_OPTS = "-b br0"

#檢視網橋狀態
brctl show
#解除安裝網橋上的埠
brctl delif <網橋名> <埠名>
#刪除網橋
brctl delbr <網橋名>
#檢視是否有網橋網絡卡名
ifconfig
#關閉此網絡卡
ifconfig <網橋名> down

ip link set dev docker0 down  //關閉docker0網橋
ip addr add 192.168.100.1/24 dev br0 //設定ip地址
ip link set dev br0 up //啟動br0網橋
增加網橋可以通過brctl命令,但是為了簡便快捷,配置檔案也行
在/etc/sysconfig/network-scripts目錄下建立ifcfg-br0檔案

docker network命令

docker network所有子命令如下:
docker network create [-d]
docker network connect
docker network ls
docker network rm
docker network disconnect
docker network inspect
應用舉例
# 建立三個容器 conTainer1,container2,container3
docker run -itd --name=container1 busybox
docker run -itd --name=container2 busybox
# 建立網路mynet
docker network create -d bridge --subnet 172.25.0.0/16 mynet
# 將容器containerr2連線到新建網路mynet
docker network connect mynet container2
# 使用mynet網路來容器container3
docker run --net=mynet --ip=172.25.3.3 -itd --name=container3 busybox

12.docker容器的互聯

允許所有容器間互聯

配置選項 --icc=true //預設

重啟容器,ip重新整理改變,造成之前以ip訪問的失效,為了避免,採用別名(就是域名)的方式:

docker run --link={container_name}:{alias} ...
//--link:添加了很多別名前輟的環境變數,在host檔案中添加了對映

拒絕所有容器間互聯

DOCKER_OPTS = "--icc=false"

允許特定容器間的連線

//配置選項
DOCKER_OPTS = "--icc=false --iptables=true"
//啟動幾個已有的容器
//之前通過--link啟動的容器才可以和其連結的容器相互訪問

iptable -L -n //檢視
iptable -L -n  -v
iptable -F //清空

13.docker容器與外部網路的連線

(就是通過宿主機ip訪問docker容器的應用服務)

docker守護程序配置引數ip_forward

ip_forward=true //預設允許(流量/資料)轉發

sysctl net.ipv4.conf.all.forwarding //系統自帶命令,檢視是否允許資料轉發

iptables

與linux核心整合的包過濾防火牆系統

表(table)

鏈(chain)

規則(accept,reject,drop)

iptables [-t filter] -L -n

埠對映

docker run -p 80 ...

拒絕某個伺服器訪問某個容器(就是阻止轉發這個伺服器的流量)

iptables -I DOCKER -s 源地址 -d 目標地址 -p tcp --dport 80 -j DROP

-I 哪條鏈
-s 源地址
-d 目標地址
-p 協議
--dport 埠
-j 規則(操作)

14.docker容器的資料管理

docker容器的資料卷

由來:docker的理念之一:就是將應用與其執行的環境打包.所以通常容器的生存週期都是和在容器中執行的程式相一致的,而我們對資料的要求是永久的.另一方面docker容器之間也需要有一個共享資料的渠道這些需求催生了docker資料卷的產生

  • 什麼是資料卷(data volume)

    資料卷是經過特殊設計的目錄,可以繞過聯合檔案系統(UFS),為一個或多個 容器提供訪問。 資料卷設計的目的,在於資料的永久化,它完全獨立與容器的生存週期,因此, Docker不會在容器刪除時刪除其掛載的資料卷,也不會存在類似的垃圾收集機 制,對容器引用的資料捲進行處理。

    //新增資料卷
    docker run -v 宿主機中路徑:容器中路徑 ...
    //檢視是否掛載資料卷和許可權
    docker inspect id/name
    //為資料卷新增訪問許可權
    docker run -v 宿主機中路徑:容器中路徑:許可權 ...
    //刪除容器並帶資料卷一起
    docker rm -v id/name
    
  • dockerfile檔案中的VOLUME命令建立的資料卷是不能對映到本地已經存在的目錄或檔案的,會自動建立新的,因此不同的容器建立時對映的目錄會不同.(這樣怎麼共享呢?資料卷容器)

docker的資料卷容器(data container)

docker run --volume-from {container_name} ...

(個人理解)

掛載容器做資料卷

其實就是一箇中間媒介,將容器作為資料卷,然後存進容器的資料卷中,

然後通過這個容器的資料卷共享資料,

所以這個容器的資料卷最好通過run新增,可以固定本地目錄和自定義名字

  • 容器在這之間的作用僅僅是資料卷配置資訊的傳遞,

    就是將資料卷掛載配置傳遞到掛載了資料卷的新容器中

docker資料卷備份和還原

//備份
docker run --volumes-from {container_name} -v $(pwd):/backup {image} tar -cvf /backup/backup.tar {container data volume}

//還原
docker run --volumes-from {container_name} -v $(pwd):/backup {image} tar -xvf /backup/backup.tar {container data volume}

15.docker容器的跨主機連線

使用網橋實現跨主機容器連線

啟動選項配置
-b 指定使用自定義網橋 `-b=br0`
--fixed-cidr 限制ip地址分配範圍 --fixed-cidr='10.211.60.128/26'

網橋配置
1.brctl+ip xxx命令,臨時操作,重啟失效,具體谷歌
2.配置網橋檔案(centos暫時不會)

使用Open vSwitch實現跨主機容器連線

GRE隧道
GRE:通用路由協議封裝、
隧道技術(Tunneling)是一種通過使用網際網路絡的基礎設施在網路之間傳遞資料的方式。使用隧道傳遞的資料(或負載)可以是不同協議的資料幀或包。隧道協議將其它協議的資料幀或包重新封裝然後通過隧道傳送。新的幀頭提供路由資訊,以便通過網際網路傳遞被封裝的負載資料。
//安裝ovs
yum install openvswitch
systemctl start openvswitch

操作

  • 建立ovs網橋
  • 新增gre連線
  • 配置docker容器虛擬網橋
  • 為虛擬網橋新增ovs介面
  • 新增不同Docker容器網段路由
ovs-vsctl show //顯示
ovs-vsctl add-br obr0 //建立ovs網橋

ovs-vsctl add-port obr0 gre0 //新增gre介面
ovs-vsctl set interface gre0 type=gre options:remote_ip=另一臺主機ip(192.168.222.169)

brctl addbr br0
ifconfig br0 192.168.1.1 netmask 255.255.255.0
brctl addif br0 obr0 //為br0網橋新增ovs網橋連線
brctl show

//為不同網段新增路由
ip route add 192.168.2.0/24 via 192.168.222.109 dev eth0

使用weave實現跨主機容器連線

//安裝weave

生成Docker的yum原始檔

tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

安裝Docker

yum install -y docker-engine

注意:這裡是docker-engine而不是docker。

docker-io包是Debian / Ubuntu用於官方docker釋出的名稱。

主要原因是避免名稱與Ubuntu docker system-tray二進位制檔案衝突。

Docker現在有企業版(EE)和免費社群版(CE)

在安裝Docker Community Edition之前,您需要刪除舊的二進位制檔案。

Centos的/ RHL:

$ sudo yum remove docker \
                  docker-common \
                  docker-selinux \
                  docker-engine

Ubuntu的/ Debian的:

$ sudo apt-get remove docker docker-engine docker.io

自17年開始,docker分為docker-ce(社群版)、docker-ee(企業版),另外docker-io是較早的版本,通常用的都是docker-ce版;

Docker從1.13版本之後採用時間線的方式作為版本號,分為社群版CE和企業版EE。

猜測舊版docker根據upstart系統和systemd系統使用不同的配置檔案

新版docker 在兩種風格下的系統都是同樣的配置檔案