一、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引擎
**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 client 通過3個指令,先到docker daemon pull拉取images,如果服務端沒有,先到倉庫拉取,(如果倉庫沒有你可以build自建images);最後通過run指令建立容器
二、鏡像管理
1、什麼是鏡像
一個隻讀的模闆,就是一個dockerfile,可以在鏡像倉庫上傳或下載下傳
先有鏡像,後有容器;并且一個鏡像可以建立多個容器。
docker鏡像最大的特點:分層結構。最底層是一個base層,也即是一個作業系統層。它還會從base層一層層的疊加生成(什麼是層層疊加?例如,安裝一個軟體,它就會在base層的基礎上追加一層。它的好處就是資源共享)。
2、鏡像相關指令
檢視docker本地的鏡像
docker images
搜尋一個鏡像
docker search mysql
-
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