天天看點

史上最詳細的docker學習手冊,請查收!(一)

一、docker入門

1、docker的安裝及入門示例

環境準備:docker需要安裝在centos7 64位系統上;docker要求系統核心在3.10以上

檢視系統核心:

uname -r

安裝指令:

yum -y install docker-io

安裝完成後,啟動指令

service docker start

安裝nginx體驗

docker run -p 80:80 -d nginx

2、doker的理論概念

什麼是docker:

鲸魚通過身上的集裝箱(Container)來将不同種類的貨物進行隔離;而不是通過生出很多小鲸魚(Guest OS)來承運不同種類的貨物。Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從Apache2.0協定開源。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實作虛拟化。容器是完全使用沙箱機制,互相之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。

實體機、虛拟機、docker的形象對比

這是實體機: 一棟樓一戶人家、獨立地基、獨立花園。

史上最詳細的docker學習手冊,請查收!(一)

這是虛拟機:一棟樓包含多套房子,一套房一戶人家,共享地基、共享花園,獨立衛生間、廚房、寬帶

史上最詳細的docker學習手冊,請查收!(一)

這是docker容器:一套房隔離成多個小空間俗稱膠囊較高價的電梯大廈,每個膠囊住一個租客,共享地基、花園、衛生間、廚房、寬帶等等

史上最詳細的docker學習手冊,請查收!(一)
  • docker和虛拟機的對比
史上最詳細的docker學習手冊,請查收!(一)

docker的架構原理

史上最詳細的docker學習手冊,請查收!(一)

docker引擎

**derver daemon:**docker server是一個守護程序,它可以部署遠端也可以部署本地。它包含2部分網絡newtwork和磁盤data volumes

REST API: 實作了client和server間的通信互動協定

**CLI(command line interface)😗*docker client ,它包含2部分容器和鏡像,1個鏡像可以建立N個容器(container)

Image: 一個隻讀的鏡像模闆。可以自己建立一個鏡像也可以從網站上下載下傳鏡像供自己使用。

**Container:**由docker client通過鏡像建立的執行個體,使用者在容器中運作應用,一旦建立後就可以看做是一個簡單的作業系統,每個應用運作在隔離的容器中,享用獨自的權限,使用者,網絡。

**Registry:**鏡像倉庫,用來存儲和管理image鏡像,目前主流的倉庫有Docker hub、阿裡雲鏡像倉庫,也可以自己建立倉庫來管理。

史上最詳細的docker學習手冊,請查收!(一)

docker架構

說明:docker client 通過3個指令,先到docker daemon pull拉取images,如果服務端沒有,先到倉庫拉取,(如果倉庫沒有你可以build自建images);最後通過run指令建立容器

二、鏡像管理

1、什麼是鏡像

一個隻讀的模闆,就是一個dockerfile,可以在鏡像倉庫上傳或下載下傳

先有鏡像,後有容器;并且一個鏡像可以建立多個容器。

docker鏡像最大的特點:分層結構。最底層是一個base層,也即是一個作業系統層。它還會從base層一層層的疊加生成(什麼是層層疊加?例如,安裝一個軟體,它就會在base層的基礎上追加一層。它的好處就是資源共享)。

2、鏡像相關指令

檢視docker本地的鏡像

docker images      

搜尋一個鏡像

docker search mysql      
史上最詳細的docker學習手冊,請查收!(一)
  • INDEX :倉庫位址

    NAME :倉庫+名稱

    STARS :使用者的喜歡程度

    OFFICIAL:是否為官方,如果為OK的話代表官方,可信度高,放心使用

    UTOMATED:是否為公開的dockerfile腳本制成的?也即是說dockerfile是否提供。

  • 下載下傳一個鏡像
docker pull mysql:5.7      
  • 下載下傳完後,檢視是否在本地 docker images
  • 删除docker鏡像
docker rmi [imageID]
# 如果要删除全部鏡像 
docker rmi $(docker images -q)      
  • 加速器的配置
#centos的阿裡雲加速器指令
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://uqxmqcrw.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker      

dockerfile

dockerfile概念

dockerfile是一個文本的配置檔案,它可以快速建立自定義的鏡像,文本内容包含了若幹的指令行,并支援#作為注釋行,文本格式包含基礎鏡像FROM,維護者MAINTAINER,操作指令ADD,容器啟動後指令等共計4部分

dockerfile檔案示例

#1.基礎鏡像:FROM指令:基礎鏡像名:tag,例如java:8
FROM java:8

#2.維護者:格式:MAINTAINER <name>
MAINTAINER jackly

#3.鏡像的操作指令
# ADD拷貝一個檔案到容器中,格式:ADD <src> <dest>
ADD eureka-server-0.0.1-SNAPSHOT.jar  /app/service/eureka/data/app.jar

#告訴docker容器暴露端口,在容器啟動的時候,需要通過-p 做端口映射
EXPOSE 8761

#5.配置容器啟動後,執行什麼指令
ENTRYPOINT ["java","-jar","/app/service/eureka/data/app.jar"]      

建構docker鏡像

#其中 -t 對鏡像進行命名,一般的命名法:倉庫名字/鏡像名字:版本号
#注意:其中 .号,代表目前目錄下的dockerfile檔案
docker build -t registry-jackly/eureka-server:1.0.0 .      

檢視和運作鏡像容器

#檢視本地鏡像
docker images
#啟動鏡像
docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:1.0.0      

三、鏡像倉庫管理

1、建設dockerhub官方倉庫

  • 什麼是鏡像倉庫

    就是存放鏡像的地方

  • 推送鏡像到dockerhub(需翻牆)
①、登入 https://hub.docker.com/,建立一個eureka-server倉庫
②、本地linux登入docker官方, docker login
③、改鏡像的名,(為什麼要改?因為docker官方鏡像倉庫是以 使用者名 來命名倉庫的)
   docker tag registry-jackly/eureka-server:1.0.0 jacklydocker/eureka-server:1.0.0
④、推送鏡像到官方倉庫
   docker push jacklydocker/eureka-server:1.0.0
⑤、拉取上傳的鏡像
   先删除舊鏡像:docker rmi jacklydocker/eureka-server:1.0.0
   拉取鏡像:docker pull jacklydocker/eureka-server:1.0.0
   建立容器:docker run -d -p 8761:8761 --name=eureka docker.io/jacklydocker/eureka-server:1.0.0      

2、建設阿裡雲docker倉庫

  • 推送鏡像到阿裡雲倉庫
①、登入阿裡雲,先建立命名空間,并建個鏡像倉庫
②、本地linux登入登入阿裡雲Docker Registry, docker login --username=你的使用者名 registry.cn-shenzhen.aliyuncs.com
③、改鏡像的名,(為什麼要改?因為docker官方鏡像倉庫是以 使用者名 來命名倉庫的)
   docker tag 58acc264425c registry.cn-shenzhen.aliyuncs.com/jackly/eureka-server:1.0.0
④、推送鏡像到阿裡雲倉庫
   docker push registry.cn-shenzhen.aliyuncs.com/jackly/eureka-server:1.0.0
⑤、拉取上傳的鏡像
   docker pull registry.cn-shenzhen.aliyuncs.com/jackly/eureka-server:1.0.0      

3、建設本地倉庫

  • 為什麼需要搭建本地倉庫

    (1).節約帶寬:因為如果用docker或阿裡雲官方的倉庫走的網際網路浪費帶寬,而且慢。

    (2).提供資源利用和安全:因為公司内部的鏡像,推送到本地倉庫,更友善公司内部人員用,而且安全性高。

  • 建立倉庫容器
#查找官方倉庫
docker search registry
#拉取倉庫鏡像
docker pull registry
#運作倉庫容器
docker run -d -p 5000:5000 \
--restart=always \
--privileged=true \
--name=registry-local-jackly \
-v /date/volume/registry:/var/lib/registry \
registry      

推動鏡像到本地私有倉庫

①、改鏡像的名
   docker tag 58acc264425c reg.qxbdocker.com:5000/eureka-server:1.0.0
②、推送鏡像到私有倉庫(注意:記得改本地hosts:127.0.0.1 reg.qxbdocker.com)
   docker push reg.qxbdocker.com:5000/eureka-server:1.0.0
③、檢視搭建倉庫的資訊
   檢視倉庫的鏡像:
    curl -X GET http://127.0.0.1:5000/v2/_catalog
   倉庫倉庫某個鏡像的版本資訊:
    curl -X GET http://127.0.0.1:5000/v2/eureka-server/tags/list
⑤、拉取上傳的鏡像
    #先删除本地鏡像
    docker rmi reg.qxbdocker.com:5000/eureka-server:1.0.0
    #在拉取倉庫中的鏡像
    docker pull reg.qxbdocker.com:5000/eureka-server:1.0.0      

四、容器管理

1、容器的生命周期實踐

什麼是容器

容器類似于膠囊較高價的電梯大廈,它是一個精簡版的作業系統,一般容器中隻運作一個應用(例如:eureka-server鏡像)。

如何建立容器

通過鏡像建立容器,通過docker run指令建立。

容器的作用

容器起到了隔離的作用,獨享空間、網絡等等。

doker指令

docker run --help
    -d, --detach=false         指定容器運作于前台還是背景,預設為false
    -i, --interactive=false    打開STDIN,用于控制台互動
    -t, --tty=false            配置設定tty裝置,該可以支援終端登入,預設為false
    -u, --user=""              指定容器的使用者
    -a, --attach=[]            登入容器(必須是以docker run -d啟動的容器)
    -w, --workdir=""           指定容器的工作目錄
    -c, --cpu-shares=0         設定容器CPU權重,在CPU共享場景使用
    -e, --env=[]               指定環境變量,容器中可以使用該環境變量
    -m, --memory=""            指定容器的記憶體上限
    -P, --publish-all=false    指定容器暴露的端口
    -p, --publish=[]           指定容器暴露的端口
    -h, --hostname=""          指定容器的主機名
    -v, --volume=[]            給容器挂載存儲卷,挂載到容器的某個目錄
    --volumes-from=[]          給容器挂載其他容器上的卷,挂載到容器的某個目錄
    --cap-add=[]               添權重限,權限清單詳見:http://linux.die.net/man/7/capabilities
    --cap-drop=[]              删除權限,權限清單詳見:http://linux.die.net/man/7/capabilities
    --cidfile=""               運作容器後,在指定檔案中寫入容器PID值,一種典型的監控系統用法
    --cpuset=""                設定容器可以使用哪些CPU,此參數可以用來容器獨占CPU
    --device=[]                添加主機裝置給容器,相當于裝置直通
    --dns=[]                   指定容器的dns伺服器
    --dns-search=[]            指定容器的dns搜尋域名,寫入到容器的/etc/resolv.conf檔案
    --entrypoint=""            覆寫image的入口點
    --env-file=[]              指定環境變量檔案,檔案格式為每行一個環境變量
    --expose=[]                指定容器暴露的端口,即修改鏡像的暴露端口
    --link=[]                  指定容器間的關聯,使用其他容器的IP、env等資訊
    --lxc-conf=[]              指定容器的配置檔案,隻有在指定--exec-driver=lxc時使用
    --name=""                  指定容器名字,後續可以通過名字進行容器管理,links特性需要使用名字
    --net="bridge"             容器網絡設定:
                                  bridge 使用docker daemon指定的網橋
                                  host    //容器使用主機的網絡
                                  container:NAME_or_ID  >//使用其他容器的網路,共享IP和PORT等網絡資源
                                  none 容器使用自己的網絡(類似--net=bridge),但是不進行配置
    --privileged=false         指定容器是否為特權容器,特權容器擁有所有的capabilities
    --restart="no"             指定容器停止後的重新開機政策:
                                  no:容器退出時不重新開機
                                  on-failure:容器故障退出(傳回值非零)時重新開機
                                  always:容器退出時總是重新開機
    --rm=false                 指定容器停止後自動删除容器(不支援以docker run -d啟動的容器)
    --sig-proxy=true           設定由代理接受并處理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理      

docker建立示例

docker run -d -p 5000:5000 \
    --restart=always \
    --privileged=true \
    --name=registry-local-jackly \
    -v /date/volume/registry:/var/lib/registry \
    registry      

docker常用指令

#檢視正在運作的容器
docker ps
#檢視所有的容器(包括已經停止的容器)
docker ps -a
#停止容器
docker stop 容器ID
#強制停止容器
docker kill 容器ID
#啟動容器
docker start 容器ID
#重新開機容器
docker restart 容器ID
#删除已經停止的容器
docker rm 容器ID
#删除正在運作的容器,強制删除
docker rm -f 容器ID      

2、如何進入容器内部

  • 進入容器的方式

    有4種方式能進入容器,分别為 exec、docker attach、ssh、nsenter. 這4種都能進入容器,但是最好用最常用的是exec

  • exec指令
docker exec --help
    -d 以背景方式執行,這樣,我們執行完這條指令,還可以幹其他事情,寫腳本最常用
    -e 代表環境變量
    -i 以互動方式運作,是阻塞式的
    -t 配置設定一個僞終端,這個參數通常與-i參數一起使用,然後在後面跟上容器裡的/bin/bash,這樣就把我們帶到容器裡去了。
    -u 指定進入的容器以哪個使用者登陸,預設是root      

進入容器指令

#啟動鏡像,若鏡像容器已經建立,則通過docker ps -a查詢停止的容器id,在通過docker start 容器ID  啟動容器
 docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:1.0.0
 #進入容器的相關指令
 docker exec -it eureka sh
 #進入後可以使用ls檢視目錄(/app/service/eureka/data/app.jar)
 docker exec -it eureka /bin/bash
 docker exec -it eureka pwd
 docker exec -it eureka top      

3、容器内容改變後,能否重新生成鏡像

使用ll指令驗證

①、進入容器: docker exec -it eureka /bin/bash
②、修改容器内容:echo "alias ll='ls -l'" >> ~/.bashrc && source ~/.bashrc
③、驗證ll指令:ll
④、強制删除容器:docker rm -f 容器ID
⑤、啟動鏡像容器:docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:1.0.0
⑥、進入容器使用ll指令:發現先前修改的實效      

修改容器後,重新生成鏡像

①、進入容器: docker exec -it eureka /bin/bash
②、修改容器内容:echo "alias ll='ls -l'" >> ~/.bashrc && source ~/.bashrc
③、驗證ll指令:ll
#生成鏡像指令
docker commit --help
    -a 用來指定作者
    -c 使用Dockerfile指令來建立鏡像
    -m 描述我們此次建立image的資訊
    -p 在commit時,将容器暫停
④、重新生成鏡像
docker commit -m="add ll" --author="jackly" eureka registry-jackly/eureka-server:2.0.0
⑤、啟動新鏡像
docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:2.0.0