1. 程式人生 > 實用技巧 >zabbix 歷史資料處理

zabbix 歷史資料處理

一:簡介:

前言

統稱來說,容器是一種工具,指的是可以裝下其它物品的工具,以方便人類歸納放置物品、儲存和異地運輸,具體來說比如人類使用的衣櫃、行李箱、揹包等可以成為容器,但今天我們所說的容器是一種IT技術。

容器技術是虛擬化、雲端計算、大資料之後的一門新興的並且是炙手可熱的新技術,容器技術提高了硬體資源利用率、方便了企業的業務快速橫向擴容、實現了業務宕機自愈功能,因此未來數年會是一個容器愈發流行的時代,這是一個對於IT行業來說非常有影響和價值的技術,而對於IT行業的從業者來說,熟練掌握容器技術無疑是一個很有前景的的行業工作機會。

 

1.1:docker簡介:

1.1.1:Docker是什麼:

首先Docker是一個在2013年開源的應用程式並且是一個基於go語言編寫是一個開源的pass服務(Platform as a Service,平臺即服務的縮寫),go語言是由google開發,docker公司最早叫dotCloud後由於Docker開源後大受歡迎就將公司改名為 Docker Inc,總部位於美國加州的舊金山,Docker是基於linux 核心實現,Docker最早採用LXC技術(LinuX Container的簡寫,LXC是Linux 原生支援的容器技術,可以提供輕量級的虛擬化,可以說 docker 就是基於 LXC 發展起來的,提供 LXC 的高階封裝,發展標準的配置方法),而虛擬化技術KVM(Kernel-based Virtual Machine) 基於模組實現,Docker後改為自己研發並開源的runc技術執行容器。

Docker 相比虛擬機器的交付速度更快,資源消耗更低,Docker 採用客戶端/服務端架構,使用遠端API來管理和建立Docker容器,其可以輕鬆的建立一個輕量級的、可移植的、自給自足的容器,docker 的三大理念是build(構建)、ship(運輸)、 run(執行),Docker遵從aoache 2.0協議,並通過(namespace及cgroup等)來提供容器的資源隔離與安全保障等,所以Docke容器在執行時不需要類似虛擬機器(空執行的虛擬機器佔用物理機6-8%效能)的額外資源開銷,因此可以大幅提高資源利用率,總而言之Docker是一種用了新穎方式實現的輕量級虛擬機器.類似於VM但是在原理和應用上和VM的差別還是很大的,並且docker的專業叫法是應用容器(Application Container)。

IDC/IAAS/PAAS/SAAS 對比

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.1.2:docker的組成:

Docker 客戶端(Client):客戶端使用docker 命令或其他工具呼叫docker API。

Docker 服務端(Server):Docker守護程序,執行docker容器。

Docker 映象(Images):映象可以理解為建立例項使用的模板。

Docker 容器(Container): 容器是從映象生成對外提供服務的一個或一組服務。

Docker 倉庫(Registry): 儲存映象的倉庫,類似於git或svn這樣的版本控制系統,官方倉庫: https://hub.docker.com/

Docker 主機(Host):一個物理機或虛擬機器,用於執行Docker服務程序和容器。

 

Docker面試問題

1.怎麼樣保證每個容器都有不同的檔案系統並且能互不影響?
docker使用namespace來隔離容器的執行環境,比如容器的檔案系統,使用者環境,程序隔離

 

K8s用於業務的隔離,把容器建立到指定的namespace,

A業務的所有容器執行linux39,B業務的所有容器執行在magedu


2.一個 docker主程序內的各個容器都是其子程序,那麼實現同一個主程序下不
同類型的子程序?各個程序間通訊能相互訪問(記憶體資料)嗎?
    不同型別的子程序代表著不同服務,不同服務之間不能共享記憶體空間
    
3.每個容器怎麼解決IP及埠分配的問題?
多個容器埠只能唯一使用,將埠對映到宿主機訪問


4.多個容器的主機名能一樣嗎?

Namespace解決這些問題
5.每個容器都要不要有root使用者?怎麼解決賬戶重名問題?

Namespace解決這些問題
以上問題怎麼解決

 

1.1.3:Docker對比虛擬機器:

 

 

Docker對比虛擬機器:

資源利用率更高:一臺物理機可以執行數百個容器,但是一般只能執行數十個虛擬機器。

開銷更小:不需要啟動單獨的虛擬機器佔用硬體資源。

啟動速度更快:可以在數秒內完成啟動。

 

使用虛擬機器是為了更好的實現服務執行環境隔離,但是一個虛擬機器只執行一個服務,很明顯資源利用率比較低。虛擬機器可以跨平臺,每個虛擬機器單獨核心.

 

1.1.3: Linux Namespace

Linux Namespace是Linux提供的一種核心級別環境隔離的方法。不知道你是否還記得很早以前的Unix有一個叫chroot的系統呼叫(通過修改根目錄把使用者jail到一個特定目錄下),chroot提供了一種簡單的隔離模式:chroot內部的檔案系統無法訪問外部的內容。Linux Namespace在此基礎上,提供了對UTS、IPC、mount、PID、network、User等的隔離機制。

舉個例子,我們都知道,Linux下的超級父親程序的PID是1,所以,同chroot一樣,如果我們可以把使用者的程序空間jail到某個程序分支下,並像chroot那樣讓其下面的程序 看到的那個超級父程序的PID為1,於是就可以達到資源隔離的效果了(不同的PID namespace中的程序無法看到彼此)

 

    

Linux namespace總結

  1. 共用一個核心
  2. 容器技術都是在一個程序內實現執行指定服務的執行環境
  3. Namespace可以保證宿主機核心不受其他程序干擾和影響
  4. 容器不能訪問宿主機中的資源
  5. 宿主機使用了chroot技術把容器鎖定到一個指定的執行目錄
  6. 容器的程序對應宿主機的程序
  7. 容器的ip是隨機的

 

 

程序對應關係

 

--容器對應宿主機的目錄

 

訪問規則

docker-proxy

用於管理docker生成的訪問規則

將宿主機的80埠訪問轉發到docker容器ip地址的80埠

Iptables規則埠轉發,有效能損失,k8s用的是lvs

宿主機需要開啟ipv4 ip_forward, 源地址轉換

1.1.5: linux control groups

    對不同容器的記憶體空間的管理,管理資源上限

 

1.1.5.1: 驗證系統cgroups:

Cgroups在核心層預設已經開啟,從centos和ubuntu對比結果來看,顯然核心較新的ubuntu支援的功能更多.

以下是ubuntu的,支援的功能更多

1.1.5.3:cgroups 具體實現

 

 

 

 

1.1.5.4:檢視系統cgroups

 

1.1.6:容器的管理工具

Lxc相當於管理命令,lxd是服務,用的人很少了

1.1.6.1 Docker映象

只讀層:Image代表映象倉庫

可寫層:資料目錄,容器裡的資料還是存在宿主機的目錄裡(/var/lib/docker/overlay2)

(隨機id)+diff+容器內目錄

 

Pouch

阿里巴巴的docker管理工具

 

1.1.4:Docker的優勢:

快速部署:短時間內可以部署成百上千個應用,更快速交付到線上。

高效虛擬化:不需要額外的hypervisor支援,直接基於linux 實現應用虛擬化,相比虛擬機器大幅提高效能和效率。

節省開支:提高伺服器利用率,降低IT 支出。

簡化配置:將執行環境打包儲存至容器,使用時直接啟動即可。

快速遷移和擴充套件:可誇平臺執行在物理機、虛擬機器、公有云等環境,良好的相容性可以方便將應用從A宿主機遷移到B宿主機,甚至是A平臺遷移到B平臺。

 

1.1.5:Docker的缺點:

隔離性:各應用之間的隔離不如虛擬機器。

容器的ip是隨機的,

 

 

1.1.6:docker(容器)的核心技術:

容器規範:

除了docker之外的docker技術,還有coreOS的rkt,還有阿里的Pouch,為了保證容器生態的標誌性和健康可持續發展,包括Google、Docker等公司共同成立了一個叫open container(OCI)的組織,其目的就是制定開放的標準的容器規範,目前OCI一共釋出了兩個規範,分別是runtime spec(容器執行規範)和image format spec(容器映象格式),有了這兩個規範,不通的容器公司開發的容器只要相容這兩個規範,就可以保證容器的可移植性和相互可操作性。

 

 

容器runtime:

runtime是真正執行容器的地方,因此為了執行不同的容器runtime需要和作業系統核心緊密合作相互在支援,以便為容器提供相應的執行環境。

目前主流的三種runtime:

Lxc:linux上早期的runtime,Docker早期就是採用lxc作為runtime。

runc:目前Docker預設的runtime,runc遵守OCI規範,因此可以相容lxc。

rkt:是CoreOS開發的容器runtime,也符合OCI規範,所以使用rktruntime也可以執行Docker容器。

 

容器管理工具:

管理工具連線runtime與使用者,對使用者提供圖形或命令方式操作,然後管理工具將使用者操作傳遞給runtime執行。

Lxd是lxc的管理工具。

Runc的管理工具是docker engine,docker engine包含後臺deamon和cli兩部分,大家經常提到的Docker就是指的docker engine。

Rkt的管理工具是rkt cli。

 

 

 

 

容器定義工具:

映象至關重要,拉取下來後,runtime根據image模板建立容器

容器定義工具允許使用者定義容器的屬性和內容,以方便容器能夠被儲存、共享和重建。

Dockerfile:包含N個命令的文字檔案,通過dockerfile創建出docker image。

Docker image:是docker 容器的模板,runtime依據docker image建立容器。

ACI(App container image):與docker image類似,是CoreOS開發的rkt容器的映象格式。

 

 

Registry:

統一儲存共享映象的地方,叫做映象倉庫。

Image registry:docker 官方提供的私有倉庫部署工具(免費的)。

Docker hub:docker官方的公共倉庫,已經儲存了大量的常用映象,可以方便大家直接使用。

Harbor:vmware 提供的自帶web自帶認證功能的映象倉庫,目前有很多公司使用。

(統一儲存,分發映象),自建倉庫,適合內網,速度快,內網更安全

 

編排工具-k8s:

當多個容器在多個主機執行的時候,單獨管理每個容器是相當負載而且很容易出錯,而且也無法實現某一臺主機宕機後容器自動遷移到其他主機從而實現高可用的目的,也無法實現動態伸縮的功能,因此需要有一種工具可以實現統一管理、動態伸縮、故障自愈、批量執行等功能,這就是容器編排引擎。

資源管理:

監控高峰期的併發量能否扛的主.如果很多空閒,就可以考慮將伺服器挪出去.

自動擴容:

    傳統是使用增加一臺伺服器,使用負載均衡訪問.

    K8s會監控伺服器物理資源使用情況(cpu,記憶體),當資源不夠時擴容,夠用時縮容.k8s能夠自動識別新加的容器.

容器編排通常包括容器管理、排程、叢集定義和服務發現等功能。

Docker swarm:docker 開發的容器編排引擎。

Kubernetes:google領導開發的容器編排引擎,內部專案為Borg,且其同時支援docker和CoreOS。

Mesos+Marathon:通用的叢集組員排程平臺,mesos與marathon一起提供容器編排引擎功能。

 

 

1.1.7:docker(容器)的依賴技術:

容器網路

docker自帶的網路docker network僅支援管理單機上的容器網路,當多主機執行的時候需要使用第三方開源網路,例如calico、flannel等。K8s實現跨主機間通訊,

 

 

 

 

 

 

 

 

 

 

服務發現:

容器的動態擴容特性決定了容器IP也會隨之變化,因此需要有一種機制開源自動識別並將使用者請求動態轉發到新建立的容器上,kubernetes自帶服務發現功能,需要結合kube-dns服務解析內部域名。

 

容器監控:

可以通過原生命令docker ps/top/stats 檢視容器執行狀態,另外也可以使heapster/ Prometheus等第三方監控工具監控容器的執行狀態。

 

資料管理:

容器的動態遷移會導致其在不同的Host之間遷移,因此如何保證與容器相關的資料也能隨之遷移或隨時訪問,可以使用邏輯卷/儲存掛載等方式解決。

 

日誌收集:

docker 原生的日誌檢視工具docker logs,但是容器內部的日誌需要通過ELK等專門的日誌收集分析和展示工具進行處理。

    Docker logs ashdasl12

    Docker logs -f asdafa12     #一直監控某個容器日誌

Etcd記錄資料資訊,包括容器label對應ip地址

 

 

 

 

1.2:Docker安裝及基礎命令介紹:

官方網址:https://www.docker.com/

系統版本選擇:

Docker 目前已經支援多種作業系統的安裝執行,比如Ubuntu、CentOS、Redhat、Debian、Fedora,甚至是還支援了Mac和Windows,在linux系統上需要核心版本在3.10或以上,docker版本號之前一直是0.X版本或1.X版本,但是從2017年3月1號開始改為每個季度釋出一次穩版,其版本號規則也統一變更為YY.MM,例如17.09表示是2017年9月份釋出的,本次演示的作業系統使用Centos 7.5為例。

cat /etc/centos-release #檢視centos版本

 

Docker版本選擇:

Docker之前沒有區分版本,但是2017年推出(將docker更名為)新的專案Moby,github地址:https://github.com/moby/moby,Moby專案屬於Docker專案的全新上游,Docker將是一個隸屬於的Moby的子產品,而且之後的版本之後開始區分為CE版本(社群版本)和EE(企業收費版),CE社群版本和EE企業版本都是每個季度釋出一個新版本,但是EE版本提供後期安全維護1年,而CE版本是4個月,本次演示的Docker版本為18.03,以下為官方原文:

https://blog.docker.com/2017/03/docker-enterprise-edition/

 

Docker CE and EE are released quarterly, and CE also has a monthly "Edge" option. Each Docker EE release is supported and maintained for one year and receives security and critical bugfixes during that period. We are also improving Docker CE maintainability by maintaining each quarterly CE release for 4 months. That gets Docker CE users a new 1-month window to update from one version to the next.

與k8s結合使用的時候,要安裝經過k8s官方測試通過的docker版本,避免出現不相容等未知不可預估大的問題發生,k8s測試過的docker版本可以在github查詢,具體如下

 

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.16.md#v1167

檢視changelog選擇文件版本的k8s對應docker

根據版本介紹選擇相應穩定的docker

穩定版本資訊地址:

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.16.md#v1167

 

Github搜fluent元件,用作日誌收集

Flannel元件代替Calico(網路元件)

元件版本不能超過k8s相容要求版本,不然會報錯

 

1.2.1:下載rpm包安裝:

官方rpm包下載地址: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

阿里映象下載地址:

https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/

https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-17.09.1.ce-1.el7.centos.x86_64.rpm #屬於k8s相容版本

docker-ce的包:包含containerd,docker(安裝新版本需要刪除舊的)

服務啟動報錯:

 

 

1.2.2:通過修改yum源安裝:

[root@docker-server1 ~]# rm -rf /etc/yum.repos.d/*

[root@docker-server1 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

[root@docker-server1 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

[root@docker-server1 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@docker-server1 ~]# yum install docker-ce

 

1.2:3:啟動並驗證docker服務:

[root@docker-server1 ~]# systemctl start docker

[root@docker-server1 ~]# systemctl enable docker

 

1.2.4:驗證docker版本:

1.2.5:驗證docker0網絡卡:

在docker安裝啟動之後,預設會生成一個名稱為docker0的網絡卡並且預設IP地址為172.17.0.1的網絡卡。

 

 

 

 

 

1.2.6:驗證docker 資訊:

Docker 統計資訊

Live restore enabled:false #關閉docker服務時,不關閉正在執行的docker容器(預設不用開啟)

 

1.2.6: 解決不支援swap限制警告:

如果支援就沒有如下警告資訊

支援限制docker對交換分割槽使用大小

cat /etc/default/grub

 

 

update-grub

reboot #重啟一下,使配置生效

注意:交換分割槽速度非常慢,不推薦使用

 

1.2.7:docker儲存引擎:

目前docker的預設儲存引擎為overlay2,需要磁碟分割槽支援d-type檔案分層功能,因此需要系統磁碟的額外支援。

 

官方文件關於儲存引擎的選擇文件:

https://docs.docker.com/storage/storagedriver/select-storage-driver/

 

 

Docker官方推薦首選儲存引擎為overlay2其次為devicemapper,但是devicemapper存在使用空間方面的一些限制,雖然可以通過後期配置解決,但是官方依然推薦使用overlay2,以下是網上查到的部分資料:

https://www.cnblogs.com/youruncloud/p/5736718.html

devicemapper:會建立一個100G大小的邏輯卷,當這個邏輯卷滿了,無法存資料(所以不要使用)

 

 

如果docker資料目錄是一塊單獨的磁碟分割槽而且是xfs格式的,那麼需要在格式化的時候加上引數-n ftype=1,否則後期在啟動容器的時候會報錯不支援d-type。

 

報錯介面:

 

 

 

儲存引擎更換

7.2版本及之前版本預設是devicemapper儲存引擎

儲存引擎修改後,之前資料會丟失

 

修改儲存引擎

  1. 備份docker資料(修改儲存引擎會丟失原來資料)
  2. dockerd --help(檢視幫助)

 

如果檔案系統是xfs檔案系統,檔案系統引數必須帶ftype=1引數,表示支援資料分層功能

xfs_info /            #查詢引數

ext4檔案系統預設支援overlay

 

新增一塊磁碟,格式化檔案系統開啟ftype=1引數

mkfs.xfs -f -n ftype=1 /dev/sdb

mount /dev/sdb /var/lib/docker

新增引數-s=overlay或者overlay2在dockerd啟動時

docker info     #檢視現在儲存引擎型別

 

 

3.systemctl daemon-reload        #重新載入新修改的服務啟動配置檔案

systemctl restart docker

 

 

 

 

1.2.9: docker服務程序


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.2.9.2: 檢視containerd程序關係

 

Containerd-shim真正建立容器的程序

 

 

 

1.2.9.4: 容器的建立與管理過程:

 

 

 

 

 

 

 

開發使用的grpc工具

 

 

 

 

1.3.1 二進位制安裝docker

1.下載二進位制壓縮包,解壓後放到/usr/bin/目錄下

wget https://download.docker.com/linux/static/stable/x86_64/docker-18.09.9.tgz]

cd docker

cp ./* /usr/bin/

 

2.準備docker service 檔案

/lib/systemd/system/containerd.service            #開啟docker前需先開啟containerd服務

/lib/systemd/system/docker.service          #docker服務開啟檔案

/lib/systemd/system/docker.socket                 #socket檔案

 

3.服務啟動

systemctl unmask containerd                    #解鎖

systemctl unmask docker

systemctl unmask docker.socket

 

systemctl enable docker

systemctl enable containerd

 

4.服務測試

Docker version

docker pull nginx            #下載docker- nginx映象

docker run -it -p 80:80 nginx    #啟動nginx容器,測試訪問nginx

docker0網絡卡驗證

 

1.3.2 解決容器 IPv4 forwarding is disabled

建立容器的時候報錯WARNING: IPv4 forwarding is disabled. Networking will not work.

 

# docker run -it -p 30001:22 --name=centos-ssh centos /bin/bash

 

WARNING: IPv4 forwarding is disabled. Networking will not work.

 

解決辦法:

# vim /usr/lib/sysctl.d/00-system.conf

 

新增如下程式碼:

net.ipv4.ip_forward=1

 

重啟network服務

# systemctl restart network

 

完成以後,刪除錯誤的容器,再次建立新容器,就不再報錯了。

 

 

 

 

 

1.4.1: docker離線安裝

 

1、解壓安裝包

tar xf docker_rpm.tar.gz

 

2、進入解壓的目錄

cd docker_rpm/

ls

 

3、安裝

yum localinstall *.rpm -y

 

4、檢視安裝版本

docker version

 

5、設定開機自啟動

systemctl enable docker

 

6、啟動docker

systemctl start docker

 

7、匯入

docker image load -i docker_nginx.tar.gz

 

8、啟動nginx容器

docker run -d -p 80:80 nginx

 

9、檢視nginx容器

docker ps

 

 

https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ #docker離線安裝包地址

 

 

 

 

 

1.3:docker 映象加速配置:

國內下載國外的映象有時候會很慢,因此可以更改docker配置檔案新增一個加速器,可以通過加速器達到加速下載映象的目的。

1.3.1:獲取加速地址:

瀏覽器開啟http://cr.console.aliyun.com,註冊或登入阿里雲賬號,點選左側的映象加速器,將會得到一個專屬的加速地址,而且下面有使用配置說明:

阿里雲加速地址是通用的

 

 

1.3.2:生成映象加速配置檔案:

[root@docker-server1 ~]# mkdir -p /etc/docker

[root@docker-server1 ~]# cat>/etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://9916w1ow.mirror.aliyuncs.com"]

}

EOF

 

 

[root@docker-server1 ~]# cat /etc/docker/daemon.json

{

"registry-mirrors": ["https://9916w1ow.mirror.aliyuncs.com"]

}

 

1.3.3:重啟docker服務:

[root@docker-server1 ~]# systemctl daemon-reload

[root@docker-server1 ~]# sudo systemctl restart docker

 

 

1.4:Docker 映象管理:

'將可寫層目錄掛載到容器目錄.基於aufs檔案系統實現,目錄掛載目錄,使應用程式在一個目錄即可訪問

1.docker映象基礎使用

alpine:精簡的映象

映象體積越小越好

 

 

 

 

 

製作映象:官方映象(centos)+安裝了基礎命令的映象 (centos)+

' 製作映象流程(構建映象基本設計原則)

docker 命令是最常使用的命令,其後面可以加不同的引數以實現響應的功能,常用的命令如下:

 

 

 

 

1.4.1:搜尋映象:

在官方的docker 倉庫中搜索指定名稱的docker映象,也會有很多三方映象。

[root@docker-server1 ~]# docker search centos:7.2.1511 #帶指定版本號

[root@docker-server1 ~]# docker search centos #不帶版本號預設latest

注:與在hub.docker.com官網上搜索一樣(官網搜尋更好)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.4.2:下載映象:

 

預設是在docker官網下載映象

從docker 倉庫將映象下載到本地。

[root@docker-server1 ~]# docker pull alpine    #比較小的環境,很多公司也在用

[root@docker-server1 ~]# docker pull nginx    

[root@docker-server1 ~]# docker pull hello-world #檢測docker環境是否正常

[root@docker-server1 ~]# docker pull centos

#下載中

 

#下載完成

 

 

 

1.4.3:檢視本地映象:

#下載完成的映象比下載的大,因為下載完成後會解壓

[root@docker-server1 ~]# docker images

 

REPOSITORY #映象所屬的倉庫名稱

TAG #映象版本號(識別符號),預設為latest,第二次更新時要指定版本號,不能再都預設

IMAGE ID #映象唯一ID標示

CREATED #映象建立時間(官方的)

VIRTUAL SIZE #映象的大小

 

 

1.4.4:映象匯出:

可以將映象從本地匯出問為一個壓縮檔案,然後複製到其他伺服器進行匯入使用。

#匯出方法1:

[root@docker-server1 ~]# docker save -o /opt/centos.tar.gz centos

[root@docker-server1 ~]# ll /opt/centos.tar.gz

-rw------- 1 root root 205225472 Nov 1 03:52 /opt/centos.tar.gz

 

#匯出方法2:

[root@docker-server1 ~]# docker save centos > /opt/centos-1.tar.gz

[root@docker-server1 ~]# ll /opt/centos-1.tar.gz

-rw-r--r-- 1 root root 205225472 Nov 1 03:52 /opt/centos-1.tar.gz

 

#檢視映象內容:

[root@docker-server1 ~]# cd /opt/

[root@docker-server1 opt]# tar xvf centos.tar.gz

[root@docker-server1 opt]# cat manifest.json #包含了映象的相關配置,配置檔案、分層

[{"Config":"196e0ce0c9fbb31da595b893dd39bc9fd4aa78a474bbdc21459a3ebe855b7768.json","RepoTags":["docker.io/centos:latest"],"Layers":["892ebb5d1299cbf459f67aa070f29fdc6d83f40

25c58c090e9a69bd4f7af436b/layer.tar"]}]

 

#分層為了方便檔案的共用,即相同的檔案可以共用 [{"Config":"配置檔案.json","RepoTags":["docker.io/nginx:latest"],"Layers":["分層1/layer.tar","分層2 /layer.tar","分層3 /layer.tar"]}]

 

1.4.5:映象匯入:

將映象匯入到docker

方法1:

[root@docker-server1 ~]# scp /opt/centos.tar.gz 192.168.10.206:/opt/

[root@docker-server2 ~]# docker load < /opt/centos.tar.gz

 

方法2:

Docker load -i nginx-1.16.1.tar.gz

驗證映象:

 

 

1.4.6:刪除映象:

映象沒有建立容器,可以直接刪除映象,

映象建立過容器,需要先刪容器,才能再刪映象

如果repository與tag號為none:

表示匯入的映象,則可能是一樣衝突了,把之前的覆蓋了

 

[root@docker-server1 opt]# docker rmi centos

#獲取執行引數幫助

[root@linux-docker opt]# docker daemon –help

 

壞的<none>:<none>映象的產生

而docker build 或是 pull 命令就會產生臨時映象。如果我們用dockerfile建立一個helloworld映象後,因為版本更新需要重新建立,那麼以前那個版本的映象就會

成為臨時映象。這個是需要刪除的。刪除命令見下。

清除壞的<none>:<none>映象

docker rmi $(docker images -f "dangling=true" -q)

 

 

總結:企業使用映象及常見操作:

搜尋、下載、匯出、匯入、刪除

 

 

命令總結:

# docker load -i centos-latest.tar.xz #匯入本地映象

# docker save -o /opt/centos.tar #centos #匯出映象

# docker rmi 映象ID/映象名稱 #刪除指定ID的映象,通過映象啟動容器的時候映象不能被刪除,除非將容器全部關閉加-f引數

# docker rm 容器ID/容器名稱 #刪除容器

# docker rm 容器ID/容器名-f #強制刪除正在執行的容器

 

歷史映象,需要定期清理

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.5:容器操作基礎命令:

命令格式:

# docker run [選項] [映象名] [shell命令] [引數]

# docker run [引數選項] [映象名稱,必須在所有選項的後面] [/bin/echo 'hello wold'] #單次執行,沒有自定義容器名稱

# docker run centos /bin/echo 'hello wold' #啟動的容器在執行完shel命令就退出了

啟動時需要指定repository tag來執行,image id會根據映象內容變化id號,類似軟連結

容器的幾種狀態

created:被建立後由於啟動引數錯誤而沒有啟動成功的

exited: 退出狀態

up:啟動狀態

pause:暫停的容器

 

1.5.1:從映象啟動一個容器:

會直接進入到容器,並隨機生成容器ID和名稱

[root@docker-server1 ~]# docker run -it docker.io/centos bash

[root@11445b3a84d3 /]#

 

 

#退出容器不登出

ctrl+p+q

docker ps

 

1.5.2:顯示正在執行的容器:

[root@linux-docker ~]# docker ps

 

1.5.3:顯示所有容器:

包括當前正在執行以及已經關閉的所有容器:

[root@linux-docker ~]# docker ps -a

 

 

1.5.4:刪除執行中的容器:

-v刪除容器相關的邏輯卷

加-f後,即使容正在運行當中,也會被強制刪除掉

[root@docker-server1 ~]# docker rm -f 11445b3a84d3

 

1.5.5:隨機對映埠:

[root@docker-server1 ~]# docker pull nginx #下載nginx 映象

[root@docker-server1 ~]# docker run -P docker.io/nginx #前臺啟動並隨機對映本地埠到容器的80

#前臺啟動的會話視窗無法進行其他操作,除非退出,但是退出後容器也會退出

#隨機埠對映,其實是預設從32768開始

#訪問埠:

 

1.5.6:指定埠對映:

方式1:本地埠81對映到容器80埠:

# docker run -p 81:80 --name nginx-test-port1 nginx

 

方式2:本地IP:本地埠:容器埠

# docker run -p 192.168.10.205:82:80 --name nginx-test-port2 docker.io/nginx

 

方式3:本地IP:本地隨機埠:容器埠

# docker run -p 192.168.10.205::80 --name nginx-test-port3 docker.io/nginx

方式4:本機ip:本地埠:容器埠/協議,預設為tcp協議

# docker run -p 192.168.10.205:83:80/udp --name nginx-test-port4 docker.io/nginx
dns使用的就是udp協議,53埠

 

方式5:一次性對映多個埠+協議:

# docker run -p 86:80/tcp -p 443:443/tcp -p 53:53/udp --name nginx-test-port5 docker.io/nginx

iptables -t nat -vnL        #檢視防火牆ip地址轉換,使用的是核心防火牆,宿主機防火牆未開

#命令截圖

#檢視執行的容器:

#檢視Nginx 容器訪問日誌:

[root@docker-server1 ~]# docker logs nginx-test-port3 #一次檢視

[root@docker-server1 ~]# docker logs -f nginx-test-port3 #持續檢視

 

 

1.5.7:檢視容器已經對映的埠:

[root@docker-server1 ~]# docker port nginx-test-port5

 

 

 

 

1.5.8:自定義容器名稱:

用的不多

[root@docker-server1 ~]# docker run -it --name nginx-test nginx

1.5.9:後臺啟動容器:

-P    隨機對映埠

[root@docker-server1 ~]# docker run -d -P --name nginx-test1 docker.io/nginx

9aaad776850bc06f516a770d42698e3b8f4ccce30d4b142f102ed3cb34399b31

 

1.5.10:建立並進入容器:

-d    後臺執行容器

-t     tty,

-I 標準輸入

[root@docker-server1 ~]# docker run -t -i --name test-centos2 docker.io/centos /bin/bash

[root@a8fb69e71c73 /]# #建立容器後直接進入,執行exit退出後容器關閉

 

[root@docker-server1 ~]# docker run -d --name centos-test1 docker.io/centos

2cbbec43ba939476d798a5e1c454dd62d4d893ee12a09b587556ba6395353152

1.5.11:單次執行:

容器退出後自動刪除:

[root@linux-docker opt]# docker run -it --rm --name nginx-delete-test docker.io/nginx

 

1.5.12:傳遞執行命令:

容器需要有一個前臺執行的程序才能保持容器的執行,通過傳遞執行引數是一種方式,另外也可以在構建映象的時候指定容器啟動時執行的前臺命令。

[root@docker-server1 ~]# docker run -d centos /usr/bin/tail -f '/etc/hosts'

傳遞的命令的優先順序高於映象內建而且是預設的啟動命令

 

1.5.13:容器的啟動和關閉:

[root@docker-server1 ~]# docker stop f821d0cd5a99

[root@docker-server1 ~]# docker start f821d0cd5a99

 

1.5.14:進入到正在執行的容器:

1.5.14.1:使用attach命令:

#使用方式為docker attach 容器名,attach 類似於vnc,操作會在各個容器介面顯示,所有使用此方式進入容器的操作都是同步顯示的且exit後容器將被關閉,且使用exit退出後容器關閉

多個視窗操作是完全同步的

不推薦使用,

 

 

1.5.14.2:使用exec命令:

基於容器的container id

執行單次命令與進入容器,不推薦此方式,雖然exit退出容器還在執行

主要用exec進入容器環境

 

 

1.5.14.3:使用nsenter命令:

基於容器的pid

推薦使用此方式,nsenter命令需要通過PID進入到容器內部,不過可以使用docker inspect獲取到容器的PID:

docker inspect #可以獲取屬性,id

#-f 指定取哪些資訊

 

[root@docker-server1 ~]# yum install util-linux     #安裝nsenter命令

[root@docker-server1 ~]# docker inspect -f "{{.NetworkSettings.IPAddress}}" 91fc190cb538

172.17.0.2

 

[root@docker-server1 ~]# docker inspect -f "{{.State.Pid}}" mydocker #獲取到某個docker容器的PID,可以通過PID進入到容器內

 

[root@docker-server1 ~]# docker inspect -f "{{.State.Pid}}" centos-test3

5892

nsenter

[root@docker-server1 ~]# nsenter -t 5892 -m -u -i -n -p #-t指定容器pid,加多個name空間對映過去

[root@66f511bb15af /]# ls

 

1.5.14.4:指令碼方式:

將nsenter命令寫入到指令碼進行呼叫,如下:

mkdir /root/scripts #將指令碼放入該資料夾

[root@docker-server1 ~]# cat docker-in.sh

#!/bin/bash

docker_in(){

NAME_ID=$1

PID=$(docker inspect -f "{{.State.Pid}}" ${NAME_ID})

nsenter -t ${PID} -m -u -i -n -p

}

docker_in $1

#測試指令碼是否可以正常進入到容器且退出後仍然正常執行:

[root@docker-server1 ~]# chmod a+x docker-in.sh

[root@docker-server1 ~]# ./docker-in.sh centos-test3 #使用id也行

[root@66f511bb15af /]# pwd

/

[root@66f511bb15af /]# exit

logout

[root@docker-server1 ~]# ./docker-in.sh centos-test3

[root@66f511bb15af /]# exit

Logout

 

1.5.15: 檢視容器內部的hosts檔案:

容器id預設會作為容器的主機名

[root@docker-server1 ~]# docker run -i -t --name test-centos3 docker.io/centos /bin/bash

[root@056bb4928b64 /]# cat /etc/hosts

127.0.0.1    localhost

::1    localhost ip6-localhost ip6-loopback

fe00::0    ip6-localnet

ff00::0    ip6-mcastprefix

ff02::1    ip6-allnodes

ff02::2    ip6-allrouters

172.17.0.4    056bb4928b64 #預設會將例項的ID 新增到自己的hosts檔案

 

 

#ping 容器ID:

 

1.5.16:批量關閉正在執行的容器:

[root@docker-server1 ~]# docker stop $(docker ps -a -q) #正常關閉所有執行中的容器

 

1.5.17:批量強制關閉正在執行的容器:

[root@docker-server1 ~]# docker kill $(docker ps -a -q) #強制關閉所有執行中的容器

 

1.5.18:批量刪除已退出容器:

[root@docker-server1 ~]# docker rm -f `docker ps -aq -f status=exited`

 

1.5.19:批量刪除所有容器:

[root@docker-server1 ~]# docker rm -f $(docker ps -a -q)

 

 

 

 

1.5.20:指定容器DNS:

通過域名或者ip地址來訪問其他主機容器,

域名多用,ip地址可能會經常變化

Dns服務,預設採用宿主機的dns 地址

一是將dns地址配置在宿主機

二是將引數配置在docker 啟動腳本里面 –dns=1.1.1.1

 

[root@docker-server1 ~]# docker run -it --rm --dns 223.6.6.6 centos bash     #指定內網dns

 

[root@afeb628bf074 /]# cat /etc/resolv.conf             

#容器內預設使用宿主機dns,可以指定本地dns伺服器地址

nameserver 223.6.6.6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

二:Docker 映象與製作:

Docker 映象有沒有核心?

從映象大小上面來說,一個比較小的映象只有十幾MB,而核心檔案需要一百多兆, 因此映象面是沒有核心的,映象在被啟動為容器後將直接使用宿主機的核心,而映象本身則只提供相應的rootfs,即系統正常執行所必須的使用者空間的檔案系統,比如/dev/,/proc,/bin,/etc等目錄,所以容器當中基本是沒有/boot目錄的,而/boot當中儲存的就是與核心相關的檔案和目錄。

為什麼沒有核心?

由於容器啟動和執行過程中是直接使用了宿主機的核心,所以沒有直接呼叫過物理硬體,所以也不會涉及到硬體驅動,因此也用不上核心和驅動,另外有核心的那是虛擬機器。

2.1:手動製作yum版nginx映象:

Docker製作類似於虛擬機器的映象製作,即按照公司的實際業務務求將需要安裝的軟體、相關配置等基礎環境配置完成,然後將其做成映象,最後再批量從映象批量生產例項,這樣可以極大的簡化相同環境的部署工作,Docker的映象製作分為手動製作和自動製作(基於DockerFile),其中手動製作映象步驟具體如下:

 

2.1.1:下載映象並初始化系統:

基於某個基礎映象之上重新制作,因此需要先有一個基礎映象,本次使用官方提供的centos映象為基礎:

[root@docker-server1 ~]# docker pull centos

[root@docker-server1 ~]# docker run -it docker.io/centos /bin/bash

[root@37220e5c8410 /]# yum install wget -y

[root@37220e5c8410 /]# cd /etc/yum.repos.d/

[root@37220e5c8410 yum.repos.d]# rm -rf ./* #更改yum 源

[root@37220e5c8410 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

[root@37220e5c8410 yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

 

2.1.2:yum安裝並配置nginx:

[root@37220e5c8410 yum.repos.d]# yum install nginx –y #yum安裝nginx

[root@37220e5c8410 yum.repos.d]# yum install -y vim wget pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop #安裝常用命令

 

2.1.3:關閉nginx後臺執行:

關閉nginx後臺執行,將佔用一個終端,nginx worker程序將初始化為pid1的程序

[root@37220e5c8410 yum.repos.d]# vim /etc/nginx/nginx.conf #關閉nginx後臺執行

user nginx;

worker_processes auto;

error_log /var/log/nginx/error.log;

pid /run/nginx.pid;

daemon off; #關閉後臺執行

 

2.1.4:自定義web頁面:

[root@37220e5c8410 yum.repos.d]# vim /usr/share/nginx/html/index.html

#無法儲存,需要刪除該檔案重新建立

[root@37220e5c8410 yum.repos.d]# cat /usr/share/nginx/html/index.html

Docker Yum Nginx #自定義web介面

 

2.1.5:提交為映象:

在宿主機基於容器ID 提交為映象

[root@docker-server1 ~]# docker commit -m "nginx image" f5f8c13d0f9f jack/centos-nginx

sha256:7680544414220f6ff01e58ffc6bd59ff626af5dbbce4914ceb18e20f4ae0276a

 

2.1.6:帶tag的映象提交:

提交的時候標記tag號:

#標記tag號,生產當中比較長用,後期可以根據tag標記啟動不同版本啟動image啟動

[root@docker-server1 ~]# docker commit -m "nginx image" f5f8c13d0f9f jack/centos-nginx:v1

sha256:ab9759679eb586f06e315971d28b88f0cd3e0895d2e162524ee21786b98b24e8

 

 

 

2.1.7:從自己映象啟動容器:

#注意:1.nginx命令要寫絕對路徑(如果沒做軟連結),nginx配置檔案沒加daemon off引數則需要手動加引數

建立軟連結則不用寫全路徑,執行容器的nginx服務

#以下是啟動容器

[root@docker-server1 ~]# docker run -d -p 80:80 --name my-centos-nginx jack/centos-nginx /usr/sbin/nginx

ce4ee8732a0c4c6a10b85f5463396b27ba3ed120b27f2f19670fdff3bf5cdb62

 

#相同版本多次提交問題:

 

2.1.8:訪問測試:

 

 

 

 

2.2:DockerFile製作yum版nginx映象:

DockerFile可以說是一種可以被Docker程式解釋的指令碼,DockerFile是由一條條的命令組成的,每條命令對應linux下面的一條命令,Docker程式將這些DockerFile指令再翻譯成真正的linux命令,其有自己的書寫方式和支援的命令,Docker程式讀取DockerFile並根據指令生成Docker映象,相比手動製作映象的方式,DockerFile更能直觀的展示映象是怎麼產生的,有了DockerFile,當後期有額外的需求時,只要在之前的DockerFile新增或者修改響應的命令即可重新生成新的Docker映象,避免了重複手動製作映象的麻煩,具體如下:

ADD:將宿主機軟體包,檔案拷貝到容器中,會自動解壓tar壓縮包(zip不會),但是COPY不會(常用ADD)

COPY:將宿主機軟體,檔案包拷貝到容器中

 

 

 

2.2.1:下載映象並初始化系統:

[root@docker-server1 ~]# docker pull centos

[root@docker-server1 ~]# docker run -it docker.io/centos /bin/bash

[root@docker-server1 ~]# cd /opt/ #建立目錄環境

[root@docker-server1 opt]# mkdir dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,redhat}} -pv

#目錄結構按照業務型別或系統型別等方式劃分,方便後期映象比較多的時候進行分類。

 

[root@docker-server1 opt]# cd dockerfile/web/nginx/

[root@docker-server1 nginx]# pwd

/opt/dockerfile/web/nginx

下載nginx原始碼包

cd /opt/dockerfile/nginx/

wget http://nginx.org/download/nginx-1.16.1.tar.gz

 

 

 

 

2.2.2:編寫Dockerfile解析:

https://github.com/nginxinc/docker-nginx/blob/master/stable/buster-perl/Dockerfile #書寫參考地址

 

#自動化,非交互制作映象,每一個操作都會記錄到配置檔案當中,

[root@docker-server1 nginx]# vim ./Dockerfile #生成的映象的時候會在執行命令的當前目錄查詢Dockerfile檔案,所以名稱不可寫錯,而且D必須大寫

#My Dockerfile

#"#"為註釋,等於shell指令碼的中#

#除了註釋行之外的第一行,必須是From xxx (xxx是基礎映象)

 

#第一行先定義基礎映象,後面的本地有效的映象名,如果本地沒有會從遠端倉庫下載,第一行很重要

From centos

 

#映象維護者的資訊

#()MAINTAINER Jack.Zhang [email protected])此方法已過時

LABEL maintainer="NGINX Docker Maintainers <[email protected]>"

###########################其他可選引數##################################################

#USER #指定該容器執行時的使用者名稱和UID,後續的RUN命令也會使用這面指定的使用者執行

#WORKDIR /a

#WORKDIR b #指定工作目錄,最終為/a/b

#VOLUME["/dir_1","/dir_2"..]             #設定容器掛載主機目錄

#ENV name jack         #設定容器環境變數,常用於向容器內傳遞使用者密碼等

#########################################################################################

 

#本地先準備好nginx原始碼包

wget http://nginx.org/download/nginx-1.16.1.tar.gz

 

#RUN執行的命令,將編譯安裝nginx的步驟執行一遍

RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

RUN yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop

ADD nginx-1.10.3.tar.gz /usr/local/src/ #自動解壓壓縮包

#儲存退出,命令列執行製作映象命令測試下,執行過一次的製作命令,下次執行會跳過

[root@web02 nginx]# docker build -t nginx:v1 .

 

#編譯nginx

RUN cd /usr/local/src/nginx-1.10.3 && ./configure --prefix=/usr/local/nginx --with-http_sub_module && make && make install

 

再次測試:

[root@web02 nginx]# docker build -t nginx:v2 . #-t 指定製作的映象版本名稱

docker run --rm -it -p 9901:80 nginx:v2

 

#新增nginx配置檔案

scp -rp /apps/nginx/conf/nginx.conf 10.0.0.8:/opt/dockerfile/nginx/ #準備nginx配置檔案

RUN cd /usr/local/nginx/

ADD nginx.conf /usr/local/nginx/conf/nginx.conf #會自動覆蓋nginx.conf

RUN useradd nginx -s /sbin/nologin

RUN ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx

RUN echo "test nginx page" > /usr/local/nginx/html/index.html

EXPOSE 80 443 #向外開放的埠,多個埠用空格做間隔,啟動容器時候-p需要使用此端向外對映,如: -p 8081:80,則80就是這裡的80(可選項)

 

CMD ["nginx"]     #需要在nginx.conf中加上daemon off引數

CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"]

#執行的命令,每個Dockerfile只能有一條,如果有多條則只有最後一條被執行

#如果在從該映象啟動容器的時候也指定了命令,那麼指定的命令會覆蓋Dockerfile構建的映象裡面的CMD命令,即指定的命令優先順序更高,Dockerfile的優先順序較低一些

 

訪問測試:

[root@web02 nginx]# docker run --rm -it -p 9901:80 nginx:v4 #不能加任何引數,不然會替換掉dockfile中的cmd引數

 

 

 

 

 

ENV 環境變數在容器中生效:

 

2.2.3:準備原始碼包與配置檔案:

[root@docker-server1 nginx]# cp /usr/local/nginx/conf/nginx.conf . #配置檔案關閉後臺執行

[root@docker-server1 nginx]# cp /usr/local/src/nginx-1.10.3.tar.gz . #nginx原始碼包

 

2.2.4:執行映象構建:

[root@docker-server1 nginx]# docker build –t jack/nginx-1.10.3:v1 /opt/dockerfile/web/nginx/

 

2.2.5:構建完成:

可以清晰看到各個步驟執行的具體操作

 

 

2.2.6:檢視是否生成本地映象:

 

2.2.7:從映象啟動容器:

[root@docker-server1 nginx]# docker run -d -p 80:80 --name yum-nginx jack/nginx-1.10.3:v1 /usr/sbin/nginx

 

2.2.8:訪問web介面:

2.2.9:編譯過程中使用過的映象:

 

 

 

 

2.2.10: 生產Dockerfile

[root@web02 nginx]# cat Dockerfile

#Docker image for nginx

#

#

 

FROM centos:7.7.1908

LABEL maintainer="zhangshijie <[email protected]>"

ENV password 123456

RUN yum install -y epel-release && yum install -y vim unzip wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop

ADD nginx-1.16.1.tar.gz /usr/local/src

 

RUN cd /usr/local/src/nginx-1.16.1 && ./configure --prefix=/apps/nginx && make && make install && rm -rf nginx-1.16.1

 

ADD static.zip /apps/nginx/html

 

RUN cd /apps/nginx/html && unzip static.zip && rm -rf static.zip

 

ADD nginx.conf /apps/nginx/conf/nginx.conf

 

EXPOSE 80 443

 

CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"]

 

 

 

 

2.3:手動製作編譯版本nginx 映象:

過程為在centos 基礎映象之上手動編譯安裝nginx,然後再提交為映象。

2.3.1:下載映象並初始化系統:

[root@docker-server1 ~]# docker pull centos

[root@docker-server1 ~]# docker run -it docker.io/centos /bin/bash

[root@86a48908bb97 /]# yum install wget -y

[root@86a48908bb97 /]# cd /etc/yum.repos.d/

[root@86a48908bb97 yum.repos.d]# rm -rf ./* #更改yum 源

[root@86a48908bb97 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

[root@86a48908bb97 yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

 

2.3.2:編譯安裝nginx:

[root@86a48908bb97 yum.repos.d]# yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop #安裝基礎包

[root@86a48908bb97 yum.repos.d]# cd /usr/local/src/

[root@86a48908bb97 src]# wet http://nginx.org/download/nginx-1.10.3.tar.gz

[root@86a48908bb97 src]# tar xvf nginx-1.10.3.tar.gz

[root@86a48908bb97 src]# cd nginx-1.10.3

[root@86a48908bb97 nginx-1.10.3]# ./configure --prefix=/usr/local/nginx --with-http_sub_module

[root@86a48908bb97 nginx-1.10.3]# make && make install

[root@86a48908bb97 nginx-1.10.3]# cd /usr/local/nginx/

 

2.3.3:關閉nginx後臺執行:

[root@86a48908bb97 nginx]# vim conf/nginx.conf

user nginx;

worker_processes auto;

daemon off;

[root@86a48908bb97 nginx]# ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx #建立軟連

 

2.3.4:建立使用者及授權:

[root@86a48908bb97 nginx]# useradd nginx -s /sbin/nologin

[root@86a48908bb97 nginx]# chown nginx.nginx /usr/local/nginx/ -R

 

2.3.5:自定義web介面:

[root@86a48908bb97 nginx]# echo "My Nginx Test Page" > /usr/local/nginx/html/index.html

 

2.3.6:提交為映象:

[root@docker-136 ~]# docker commit centos-7 centos7-ssh:v1 #測試

[root@docker-server1 ~]# docker commit -m "test nginx" 86a48908bb97 jack/nginx-test-image

sha256:fce6e69410e58b8e508c7ffd2c5ff91e59a1144847613f691fa5e80bb68efbfa

[root@docker-server1 ~]# docker commit -m "test nginx" 86a48908bb97 jack/nginx-test-image:v1

sha256:474cad22f28b1e6b17898d87f040dc8d1f3882e2f4425c5f21599849a3d3c6a2

 

2.3.:7:從自己的映象啟動容器:

[root@docker-server1 ~]# docker run -d -p 80:80 --name my-centos-nginx jack/nginx-test-image:v1 /usr/sbin/nginx

8042aedec1d6412a79ac226c9289305087fc062b0087955a3a0a609c891e1122

備註: -name是指定容器的名稱,-d是後臺執行,-p是埠對映,jack/nginx-test-image是xx倉庫下的xx映象的xx版本,可以不加版本,不加版本預設是使用latest,最後面的nginx是執行的命令,即映象裡面要執行一個nginx命令,所以才有了前面將/usr/local/nginx/sbin/nginx軟連線到/usr/sbin/nginx,目的就是為了讓系統可以執行此命令。

 

2.3.8:訪問測試:

 

2.3.9:檢視Nginx訪問日誌:

 

2.4:自定義tomcat映象:

多層映象

缺點:上層映象有變化,下層都要重新構建

優點:節省了映象構建時間

 

 

 

自定義tomcat業務映象

基於官方提供的centos 7.2.1511基礎映象構建JDK和tomcat映象,先構建JDK映象,然後再基於JDK映象構建tomcat映象。

 

2.4.1:構建JDK映象:

2.4.1.1:下載基礎映象Centos:

 

2.4.1.2: 構建centos基礎映象

[root@docker-server1 ~]# docker pull centos

編寫Dockerfile:

[root@web02 centos]# cat Dockerfile

#Centos 7.7 base

FROM centos:7.7.1908

 

LABEL maintainer="zhangshijie <[email protected]>"

 

RUN yum install -y epel-release && yum install -y vim unzip wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop

 

RUN groupadd www -g 2020 && useradd www -u 2020 -g www && groupadd nginx -g 2021 && useradd nginx -u 2021 -g nginx

 

 

編寫構建指令碼:

[root@web02 centos]# cat build-command.sh

#!/bin/bash

docker build -t centos-base:7.7.1908 .

 

 

2.4.1.2:執行構建JDK 映象:

https://www.oracle.com/java/technologies/javase-downloads.html #jdk下載地址

#jdk8下載地址

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html#license-lightbox

 

mkdir /opt/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,alpine,debian}} -pv

[root@docker-server1 ~]# cd /opt/dockerfile/web/jdk/

[root@docker-server1 jdk]# vim Dockerfile

#JDK Base Image

FROM centos-7.5-base:latest

 

MAINTAINER zhangshijie "[email protected]"

 

ADD jdk-8u162-linux-x64.tar.gz /usr/local/src/

RUN ln -sv /usr/local/src/jdk1.8.0_162 /usr/local/jdk

ADD profile /etc/profile

#還需要ENV添加當前會話環境變數,su -切換使用者會讀環境變數檔案,則會生效了

 

ENV JAVA_HOME /usr/local/jdk

ENV JRE_HOME $JAVA_HOME/jre

ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/

ENV PATH $PATH:$JAVA_HOME/bin

 

RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone

#修改容器的時區,(預設使用的時區不是shanghai時間)

 

Jdk版本升級:

需要修改dockerfile的add檔案,其他不用修改(注意版本名稱要修改,不然覆蓋了)

 

 

2.4.1.3:上傳JDK壓縮包和profile檔案:

將JDK 壓縮包上傳到Dockerfile當前目錄,然後執行構建:

 

2.4.1.4:執行構建映象:

2.4.1.4.1:通過指令碼構建:

[root@docker-server1 jdk]# cat build-command.sh

#!/bin/bash

docker build -t centos-7.5-jdk:v1 .

 

2.4.1.4.2:執行構建:

 

2.4.1.5:映象構建完成:

 

2.4.1.6:從映象啟動容器:

[root@docker-server1 jdk]# docker run -it jack/ceontos-jdk bash

 

2.4.1.7:將映象上傳到harbor:

[root@docker-server1 jdk]# docker push 192.168.10.205/centos/centos-7.2.1511-jdk1.7.0.79

 

2.4.1.8:映象倉庫驗證:

 

2.4.1.9:從其他docker客戶端下載映象並啟動JDK容器:

#啟動的時候本地沒有映象,會從倉庫下載,然後從映象啟動容器

 

 

2.4.2:從JDK映象構建tomcat 8 Base映象:

2.4.2.1:編輯Dockerfile:

[root@docker-server1 tomcat8-base]# pwd

/opt/dockerfile/system/centos/tomcat8-base

 

[root@docker-server1 tomcat8-base]# cat Dockerfile

#Tomcat Base Image

 

FROM centos-7.5-jdk:v1

 

RUN useradd www -u 2000

 

#ADD del_tomcatlog.sh /root/script

#RUN echo "0 2 * * *    /bin/bash /root/script/del_tomcatlog.sh &> /dev/null" >> /var/spool/cron/root

 

#env settinf

ENV TZ "Asia/Shanghai"

ENV LANG en_US.UTF-8

ENV TERM xterm

ENV TOMCAT_MAJOR_VERSION 8

ENV TOMCAT_MINOR_VERSION 8.0.49

ENV CATALINA_HOME /apps/tomcat

ENV APP_DIR ${CATALINA_HOME}/webapps

 

#tomcat settinf

RUN mkdir /apps

ADD apache-tomcat-8.0.49.tar.gz /apps

RUN ln -sv /apps/apache-tomcat-8.0.49 /apps/tomcat

 

2.4.2.2:上傳tomcat 壓縮包:

http://tomcat.apache.org/ #tomcat官方下載地址

[root@docker-server1 tomcat8-base]# ll apache-tomcat-8.0.49.tar.gz

-rw-r--r-- 1 root root 9413703 Jul 2 10:06 apache-tomcat-8.0.49.tar.gz

 

2.4.2.3:通過指令碼構建tomcat 基礎映象:

[root@docker-server1 tomcat8-base]# cat build-command.sh

#!/bin/bash

docker build -t tomcat-base:v1 .

 

 

 

 

#執行構建:

 

 

2.4.2.4:驗證映象構建完成:

 

2.4.3:構建業務映象1:

建立tomcat-app1和tomcat-app2兩個目錄,代表不同的兩個基於tomcat的業務。

2.4.3.0 準備tomcat配置檔案

#unpackwars(自動解壓war包) ,autodelay(自動部署應用程式需要改成false)

appbase(應用程式目錄)

準備server.xml

修改如下一行

準備log配置檔案

 

2.4.3.1:準備Dockerfile:

[root@docker-server1 tomcat-app1]# pwd

/opt/dockerfile/system/centos/tomcat-app1

 

[root@docker-server1 tomcat-app1]# cat Dockerfile

#Tomcat Web Image

FROM tomcat-base:v1

 

ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh #此啟動指令碼需要加上可執行許可權

ADD myapp/* /apps/tomcat/webapps/myapp/ #應用程式目錄不知道要不要改www許可權

RUN chown www.www /apps/ -R #需要給將tomcat目錄加上www訪問許可權

 

CMD ["/apps/tomcat/bin/run_tomcat.sh"]

EXPOSE 8080 8009

 

2.4.3.2:準備自定義myapp頁面:

[root@docker-server1 tomcat-app1]# mkdir myapp

[root@docker-server1 tomcat-app1]# echo "Tomcat Web Page1" > myapp/index.html

[root@docker-server1 tomcat-app1]# cat myapp/index.html

Tomcat Web Page1

 

2.4.3.3:準備容器啟動執行指令碼:

[root@docker-server1 tomcat-app1]# cat run_tomcat.sh

#!/bin/bash

echo "1.1.1.1 abc.test.com" >> /etc/hosts

echo "nameserver 223.5.5.5" > /etc/resolv.conf

 

su - www -c "/apps/tomcat/bin/catalina.sh start"

#切換到www使用者,-c引數代表執行後面這條命令

su - www -c "tail -f /etc/hosts" #使用tail -f 某個檔案來設定容器的守護程序(不要使用檔案內容不斷變化的日誌檔案)

 

2.4.3.4:準備構建指令碼:

[root@docker-server1 tomcat-app1]# cat build-command.sh

#!/bin/bash

docker build -t tomcat-web:app1 .

 

2.4.3.5:執行構建:

 

2.4.3.6:從映象啟動容器測試:

[root@docker-server1 tomcat-app1]# docker run -it -d -p 8888:8080 tomcat-web:app1

d03fd22cce891a29b590715bde9bd6fc314dd5ae3af178e8f48b215aeb878d9f

 

 

2.4.3.7:訪問測試:

 

2.4.4.:構建業務映象2:

2.4.4.1:準備Dockerfile:

[root@docker-server1 tomcat-app2]# pwd

/opt/dockerfile/system/centos/tomcat-app2

 

[root@docker-server1 tomcat-app2]# cat Dockerfile

#Tomcat Web2 Image

FROM tomcat-base:v1

 

ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh

ADD myapp/* /apps/tomcat/webapps/myapp/

RUN chown www.www /apps/ -R

 

CMD ["/apps/tomcat/bin/run_tomcat.sh"]

EXPOSE 8080 8009

 

2.4.4.2:準備自定義頁面:

[root@docker-server1 tomcat-app2]# mkdir myapp

[root@docker-server1 tomcat-app2]# echo "Tomcat Web Page2" > myapp/index.html

[root@docker-server1 tomcat-app2]# cat myapp/index.html

Tomcat Web Page2

 

2.4.4.3:準備容器啟動指令碼:

[root@docker-server1 tomcat-app2]# cat run_tomcat.sh

#!/bin/bash

 

echo "1.1.1.1 abc.test.com" >> /etc/hosts

echo "nameserver 223.5.5.5" > /etc/resolv.conf

 

su - www -c "/apps/tomcat/bin/catalina.sh start"

su - www -c "tail -f /etc/hosts"

 

2.4.4.4:準備構建指令碼:

[root@docker-server1 tomcat-app2]# cat build-command.sh

#!/bin/bash

docker build -t tomcat-web:app2 .

 

2.4.4.5:執行構建:

 

2.4.4.6:從映象啟動容器:

[root@docker-server1 tomcat-app2]# docker run -it -d -p 8889:8080 tomcat-web:app2

4846126780f6bdb374f7d4a7a91a16c4af211a9a01b11db629751a597dc55e08

 

2.4.4.7:訪問測試:

 

2.5: 基於alpine構建nginx映象

Centos,ubuntu,alpine,

映象大小不同

命令不同

2.5.1: alpine系統使用

alpine沒有bash,只有sh

alpine裝包命令apk

sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories #修改安裝源

http://mirrors.aliyun.com/alpine/v3.12/main/x86_64/ #軟體安裝包下載地址

apk add vim #安裝vim

 

 

2.5.2: 編寫dockefile

[root@web02 nginx-alpine]# cat Dockerfile

FROM alpine

LABEL zhangshijie [email protected]

 

#5.更新Alpine的軟體源為阿里雲,因為從預設官源拉取實在太慢了

RUN echo http://mirrors.aliyun.com/alpine/v3.10/main/ > /etc/apk/repositories && \

echo http://mirrors.aliyun.com/alpine/v3.10/community/ >> /etc/apk/repositories

 

RUN apk update && apk add iotop gcc libgcc libc-dev libcurl libc-utils pcre-dev zlib-dev libnfs make pcre pcre2 zip unzip net-tools pstree wget libevent libevent-dev iproute2

ADD nginx-1.16.1.tar.gz /usr/local/src

 

#新增nginx執行的使用者,對應要在nginx.conf指定

RUN addgroup -g 2019 -S www && adduser -s /sbin/nologin -S -D -u 2019 -G www www && addgroup -g 2020 -S nginx && adduser -s /sbin/nologin -S -D -u 2020 -G nginx nginx

 

RUN cd /usr/local/src/nginx-1.16.1 && ./configure --prefix=/apps/nginx && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/sbin/ && rm -rf nginx-1.16.1

 

ADD nginx.conf /apps/nginx/conf/nginx.conf

ADD static.zip /apps/nginx/html/

RUN cd /apps/nginx/html && unzip static.zip && rm -rf static.zip && chown nginx.nginx /apps -R

 

CMD ["/usr/sbin/nginx"]

2.5.3: nginx後臺執行的幾種情況

命令列上加後臺執行引數

[root@web02 dockerfile]# docker run --rm -it -p80:80 nginx:1.16.1-alpine nginx "-g daemon off;"

 

Nginx.conf檔案中加nginx後臺執行

命令列上加-d引數後臺執行

 

RUN apk update && apk add iotop gcc libgcc libc-dev libcurl libc-utils pcre-dev zlib-dev libnfs make pcre pcre2 zip unzip net-tools pstree wget libevent libevent-dev iproute2

ADD nginx-1.16.1.tar.gz /opt/

 

 

 

 

2.5: 基於ubuntu構建nginx映象

Debian 的軟體源配置檔案是 /etc/apt/sources.list 

Ubuntu阿里源配置修改

[root@web02 nginx-ubuntu]# cat sources.list

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

 

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

 

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

 

deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

 

deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

 

 

 

2.5.1: 編寫dockerfile

準備阿里源配置檔案

https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.3e221b11HA75u0 #配置地址

[root@web02 nginx-ubuntu]# cat Dockerfile

FROM ubuntu:18.04

 

LABEL zhangshijie [email protected]

 

ADD sources.list /etc/apt/sources.list

 

RUN apt update && apt install -y iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server iotop unzip zip make

 

ADD nginx-1.16.1.tar.gz /usr/local/src

 

RUN cd /usr/local/src/nginx-1.16.1 && ./configure --prefix=/apps/nginx && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/sbin/ && rm -rf /usr/local/src/nginx-1.16.1 && rm -rf /usr/local/src/nginx-1.16.1.tar.gz

 

ADD nginx.conf /apps/nginx/conf/nginx.conf

ADD static.zip /apps/nginx/html

 

RUN cd /apps/nginx/html && unzip static.zip && rm -rf static.zip

 

RUN groupadd www -g 2020 && useradd www -u 2020 -g www && groupadd nginx -g 2021 && useradd nginx -u 2021 -g nginx && chown -R nginx.nginx /apps/

 

EXPOSE 80 443

 

CMD ["/usr/sbin/nginx"]

 

 

 

 

 

 

 

 

 

 

 

 

 

2.5:構建haproxy映象:

 

Haproxy下載

https://src.fedoraproject.org/repo/pkgs/haproxy/

 

準備容器呼叫指令碼,==守護程序+服務開啟:

[root@web02 haproxy-centos]# cat run_haproxy.sh

#!/bin/bash

/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg

tail -f /etc/hosts

 

[root@web02 haproxy-centos]# chmod +x run_haproxy.sh

 

2.5.1:準備Dockerfile:

[root@docker-server1 haproxy]# pwd

/opt/dockerfile/system/centos/haproxy

 

[root@docker-server1 haproxy]# cat Dockerfile

#Haproxy Base Image

FROM centos-7.5-base:latest

 

MAINTAINER zhangshijie "[email protected]"

 

RUN yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate -y

ADD haproxy-1.8.12.tar.gz /usr/local/src/

RUN cd /usr/local/src/haproxy-1.8.12 && make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy

&& make install PREFIX=/usr/local/haproxy && cp haproxy /usr/sbin/ && mkdir /usr/local/haproxy/run

ADD haproxy.cfg /etc/haproxy/

 

ADD run_haproxy.sh /usr/bin

EXPOSE 80 9999

CMD ["/usr/bin/run_haproxy.sh"]

 

 

 

2.5.2:準備haproxy原始碼檔案:

[root@docker-server1 haproxy]# ll haproxy-1.8.12.tar.gz

-rw-r--r-- 1 root root 2059925 Jun 30 23:32 haproxy-1.8.12.tar.gz

 

2.5.3:準備haproxy配置檔案:

[root@docker-server1 haproxy]# cat>haproxy.cfg <<EOF

global

chroot /usr/local/haproxy

#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin

uid 99

gid 99

daemon

nbproc 1

pidfile /usr/local/haproxy/run/haproxy.pid

log 127.0.0.1 local3 info

 

defaults

option http-keep-alive

option forwardfor

mode http

timeout connect 300000ms

timeout client 300000ms

timeout server 300000ms

 

listen stats

mode http

bind 0.0.0.0:9999

stats enable

log global

stats uri /haproxy-status

stats auth haadmin:123456 #haproxy登入賬號密碼

 

listen web_port

bind 0.0.0.0:80

mode http

log global

balance roundrobin

server web1 10.0.0.7:8080 check inter 3000 fall 2 rise 5

server web2 10.0.0.8:8080 check inter 3000 fall 2 rise 5

EOF

 

2.5.4:準備構建指令碼:

[root@web02 haproxy-centos]# cat build-command.sh

#!/bin/bash

docker build -t haproxy:2.0.13-centos .

 

2.5.5:執行構建haproxy映象:

 

2.5.6:從映象啟動容器:

[root@web02 haproxy-centos]# docker run -it -d -p80:80 -p9999:9999 haproxy:2.0.13-centos0b9bfdf14beee6008b259efc2d9d4fe74edee957af67da055f1dd18c5a44b4fb

 

2.5.7:web訪問驗證:

 

2.5.8:訪問haproxy控制端:

Web02伺服器如果正常顯示綠色

 

訪問測試1:直接訪問開啟的tomcat

10.0.0.8伺服器開啟8080埠容器,haproxy檢視監聽狀態

 

訪問測試2:直接訪問haproxy地址

 

2.6.6 : 容器架構

 

 

 

 

2.6:本地映象上傳至官方docker 倉庫:

#將自制的映象上傳至docker倉庫;https://hub.docker.com/

2.6.1:準備賬戶:

登入到docker hub建立官網建立賬戶,登入後點擊settings完善賬戶資訊:

2.6.2:填寫賬戶基本資訊:

 

2.6.3:在虛擬機器使用自己的賬號登入:

方法1:

[root@linux-docker ~]# docker login https://hub.docker.com/ #succeed代表登入成功

 

方法2:
docker login docker.io #登入官方倉庫

 

 

 

 

 

 

2.6.4:檢視認證資訊:

#登入成功之後會在當前目錄生成一個隱藏檔案用於儲存登入認證資訊

 

2.6.5:給映象做tag並開始上傳:

[root@linux-docker ~]# docker images #檢視映象ID

#為映象做標記

[root@linux-docker ~]# docker tag 678e2f074b0d docker.io/zhangshijie/centos-nginx

或者

[root@linux-docker ~]# docker tag alpine:latest index.docker.io/zhangshijie/linux39:20200219

#/zhangshijie/為倉庫名稱

 

#上傳至倉庫

[root@linux-docker ~]# docker login #預設即登入到docker 官方網站

[root@linux-docker ~]# docker push docker.io/zhangshijie/linux39:20200219

#上傳過程中

 

 

 

2.6.6:上傳完成

 

2.6.7:到docker官網驗證:

 

2.6.8:更換到其他docker伺服器下載映象:

docker pull zhangshijie/alpine-test

 

2.6.9:從映象啟動一個容器:

 

docker run -it docker.io/zhangshijie/alpine-test sh

 

 

2.7: 本地映象上傳到阿里雲

 

2.7.1: 阿里雲容器使用

建立新的命令空間

 

阿里雲容器登入

#根據註冊後提示登入

docker login [email protected] regisry.cn-hangzhou.aliyuncs.com

docker login docker.io #這句貌似是官方映象登入

將本地映象打阿里雲標籤上傳

拉取上傳的阿里雲容器

 

2.7.2: 將映象推送到registry

 

 

 

2.7.2: 阿里雲驗證映象

 

 

 

三:Docker 資料管理:

3.1:資料型別:

Docker的映象是分層設計的,底層是隻讀的,通過映象啟動的容器添加了一層可讀寫的檔案系統,使用者寫入的資料都儲存在這一層當中,如果要將寫入的資料永久生效,需要將其提交為一個映象然後通過這個映象在啟動例項,然後就會給這個啟動的例項新增一層可讀寫的檔案系統,目前Docker的資料型別分為兩種,一是資料卷,二是資料容器,資料卷類似於掛載的一塊磁碟,資料容器是將資料儲存在一個容器上

3.1.1:什麼是資料卷(data volume):

資料卷實際上就是宿主機上的目錄或者是檔案,可以被直接mount到容器當中使用。

3.1.1.1:建立APP目錄並生成web頁面:

[root@docker-server1 ~]# mkdir testapp

[root@docker-server1 ~]# echo "Test App Page" > testapp/index.html

[root@docker-server1 ~]# cat testapp/index.html

Test App Page

 

 

3.1.1.2:啟動容器並驗證資料:

#注意使用-v引數,將宿主機目錄對映到容器內部,web2的ro標示在容器內對該目錄只讀,預設是可讀寫的:

[root@docker-server1 ~]# docker run -d --name web1 -v /root/testapp/:/apps/tomcat/webapps/testapp -p 8811:8080 tomcat-web:app1

d982cbb2524680f20f6edef7347abf5fbc1ac587b6de1a37b99ddc91fc26be76

[root@docker-server1 ~]# docker run -d --name web2 -v /root/testapp/:/apps/tomcat/webapps/testapp:ro -p 8812:8080 tomcat-web:app2

46698f391a1c2ebf6e4f959ee0f9277ff2a301afb4b5ec3b61dbdd5717f33364

 

 

3.1.1.3:進入到容器內測試寫入資料:

 

3.1.1.4:宿主機驗證:

 

 

3.1.1.5:web介面訪問:

 

3.1.1.6:在宿主機修改資料:

[root@docker-server1 ~]# echo "1111" >> testapp/index.html

[root@docker-server1 ~]# cat testapp/index.html

Test App Page

docker

1111

 

3.1.1.7:web端訪問驗證資料:

 

 

3.1.1.8:刪除容器:

#建立容器的時候指定引數-v,可以刪除/var/lib/docker/containers/的容器資料目錄,預設不刪除,但是不能刪除資料卷的內容,如下:

 

 

3.1.1.9:驗證宿主機的資料:

 

3.1.1.10:資料卷的特點及使用:

1、資料卷是目錄或者檔案,並且可以在多個容器之間共同使用。

2、對資料卷更改資料容器裡面會立即更新。

3、資料卷的資料可以持久儲存,即使刪除使用使用該容器卷的容器也不影響。

4、在容器裡面的寫入資料不會影響到映象本身。

 

 

3.1.2:檔案掛載:

檔案掛載用於很少更改檔案內容的場景,比如nginx 的配置檔案、tomcat的配置檔案等。

3.1.2.1:建立容器並掛載檔案:

[root@docker-server1 ~]# ll testapp/catalina.sh

-rwxr-xr-x 1 root root 23705 Jul 3 14:06 testapp/catalina.sh

 

#自定義JAVA 選項:

JAVA_OPTS="-server -Xms4g -Xmx4g -Xss512k -Xmn1g -XX:CMSInitiatingOccupancyFraction=65 -XX:+UseFastAccessorMethods -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=10 -XX:NewSize=2048M -XX:MaxNewSize=2048M -XX:NewRatio=2 -XX:PermSize=128m -XX:MaxPermSize=512m -XX:CMSFullGCsBeforeCompaction=5 -XX:+ExplicitGCInvokesConcurrent -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods"

 

 

[root@docker-server1 ~]# docker run -d --name web1 -v /root/bin/catalina.sh:/apps/tomcat/bin/catalina.sh:ro -p 8811:8080 tomcat-web:app1

ef0de0f5628f2137eca7dfb69fe86947029586beb517cd6077086f8feda2c40d

 

3.1.2.2:驗證引數生效:

 

3.1.2.3:進入容器測試檔案讀寫:

 

 

3.1.2.3:如何一次掛載多個目錄:

多個目錄要位於不同的目錄下

[root@docker-server1 ~]# docker run -d --name web1 -v /root/bin/catalina.sh:/apps/tomcat/bin/catalina.sh:ro -v /root/testapp:/apps/tomcat/webapps/testapp -p 8811:8080 t

omcat-web:app19c7a503888f07a880db7a1ffe39044176a3bf0a32286c28f1aee9c3bd9ca567e

[root@docker-server1 ~]#

[root@docker-server1 ~]# docker run -d --name web2 -v /root/bin/catalina.sh:/apps/tomcat/bin/catalina.sh:ro -v /root/testapp:/apps/tomcat/webapps/testapp -p 8812:8080

tomcat-web:app2f63effc2a4e9b4869f1c8e8267dd1717cf846e6d672b68f474bf4b569aed2cfb

 

 

3.1.2.4:資料卷使用場景:

1、日誌輸出

2、靜態web頁面

3、應用配置檔案

4、多容器間目錄或檔案共享

 

3.1.3:資料卷容器:

資料卷容器最大的功能是可以讓資料在多個docker容器之間共享,即可以讓B容器訪問A容器的內容,而容器C也可以訪問A容器的內容,即先要建立一個後臺執行的容器作為Server,用於卷提供,這個卷可以為其他容器提供資料儲存服務,其他使用此卷的容器作為client端:

 

3.1.3.1:啟動一個卷容器Server:

先啟動一個容器,並掛載宿主機的資料目錄:

[root@docker-server1 ~]# docker run -d --name volume-docker -v /root/bin/catalina.sh:/apps/tomcat/bin/catalina.sh:ro -v /root/testapp:/apps/tomcat/webapps/testapp tomcat-web:app2

aa56f415c4d27bdd68f5f88d5dd2e8ac499177a606cdd1dccc09079b59ee9a72

 

 

3.1.3.2:啟動端容器Client:

[root@docker-server1 ~]# docker run -d --name web1 -p 8801:8080 --volumes-from volume-docker tomcat-web:app1

241e9559f2bc7a8453a0917c1be25d6649c30bf2d6ce929fd7e03b0dc4215543

[root@docker-server1 ~]#

[root@docker-server1 ~]# docker run -d --name web2 -p 8802:8080 --volumes-from volume-docker tomcat-web:app2

82b728184355dfb9f9be6dfad51ebfa9d3429ba1133e708cb56273fb1a9b9794

 

3.1.3.3:進入容器測試讀寫:

讀寫許可權依賴於源資料卷Server容器

 

 

3.1.3.4:關閉卷容器Server測試能否啟動新容器:

[root@docker-server1 ~]# docker stop volume-docker

volume-docker

 

[root@docker-server1 ~]# docker run -d --name web3 -p 8803:8080 --volumes-from volume-docker tomcat-web:app2

 

#可以建立新容器

 

 

3.1.3.6:測試刪除源卷容器Server建立容器:

[root@docker-server1 ~]# docker rm -fv volume-docker

volume-docker

[root@docker-server1 ~]# docker run -d --name web4 -p 8804:8080 --volumes-from volume-docker tomcat-web:app2

docker: Error response from daemon: No such container: volume-docker.

See 'docker run --help'.

 

3.1.3.7:測試之前的容器是否正常:

已經執行的容器不受任何影響

 

3.1.3.8:重新建立容器卷Server:

[root@docker-server1 ~]# docker run -d --name volume-docker -v /root/bin/catalina.sh:/apps/tomcat/bin/catalina.sh:ro -v /root/testapp:/apps/tomcat/webapps/testapp tomcat

-web:app2f0b578c60ad3a2550ad4ca937a8abd778e9dceab3f5af71739ef1e72051f2626

 

[root@docker-server1 ~]# docker run -d --name web4 -p 8804:8080 --volumes-from volume-docker tomcat-web:app2

f9e118640f7baeb3bf6619af3f145955194594ce99eb6d7edfa93f5d5d652439

#在當前環境下,即使把提供卷的容器Server刪除,已經執行的容器Client依然可以使用掛載的卷,因為容器是通過掛載訪問資料的,但是無法建立新的卷容器客戶端,但是再把卷容器Server建立後即可正常建立卷容器Client,此方式可以用於線上資料庫、共享資料目錄等環境,因為即使資料卷容器被刪除了,其他已經執行的容器依然可以掛載使用

 

#資料卷容器可以作為共享的方式為其他容器提供檔案共享,類似於NFS共享,可以在生產中啟動一個例項掛載本地的目錄,然後其他的容器分別掛載此容器的目錄,即可保證各容器之間的資料一致性。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

四:網路部分:

主要介紹docker 網路相關知識。

4.1:docker結合負載實現網站高可用:

4.1.1:整體規劃圖:

下圖為一個小型的網路架構圖,其中nginx 使用docker 執行。

 

4.1.2:安裝並配置keepalived:

4.1.2.1: Server1 安裝並配置:

[root@docker-server1 ~]# yum install keepalived –y

[root@docker-server1 ~]# cat /etc/keepalived/keepalived.conf

vrrp_instance MAKE_VIP_INT {

state MASTER

interface eth0

virtual_router_id 1

priority 100

advert_int 1

unicast_src_ip 192.168.10.205

unicast_peer {

192.168.10.206

}

 

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.10.100/24 dev eth0 label eth0:1

}

}

[root@docker-server1~]# systemctl restart keepalived && systemctl enable keepalived

 

4.1.2.2:Server2 安裝並配置:

[root@docker-server2 ~]# yum install keepalived –y

[root@docker-server2 ~]# cat /etc/keepalived/keepalived.conf

vrrp_instance MAKE_VIP_INT {

state BACKUP

interface eth0

virtual_router_id 1

priority 50

advert_int 1

unicast_src_ip 192.168.10.206

unicast_peer {

192.168.10.205

}

 

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.10.100/24 dev eth0 label eth0:1

}

}

[root@docker-server2 ~]# systemctl restart keepalived && systemctl enable keepalived

 

4.1.3:安裝並配置haproxy:

4.1.3.1.:各伺服器配置核心引數:

[root@docker-server1 ~]# sysctl -w net.ipv4.ip_nonlocal_bind=1

[root@docker-server2 ~]# sysctl -w net.ipv4.ip_nonlocal_bind=1

4.1.3.2:Server1安裝並配置haproxy:

[root@docker-server1 ~]# yum install haproxy –y

[root@docker-server1 ~]# cat /etc/haproxy/haproxy.cfg

global

maxconn 100000

uid 99

gid 99

daemon

nbproc 1

log 127.0.0.1 local0 info

 

defaults

option http-keep-alive

#option forwardfor

maxconn 100000

mode tcp

timeout connect 500000ms

timeout client 500000ms

timeout server 500000ms

 

listen stats

mode http

bind 0.0.0.0:9999

stats enable

log global

stats uri /haproxy-status

stats auth haadmin:q1w2e3r4ys

 

#================================================================

frontend docker_nginx_web

bind 192.168.10.100:80

mode http

default_backend docker_nginx_hosts

 

backend docker_nginx_hosts

mode http

#balance source

balance roundrobin

server 192.168.10.205 192.168.10.205:81 check inter 2000 fall 3 rise 5

server 192.168.10.206 192.168.10.206:81 check inter 2000 fall 3 rise 5

 

4.1.3.3:Server2安裝並配置haproxy:

[root@docker-server2 ~]# yum install haproxy –y

[root@docker-server2 ~]# cat /etc/haproxy/haproxy.cfg

global

maxconn 100000

uid 99

gid 99

daemon

nbproc 1

log 127.0.0.1 local0 info

 

defaults

option http-keep-alive

#option forwardfor

maxconn 100000

mode tcp

timeout connect 500000ms

timeout client 500000ms

timeout server 500000ms

 

listen stats

mode http

bind 0.0.0.0:9999

stats enable

log global

stats uri /haproxy-status

stats auth haadmin:q1w2e3r4ys

 

#================================================================

frontend docker_nginx_web

bind 192.168.10.100:80

mode http

default_backend docker_nginx_hosts

 

backend docker_nginx_hosts

mode http

#balance source

balance roundrobin

server 192.168.10.205 192.168.10.205:81 check inter 2000 fall 3 rise 5

server 192.168.10.206 192.168.10.206:81 check inter 2000 fall 3 rise 5

 

4.1.3.4:各伺服器別分啟動haproxy:

[root@docker-server1 ~]# systemctl enable haproxy

Created symlink from /etc/systemd/system/multi-user.target.wants/haproxy.service to /usr/lib/systemd/system/haproxy.service.

[root@docker-server1 ~]# systemctl restart haproxy

 

[root@docker-server2 ~]# systemctl enable haproxy

Created symlink from /etc/systemd/system/multi-user.target.wants/haproxy.service to /usr/lib/systemd/system/haproxy.service.

[root@docker-server2 ~]# systemctl restart haproxy

 

4.1.4:伺服器啟動nginx容器並驗證:

4.1.4.1:Server1 啟動Nginx 容器:

從本地Nginx 映象啟動一個容器,並指定埠,預設協議是tcp方式

[root@docker-server1 ~]# docker rm -f `docker ps -a -q` #先刪除之前所有的容器

[root@docker-server1 ~]# docker run --name nginx-web1 -d -p 81:80 jack/nginx-1.10.3:v1 nginx

5410e4042f731d2abe100519269f9241a7db2b3a188c6747b28423b5a584d020

4.1.4.2:驗證埠:

4.1.4.3:驗證web訪問:

 

4.1.4.3:Server2 啟動nginx 容器:

[root@docker-server2 ~]# docker run --name nginx-web1 -d -p 81:80 jack/nginx-1.10.3:v1 nginx

84f2376242e38d7c8ba7fabf3134ac0610ab26358de0100b151df6a231a2b56a

 

4.1.4.4:驗證埠:

 

4.1.4.5:驗證web訪問:

 

4.1.4.6:訪問VIP:

 

4.1.4.7:Server1 haproxy狀態頁面:

 

4.1.4.8:Server2 haproxy狀態頁面:

 

 

日誌可以在nginx 裡面通過syslog傳遞給elk收集

 

指定IP、協議和埠:

[root@linux-docker ~]# docker run --name nginx-web -d -p 192.168.10.22:80:80/tcp jack/centos-nginx nginx

 

[root@linux-docker ~]# docker run --name nginx-web-udp -d -p 192.168.10.22:54:53/udp jack/centos-nginx nginx

 

4.2:容器之間的互聯:

4.2.1:通過容器名稱互聯:

即在同一個宿主機上的容器之間可以通過自定義的容器名稱相互訪問,比如一個業務前端靜態頁面是使用nginx,動態頁面使用的是tomcat,由於容器在啟動的時候其內部IP地址是DHCP 隨機分配的,所以如果通過內部訪問的話,自定義名稱是相對比較固定的,因此比較適用於此場景。

 

#此方式最少需要兩個容器之間操作:

#

4.2.1.1:先建立第一個容器,後續會使用到這個容器的名稱:

[root@docker-server1 ~]# docker run --name nginx-1 -d -p 8801:80 jack/nginx-1.10.3:v1 nginx

c045c82e85bd620eb9444275b135634a9248760e2061505a1c8b4167e9b24b3d

 

4.2.1.2:檢視當前hosts檔案內容:

[root@c045c82e85bd /]# cat /etc/hosts

127.0.0.1    localhost

::1    localhost ip6-localhost ip6-loopback

fe00::0    ip6-localnet

ff00::0    ip6-mcastprefix

ff02::1    ip6-allnodes

ff02::2    ip6-allrouters

172.17.0.2    c045c82e85bd

 

4.2.1.3:建立第二個容器:

[root@docker-server1 ~]# docker run -d --name nginx-2 --link nginx-1 -p 8802:80 jack/centos-nginx nginx

23813883ed977d4cc1e50355adaf37564832fc90b4b8b307866c1c99c8256c57

 

4.2.1.4:檢視第二個容器的hosts檔案內容:

[root@23813883ed97 /]# cat /etc/hosts

127.0.0.1    localhost

::1    localhost ip6-localhost ip6-loopback

fe00::0    ip6-localnet

ff00::0    ip6-mcastprefix

ff02::1    ip6-allnodes

ff02::2    ip6-allrouters

172.17.0.2 nginx-1 c045c82e85bd #第一個容器的名稱和ID,只會新增到本地不會新增到對方

172.17.0.3    23813883ed97

 

4.2.1.5:檢測通訊:

 

4.2.2:通過自定義容器別名互聯:

上一步驟中,自定義的容器名稱可能後期會發生變化,那麼一旦名稱發生變化,程式之間也要隨之發生變化,比如程式通過容器名稱進行服務呼叫,但是容器名稱發生變化之後再使用之前的名稱肯定是無法成功呼叫,每次都進行更改的話又比較麻煩,因此可以使用自定義別名的方式解決,即容器名稱可以隨意更,只要不更改別名即可,具體如下:

命令格式:

docker run -d --name 新容器名稱 --link 目標容器名稱:自定義的名稱 -p 本地埠:容器埠 映象名稱 shell命令

4.2.2.1:啟動第三個容器:

[root@docker-server1 ~]# docker run -d --name nginx-3 --link nginx-1:custom_vm_name -p 8803:80 jack/centos-nginx /usr/sbin/nginx

2ed3016f90fd735c66ae79e039481c1576dd63f67a7861358f2825b234806b0c

 

4.2.2.2:檢視當前容器的hosts檔案:

[root@docker-server1 ~]# ./docker-in.sh nginx-3

[root@2ed3016f90fd /]# cat /etc/hosts

127.0.0.1    localhost

::1    localhost ip6-localhost ip6-loopback

fe00::0    ip6-localnet

ff00::0    ip6-mcastprefix

ff02::1    ip6-allnodes

ff02::2    ip6-allrouters

172.17.0.2    custom_vm_name c045c82e85bd nginx-1

172.17.0.4    2ed3016f90fd

 

4.2.2.3:檢查自定義別名通訊:

 

 

 

#檢視當前docke的網絡卡資訊:

[root@linux-docker ~]# docker network list

NETWORK ID NAME DRIVER SCOPE

b34d891b24aa bridge bridge local #橋接,使用自定義IP

cf400b2de47a host host local #不獲取IP直接使用物理機IP,並監聽物理機IP監聽埠

697beb7f9a6b none null local #

 

#host網路使用方式

[root@linux-docker ~]# docker run -it -d --name nginx-host-test --net=host jack/centos-nginx nginx

#驗證埠

#web訪問驗證:

4.2.3:通過網路誇宿主機互聯:

同一個宿主機之間的各容器之間是可以直接通訊的,但是如果訪問到另外一臺宿主機的容器呢?

4.2.3.1:docker網路型別:

Docker 的網路有四種類型,下面將介紹每一種型別的具體工作方式:

Bridge模式,使用引數 –net=bridge 指定,不指定預設就是bridge模式。

4.2.3.1.1:Host 模式:

Host 模式,使用引數 –net=host 指定。

啟動的容器如果指定了使用host模式,那麼新建立的容器不會建立自己的虛擬網絡卡,而是直接使用宿主機的網絡卡和IP地址,因此在容器裡面檢視到的IP資訊就是宿主機的資訊,訪問容器的時候直接使用宿主機IP+容器埠即可,不過容器的其他資源們必須檔案系統、系統程序等還是和宿主機保持隔離。

此模式的網路效能最高,但是各容器之間埠不能相同,適用於執行容器埠比較固定的業務。

為避免埠衝突,先刪除所有的容器:

先確認宿主機埠沒有佔用80埠:

 

#啟動一個新容器,並指定網路模式為host

[root@docker-server1 ~]# docker run -d --name net_host --net=host jack/centos-nginx nginx

abdc7c9c1e984278bc9344393edf493c3cb09929afb83e34bcd21179d226b61a

 

#驗證網路資訊:

#訪問宿主機驗證:

 

4.2.3.1.2:none模式:

None模式,使用引數 –net=none 指定

在使用none 模式後,Docker 容器不會進行任何網路配置,其沒有網絡卡、沒有IP也沒有路由,因此預設無法與外界通訊,需要手動新增網絡卡配置IP等,所以極少使用,

命令使用方式:

[root@docker-server1 ~]# docker run -d --name net_none --net=none jack/centos-nginx nginx

143ce15733c1961bf6e23989cbd7d76fc9f9297dc7f11e610ae30c418c21297c

 

 

4.2.3.1.3:Container模式:

Container模式,使用引數 –net=container:名稱或ID 指定。

使用此模式建立的容器需指定和一個已經存在的容器共享一個網路,而不是和宿主機共享網,新建立的容器不會建立自己的網絡卡也不會配置自己的IP,而是和一個已經存在的被指定的容器東西IP和埠範圍,因此這個容器的埠不能和被指定的埠衝突,除了網路之外的檔案系統、程序資訊等仍然保持 相互隔離,兩個容器的程序可以通過lo網絡卡社保通訊。

[root@docker-server1 ~]# docker run -d --name nginx-web1 jack/nginx-1.10.3:v1 nginx

95d22a5d36c18544af47373cc227a1679f239e790f86907d310d13ef4eb85d5e

[root@docker-server1 ~]# docker run -it --name net_container --net=container:nginx-web1 jack/centos-nginx bash #直接使用對方的網路,較少使用

 

 

4.2.3.1.4:bridge模式:

docker的預設模式即不指定任何模式就是bridge模式,也是使用比較多的模式,此模式建立的容器會為每一個容器分配自己的網路 IP等資訊,並將容器連線到一個虛擬網橋與外界通訊。

[root@docker-server1 ~]# docker run -d --name net_bridge jack/nginx-1.10.3:v1 /usr/sbin/nginx

58e251cdb17fc309ee364c332549b434f4d51019b793702e81b5edb1ff701a7c

 

4.2.3.2:docker誇主機互聯之簡單實現:

誇主機互聯是說A宿主機的容器可以訪問B主機上的容器,但是前提是保證各宿主機之間的網路是可以相互通訊的,然後各容器才可以通過宿主機訪問到對方的容器,實現原理是在宿主機做一個網路路由就可以實現A宿主機的容器訪問B主機的容器的目的,複雜的網路或者大型的網路可以使用google開源的k8s進行互聯。

4.2.3.2.1:修改各宿主機網段:

Docker的預設網段是172.17.0.x/24,而且每個宿主機都是一樣的,因此要做路由的前提就是各個主機的網路不能一致,具體如下:

問避免影響,先在各伺服器刪除之前穿件的所有容器。

# docker rm -f `docker ps -a -q`

4.2.3.2.2:伺服器A更改網段:

[root@linux-docker1 ~]# vim /usr/lib/systemd/system/docker.service

18 ExecStart=/usr/bin/dockerd-current --bip=172.16.10.1/24 \

 

4.2.3.2.3:重啟docker服務並驗證網絡卡:

[root@linux-docker1 ~]# systemctl daemon-reload

[root@linux-docker1 ~]# systemctl restart docker

驗證網絡卡:

 

4.2.3.2.4:伺服器B更改網段:

[root@linux-docker2 ~]# vim /usr/lib/systemd/system/docker.service

18 ExecStart=/usr/bin/dockerd-current --bip=172.16.20.1/24 \

 

[root@linux-docker2 ~]# systemctl daemon-reload

[root@linux-docker2 ~]# systemctl restart docker

 

4.2.3.2.5:驗證網絡卡:

 

4.2.3.3:在兩個宿主機分別啟動一個例項:

#Server1:

[root@docker-server1 ~]# docker run -d --name test-net-vm jack/nginx-1.10.3:v1 nginx

5d625a868718656737d452d6e57cd23a8a9a1cc9d2e8f76057f1977da2b52a60

 

#Server2:

[root@docker-server2 ~]# docker run -d --name test-net-vm jack/nginx-1.10.3:v1 nginx

ce8fbe4c1d6b5515136ac280f87e6c03884daa35996e996f124ac7056f609e0c

 

4.2.3.4:新增靜態路由:

在各宿主機新增靜態路由,閘道器指向對方的IP:

3.2.3.4.1: Server1 新增靜態路由:

[root@docker-server1 ~]# iptables -A FORWARD -s 192.168.10.0/24 -j ACCEPT

[root@docker-server1 ~]# route add -net 172.16.20.0/24 gw 192.168.10.206 #ping對方容器IP

 

4.2.3.4.2:server2 新增靜態路由:

[root@docker-server2 ~]# iptables -A FORWARD -s 192.168.10.0/24 -j ACCEPT

[root@docker-server2 ~]# route add -net 172.16.10.0/24 gw 192.168.10.205 #ping對方容器IP

 

4.2.3.4.3:抓包分析

[root@linux-docker2 ~]# tcpdump -i eth0 -vnn icmp

 

4.2.3.5:測試容器間互聯:

4.2.3.5.1:宿主機A到宿主機B容器測試:

 

4.2.3.5.2:宿主機B到宿主機A容器測試:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

五:Docker倉庫之單機Docker Registry:

Docker Registry作為Docker的核心元件之一負責映象內容的儲存與分發客戶端的docker pull以及push命令都將直接與registry進行互動,最初版本的registry 由Python實現,由於設計初期在安全性,效能以及API的設計上有著諸多的缺陷,該版本在0.9之後停止了開發,由新的專案distribution(新的docker register被稱為Distribution)來重新設計並開發下一代registry,新的專案由go語言開發,所有的API,底層儲存方式,系統架構都進行了全面的重新設計已解決上一代registry中存在的問題,2016年4月份rgistry 2.0正式釋出,docker 1.6版本開始支援registry 2.0,而八月份隨著docker 1.8 釋出,docker hub正式啟用2.1版本registry全面替代之前版本 registry,新版registry對映象儲存格式進行了重新設計並和舊版不相容,docker 1.5和之前的版本無法讀取2.0的映象,另外,Registry 2.4版本之後支援了回收站機制,也就是可以刪除映象了,在2.4版本之前是無法支援刪除映象的,所以如果你要使用最好是大於Registry 2.4版本的。

 

本部分將介紹通過官方提供的docker registry映象來簡單搭建一套本地私有倉庫環境。

5.1:下載docker registry映象:

[root@docker-server1 ~]# docker pull registry

 

 

5.2:搭建單機倉庫:

5.2.1:建立授權使用目錄:

[root@docker-server1 ~]# mkdir /docker/auth #建立一個授權使用目錄

 

5.2.2:建立使用者:

docker run -it registry:latest sh     #進入registry映象

apk install apache2-utils             # 安裝htpasswd

#提交映象,此映象只用來只能htpasswd,不用來執行,

docker commit 071197ea35c1 registry:v1

 

[root@docker-server1 ~]# cd /docker

[root@docker-server1 docker]# docker run --entrypoint htpasswd registry:v1 -Bbn jack 123456 > auth/htpasswd #建立一個使用者並生成密碼

 

5.2.3:驗證使用者名稱密碼:

[root@docker-server1 docker]# cat auth/htpasswd

jack:$2y$05$8W2aO/2RXMrMzw/0M5pig..QXwUh/m/XPoW5H/XxloLLRDTepVGP6

 

5.2.4:啟動docker registry:

[root@docker-server1 docker]# docker run -d -p 5000:5000 --restart=always --name registry1 -v /docker/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry

[root@docker-server1 docker]# docker run -d -p 5000:5000 --restart=always --name registry1 -v /docker/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry

ce659e85018bea3342045f839c43b66de1237ce5413c0b6b72c0887bece5325a

#註釋-v /docker/auth:/auth 將宿主機目錄對映到容器中

#-e傳遞引數

#最後registry:v1使用的映象名稱

 

5.2.5:驗證埠和容器:

 

5.2.6:測試登入倉庫:

5.2.6.1:報錯如下:

可以將/root/.docker/目錄拷貝到別的伺服器,可以不用再登入,直接下載映象

 

現在解決方法:

--insecure-registry 10.0.0.8:5000 #在需要登入的伺服器,新增倉庫登入的安全地址

[root@web01 ~]# vim /lib/systemd/system/docker.service

重啟docker

[root@web01 ~]# systemctl daemon-reload

[root@web01 ~]# systemctl restart docker

 

 

 

5.2.6.2:早期解決方法:

編輯各docker 伺服器/etc/sysconfig/docker 配置檔案如下:

[root@docker-server1 ~]# vim /etc/sysconfig/docker

4 OPTIONS='--selinux-enabled --log-driver=journald'

9 ADD_REGISTRY='--add-registry 192.168.10.205:5000'

10 INSECURE_REGISTRY='--insecure-registry 192.168.10.205:5000'

[root@docker-server1 ~]# systemctl restart docker

 

[root@docker-server2 ~]# vim /etc/sysconfig/docker

4 OPTIONS='--selinux-enabled --log-driver=journald'

5 if [ -z "${DOCKER_CERT_PATH}" ]; then

6 DOCKER_CERT_PATH=/etc/docker

7 fi

8

9 ADD_REGISTRY='--add-registry 192.168.10.205:5000'

10 INSECURE_REGISTRY='--insecure-registry 192.168.10.205:5000'

[root@docker-server2 ~]# systemctl restart docker

 

5.2.6.3:驗證各docker 伺服器登入:

#server1:

#server2:

 

5.2.7:在Server1登入後上傳映象:

5.2.7.1:映象打tag:

[root@docker-server1 ~]# docker tag jack/nginx-1.10.3:v1 192.168.10.205:5000/jack/nginx-1.10.3:v1

[root@web01 ~]# docker tag tomcat-linux39:app2 10.0.0.8:5000/linux39/tomcat:v1

[root@web01 ~]# docker push 10.0.0.8:5000/linux39/tomcat:v1

 

 

5.2.7.2:上傳映象:

 

5.2.8:Server 2下載映象並啟動容器:

5.2.8.1:登入並從docker registry下載映象:

[root@docker-server2 ~]# docker images

REPOSITORY TAG MAGE ID CREATED SIZE

[root@docker-server2 ~]# docker login 192.168.10.205:5000

Username (jack): jack

Password:

Login Succeeded

 

[root@docker-server2 ~]# docker pull 192.168.10.205:5000/jack/nginx-1.10.3:v1

 

5.2.8.2:驗證映象下載成功:

 

5.2.8.3:從下載的映象啟動容器:

[root@docker-server2 ~]# docker run -d --name docker-registry -p 80:80 192.168.10.205:5000/jack/nginx-1.10.3:v1 nginx

2ba24f28362e1b039fbebda94a332111c2882aa06987463ae033c630f5c9927c

 

5.2.8.4:訪問測試:

 

 

 

 

5.2.9: 檢視私有倉庫包含映象

curl -u jack:123456 http://10.0.0.8:5000/v2/_catalog

 

https://www.jianshu.com/p/3ef44bcfd177 參考地址

 

 

 

1. 檢視私有倉庫中的鏡

1.1 在本地shell中可以通過curl進行查詢,也可以在瀏覽器中通過http://ip:port/v2/_catalog進行訪問

無認證的私有倉庫:
			

    curl -X GET http://ip:port/v2/_catalog

帶認證的私有倉庫
			

  curl -u username:password -X GET http://ip:port/v2/_catalog


				帶認證的不帶-u引數,因驗證不通過會報如下錯誤:
			

    {"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"registry","Class":"","Name":"catalog","Action":"*"}]}]}

1.2 獲取獲取某個映象的標籤列表,也可以在瀏覽其中通過http:/v2/image_name/tags/list進行訪問

無認證的私有倉庫:
			

    curl -X GET http://ip:port/v2/image_name/tags/list

帶認證的私有倉庫
			

  curl -u username:password -X GET http:/v2/image_name/tags/list

 

2.刪除私有倉庫中的鏡

第一步:檢視digest

curl -I --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -u dongxiaojian:dongxiaojian -X GET http://ip:port/v2/centos_test/manifests/latest

在返回值中的Docker-Content-Digest的值就是digest

第二步:刪除映象

curl -u dongxiaojian:dongxiaojian -X DELETE ip:port/v2/centos_test/manifests/sha:365fc7f33107869dfcf2b3ba220ce0aa42e16d3f8e8b3c21d72af1ee622f0cf0

這一步不一定成功,可能會丟擲 {"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}異常

解決方案:在啟動registry時指定以下環境變數:-e REGISTRY_STORAGE_DELETE_ENABLED=true

第三步:進行垃圾回收

看似已經刪除了,其實硬碟地址並沒有釋放。是因為docker刪除image只是刪除的image的元資料資訊。層資料並沒有刪除。現在進入registry中進行垃圾回收

這裡先坑著,稍後補充。可以參考部落格:http://blog.51cto.com/302876016/1966816

注:其中帶-u 都是帶認證私有倉庫的操作,如果是不需要認證的倉庫,把這個引數去掉就行。關於刪除映象,進行垃圾回收大都是通過yum檔案進行操作的,待我整體學習完了之後再回來填

 

 

 

 

 

 

 

 

六:docker倉庫之分散式 Harbor

Harbor是一個用於儲存和分發Docker映象的企業級Registry伺服器,由vmware開源,其通過新增一些企業必需的功能特性,例如安全、標識和管理等,擴充套件了開源Docker Distribution。作為一個企業級私有Registry伺服器,Harbor提供了更好的效能和安全。提升使用者使用Registry構建和執行環境傳輸映象的效率。Harbor支援安裝在多個Registry節點的映象資源複製,映象全部儲存在私有Registry中, 確保資料和智慧財產權在公司內部網路中管控,另外,Harbor也提供了高階的安全特性,諸如使用者管理,訪問控制和活動審計等,官網地址:https://vmware.github.io/harbor/cn/,官方github地址:https://github.com/vmware/harbor

 

6.1:Harbor功能官方介紹:

主要功能

基於角色的訪問控制:使用者與Docker映象倉庫通過"專案"進行組織管理,一個使用者可以對多個映象倉庫在同一名稱空間(project)裡有不同的許可權。

 

映象互相複製:映象可以在多個Registry例項中複製(同步)。尤其適合於負載均衡,高可用,混合雲和多雲的場景。互相複製,不同harbor伺服器物理配置可能不同.

 

圖形化使用者介面:使用者可以通過瀏覽器來瀏覽,檢索當前Docker映象倉庫,管理專案和名稱空間。

 

AD/LDAP 支援:Harbor可以整合企業內部已有的AD/LDAP,用於鑑權認證管理。

 

:所有針對映象倉庫的操作都可以被記錄追溯,用於審計管理。

 

國際化:已擁有英文、中文、德文、日文和俄文的本地化版本。更多的語言將會新增進來。

 

RESTful API - RESTful API :提供給管理員對於Harbor更多的操控, 使得與其它管理軟體整合變得更容易。比如,定期清理harbor映象.

 

部署簡單:提供線上和離線兩種安裝工具, 也可以安裝到vSphere平臺(OVA方式)虛擬裝置。

 

 

 

 

 

 

重要服務

Webhook:監視gitlab程式碼釋出

 

6.2:安裝Harbor:

下載地址:https://github.com/vmware/harbor/releases

安裝文件:https://github.com/vmware/harbor/blob/master/docs/installation_guide.md

 

6.2.1:伺服器1安裝docker:

本次使用當前harbor最新的穩定版本1.2.2離線安裝包,具體名稱為harbor-offline-installer-v1.2.2.tgz

[root@docker-server1 ~]# yum install docker -y

[root@docker-server1 ~]# systemctl satrt docker

[root@docker-server1 ~]# systemctl enable docker

Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

 

6.2.2:伺服器2安裝docker:

[root@docker-server2 ~]# yum install docker -y

[root@docker-server2 ~]# systemctl start docker

[root@docker-server2 ~]# systemctl enable docker

Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

 

6.2.3:下載Harbor安裝包:

6.2.3.1:下載離線完整安裝包:

#推薦使用離線完整安裝包

https://github.com/goharbor/harbor/releases #github也可以下載

[root@docker-server2 ~]# cd /usr/local/src/

[root@docker-server2 src]# wget https://github.com/vmware/harbor/releases/download/v1.2.2/harbor-offline-installer-v1.2.2.tgz

 

6.2.3.2:下載線上安裝包

#不是很推薦此方式

[root@docker-server2 src]# wget https://github.com/vmware/harbor/releases/download/v1.2.2/harbor-online-installer-v1.2.2.tgz

 

6.3:配置Harbor-harbor1.10版本:

 

 

 

6.3.1 修改配置harbor.yml

vim harbor.yml

hostname: image.harbor.com #寫ip地址也可以

 

 

6.3.2 安裝docker-compose依賴

 

 

https://developer.aliyun.com/packageSearch?word=docker-compose #阿里雲下載docker-compose

yum localinstall -y docker-compose-1.18.0-4.el7.noarch.rpm

 

[root@web01 harbor]# ./install.sh #開始安裝harbor

 

 

 

 

 

 

 

 

6.3.3 測試訪問

 

 

 

賬戶:admin

密碼:123456 #在harbor.yml配置檔案中

 

 

 

 

6.3.4 配置docker上傳下載映象

增加安全登入列表

[root@web01 harbor]# vim /usr/lib/systemd/system/docker.service

systemctl daemon-reload

systemctl restart docker

 

 

登入報錯解決方法:

 

如果不配置安全引數,將使用走443埠,一直失敗

 

systemctl daemon-reload

systemctl restart docker

 

 

配置免登陸

 

scp -rp /root/.docker/config.json [email protected]:/root/.docker/config.json

 

 

Web02配置

重啟docker

systemctl daemon-reload

systemctl restart docker

 

 

 

 

上傳本地映象到harbor

 

 

 

 

 

 

其他伺服器拉取映象

拉取報錯

docker pull image.harbor.com/linux39/alpine:v1

 

解決報錯:

 

systemctl daemon-reload

systemctl restart docker

 

下載映象:

 

 

 

 

 

 

 

6.3.5 harbor資料儲存目錄

配置檔案docker-compose.yml設定的volumes

 

 

 

6.3:配置Harbor-harbor1.2.2版本:

6.3.1:解壓並編輯harbor.cfg:

https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.6.tgz

下載1.7.6(企業常用)

Harbor版本區別:

1.7版本及之前與1.8版本後不相容,推薦使用1.7之前

需要先安裝docker與docker compose

[root@docker-server1 src]# tar xvf harbor-offline-installer-v1.2.2.tgz

[root@docker-server1 src]# ln -sv /usr/local/src/harbor /usr/local/

'/usr/local/harbor' -> '/usr/local/src/harbor'

[root@docker-server1 harbor]# cd /usr/local/harbor/

 

[root@docker-server1 harbor]# yum install python-pip –y

[root@docker-server1 harbor]# docker-compose start

[root@docker-server1 harbor]# vim harbor.cfg

 

[root@docker-server1 harbor]# grep "^[a-Z]" harbor.cfg

hostname = 192.168.10.205     #需要修改

ui_url_protocol = http             #如果是https協議可以修改成http

db_password = root123

max_job_workers = 3

customize_crt = on

ssl_cert = /data/cert/server.crt

ssl_cert_key = /data/cert/server.key

secretkey_path = /data

admiral_url = NA

clair_db_password = password

email_identity = harbor

email_server = smtp.163.com

email_server_port = 25

email_username = [email protected]

email_password = zhang@123

email_from = admin <[email protected]>

email_ssl = false

harbor_admin_password = 123456 #harbor密碼

auth_mode = db_auth

ldap_url = ldaps://ldap.mydomain.com

ldap_basedn = ou=people,dc=mydomain,dc=com

ldap_uid = uid

ldap_scope = 3

ldap_timeout = 5

self_registration = on

token_expiration = 30

project_creation_restriction = everyone

verify_remote_cert = on

#郵箱可不配

 

6.3.2:更新harbor配置:

6.3.2.1:首次部署harbor更新:

[root@docker-server1 harbor]# pwd

/usr/local/harbor #在harbor當前目錄執行

[root@docker-server1 harbor]# ./prepare #更新配置

 

 

#執行完畢後會在當前目錄生成一個docker-compose.yml檔案,用於配置資料目錄等配置資訊:

 

6.3.2.2:後期修改配置:

如果harbor執行一段時間之後需要更改配置,則步驟如下:

6.3.2.2.1:停止harbor:

[root@docker-server1 harbor]# pwd

/usr/local/harbor #harbor的當前目錄

[root@docker-server1 harbor]# docker-compose stop

 

6.3.2.2.2:編輯harbor.cfg進行相關配置:

[root@docker-server1 harbor]# vim harbor.cfg

 

6.3.2.2.3:更新配置:

[root@docker-server1 harbor]# ./prepare

 

6.3.2.2.3:啟動harbor服務:

[root@docker-server1 harbor]# docker-compose start

 

 

6.3.3:官方方式啟動Harbor:

6.3.3.1:官方方式安裝並啟動harbor:

[root@docker-server1 harbor]# yum install python-pip

[root@docker-server1 harbor]# pip install --upgrade pip

[root@docker-server1 harbor]# pip install docker-compose

[root@docker-server1 harbor]# ./install.sh #官方構建harbor和啟動方式,推薦此方法,會下載官方的docker 映象:

 

6.3.3.2:部署過程中:

 

6.3.3.3:部署完成:

 

6.3.3.4:檢視本地的映象:

 

6.3.3.5:檢視本地埠:

 

6.3.3.6:web訪問Harbor管理介面:

 

6.3.3.7:登入成功後的介面:

 

 

 

 

 

6.3.4:非官方方式啟動:

6.3.4.1:非官方方式啟動harbor:

[root@docker-server2 harbor]# ./prepare

[root@docker-server2 harbor]# yum install python-pip -y

[root@docker-server2 harbor]# pip install --upgrade pip #升級pip為最新版本

[root@docker-server2 harbor]# pip install docker-compose #安裝docker-compose命令

 

6.3.4.2:啟動harbor:

[root@docker-server2 harbor]# docker-compose up –d #非官方方式構建容器,此步驟會從官網下載映象,需要相當長的時間

#執行過程如下:

 

 

6.3.4.3:檢視本地映象:

 

6.3.4.4:驗證本地埠:

 

6.3.4.5:web訪問Harbor介面:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6.4:配置docker 使用harbor倉庫上傳下載映象:

6.4.1:編輯docker配置檔案:

注意:如果我們配置的是https的話,本地docker就不需要有任何操作就可以訪問harbor了

[root@docker-server1 ~]# vim /etc/sysconfig/docker

4 OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry 192.168.10.205'

#其中192.168.10.205是我們部署Harbor的地址,即hostname配置項值。配置完後需要重啟docker服務。

 

6.4.2:重啟docker服務:

[root@docker-server1 ~]# systemctl stop docker

[root@docker-server1 ~]# systemctl start docker

 

6.4.3:驗證能否登入harbor:

[root@docker-server1 harbor]# docker login 192.168.10.205

 

6.4.4:測試上傳和下載映象:

將之前單機倉庫構構建的Nginx映象上傳到harbor伺服器用於測試

6.4.4.1:匯入映象:

[root@docker-server1 harbor]# docker load < /opt/nginx-1.10.3_docker.tar.gz

 

6.4.4.2:驗證映象匯入成功:

 

6.4.4.3:映象打tag:

#修改images的名稱,不修改成指定格式無法將映象上傳到harbor倉庫,格式為: HarborIP/專案名/image名字:版本號:

[root@docker-server1 harbor]# docker tag 192.168.10.205:5000/jack/nginx-1.10.3:v1 192.168.10.205/nginx/nginx_1.10.3:v1

[root@docker-server1 harbor]# docker images

 

6.4.4.4:在harbor管理介面建立專案:

 

6.4.4.4:將映象push到harbor:

#格式為:docker push 映象名:版本

 

 

6.4.4.5:push 完成:

 

6.4.4.6:harbor 介面驗證映象上傳成功:

 

6.4.4.7:驗證映象資訊:

 

6.4.5:驗證從harbor伺服器下載映象並啟動容器:

6.4.5.1:更改docker配置檔案:

目前凡是需要從harbor映象伺服器下載image的docker服務都要更改,不更改的話無法下載:

[root@docker-server2 ~]# vim /etc/sysconfig/docker

4 OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry 192.168.10.205'

 

6.4.5.2:重啟docker:

[root@docker-server2 ~]# systemctl stop docker

[root@docker-server2 ~]# systemctl start docker

 

6.4.5.3:驗證從harbor下載映象:

6.4.5.5.1:檢視下載命令:

#harbor上的每個映象裡面自帶pull 命令

 

 

6.4.5.5.2:執行下載:

[root@docker-server2 ~]# docker pull 192.168.10.205/nginx/nginx_1.10.3:v1

 

6.4.5.5.3:驗證映象下載完成:

 

6.4.6:從映象啟動容器並驗證:

6.4.6.1:啟動容器:

[root@docker-server2 ~]# docker run -d -p 80:80 -p 443:443 192.168.10.205/nginx/nginx_1.10.3:v1 nginx

89901f9badf74809f6abccc352fc7479f1490f0ebe6d6e3b36d689e73c3f9027

 

6.4.6.2:驗證埠:

 

6.4.6.3:驗證web訪問:

 

 

6.5:實現harbor高可用:

Harbor支援基於策略的Docker映象複製功能,這類似於MySQL的主從同步,其可以實現不同的資料中心、不同的執行環境之間同步映象,並提供友好的管理介面,大大簡化了實際運維中的映象管理工作,已經有用很多網際網路公司使用harbor搭建內網docker倉庫的案例,並且還有實現了雙向複製的案列,本文將實現單向複製的部署:

6.5.1:新部署一臺harbor伺服器:

 

[root@docker-server2 ~]# cd /usr/local/src/

[root@docker-server2 src]# tar xf harbor-offline-installer-v1.2.2.tgz

[root@docker-server2 src]# ln -sv /usr/local/src/harbor /usr/local/

'/usr/local/harbor' -> '/usr/local/src/harbor'

[root@docker-server2 src]# cd /usr/local/harbor/

[root@docker-server2 harbor]# grep "^[a-Z]" harbor.cfg

hostname = 192.168.10.206

ui_url_protocol = http

db_password = root123

max_job_workers = 3

customize_crt = on

ssl_cert = /data/cert/server.crt

ssl_cert_key = /data/cert/server.key

secretkey_path = /data

admiral_url = NA

clair_db_password = password

email_identity = harbor-1.2.2

email_server = smtp.163.com

email_server_port = 25

email_username = [email protected]

email_password = zhang@123

email_from = admin <[email protected]>

email_ssl = false

harbor_admin_password = zhang@123

auth_mode = db_auth

ldap_url = ldaps://ldap.mydomain.com

ldap_basedn = ou=people,dc=mydomain,dc=com

ldap_uid = uid

ldap_scope = 3

ldap_timeout = 5

self_registration = on

token_expiration = 30

project_creation_restriction = everyone

verify_remote_cert = on

[root@docker-server2 harbor]# yum install python-pip -y

[root@docker-server2 harbor]# pip install --upgrade pip

[root@docker-server2 harbor]# pip install docker-compose

[root@docker-server2 harbor]# ./install.sh

 

6.5.2:驗證從harbor登入:

 

6.5.3:建立一個nginx專案:

#與主harbor 專案名稱保持一致:

6.5.4:在主harbor伺服器配置同步測試:

 

6.5.5:點選複製規則:

 

6.5.6:主harbor編輯同步策略:

 

6.5.7:主harbor檢視映象同步狀態:

 

6.5.8:從harbor檢視映象:

 

 

6.5.9:測試從harbor映象下載和容器啟動:

6.5.9.1:docker客戶端配置使用harbor:

#本次新部署了一臺docker 客戶端,IP地址為192.168.10.207

[root@docker-server3 ~]# vim /etc/sysconfig/docker

4 OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry 192.168.10.206'

 

6.5.9.2:重啟docker服務:

[root@docker-server3 ~]# systemctl restart docker

 

6.5.9.3:從harbor專案設定為公開:

 

6.5.9.4:設定專案為公開訪問:

 

6.5.9.5:docker客戶端下載映象:

 

6.5.9.6:docker 客戶端從映象啟動容器:

[root@docker-server3 ~]# docker run -d -p 80:80 -p443:443 192.168.10.206/nginx/nginx_1.10.3:v1 nginx

0b496bc81035291b80062d1fba7d4065079ab911c2a550417cf9e593d353c20b

 

6.5.9.7:驗證web訪問:

 

#至此,高可用模式的harbor倉庫部署完畢

 

 

 

 

 

6.6.:實現harbor 雙向同步:

6.6.1:在docker客戶端匯入centos基礎映象:

[root@docker-server3 ~]# docker load -i /opt/centos.tar.gz

[root@docker-server3 ~]# vim /etc/sysconfig/docker

4 OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry 192.168.10.206'

 

6.6.2:映象打tag:

[root@docker-server3 ~]# docker tag docker.io/centos 192.168.10.206/nginx/centos_base

 

6.6.3:上傳到從harbor:

[root@docker-server3 ~]# docker push 192.168.10.206/nginx/centos_base

 

6.6.4:從harbor介面驗證:

 

 

 

 

 

 

6.6.5:從harbor建立同步規則:

規則方式與主harbor相同,寫對方的IP+使用者名稱密碼,然後點測試連線,確認可以測試連線通過。

伺服器1配置目標

伺服器2配置目標

伺服器1配置複製規則

伺服器2配置複製規則

 

6.6.6:到主harbor驗證映象:

 

6.6.7:docker映象端測試:

6.6.7.1:下載centos 基礎映象:

[root@docker-server1 harbor]# docker pull 192.168.10.205/nginx/centos_base

Using default tag: latest

Trying to pull repository 192.168.10.205/nginx/centos_base ...

sha256:822de5245dc5b659df56dd32795b08ae42db4cc901f3462fc509e91e97132dc0: Pulling from 192.168.10.205/nginx/centos_base

 

Digest: sha256:822de5245dc5b659df56dd32795b08ae42db4cc901f3462fc509e91e97132dc0

 

6.6.7.2:從映象啟動容器:

[root@docker-server1 ~]# docker run -it --name centos_base 192.168.10.205/nginx/centos_base bash

[root@771f5aa0d089 /]#

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

七:單機編排之Docker Compose:

當在宿主機啟動較多的容器時候,如果都是手動操作會覺得比較麻煩而且容器出錯,這個時候推薦使用docker 單機編排工具docker compose,Docker Compose 是docker容器的一種編排服務,docker compose是一個管理多個容器的工具,比如可以解決容器之間的依賴關係,就像啟動一個web就必須得先把資料庫服務先啟動一樣,docker compose 完全可以替代docker run啟動容器。

#github 地址https://github.com/docker/compose

7.1:基礎環境準備:

7.1.1:安裝python環境及pip命令:    

[root@docker-server3 ~]# yum install https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm -y

[root@docker-server3 ~]# yum install python-pip -y

[root@docker-server3 ~]# pip install --upgrade pip

 

7.1.2:安裝docker compose:

[root@docker-server3 ~]# pip install docker-compose

7.1.3:驗證版本:

[root@docker-server3 ~]# docker-compose version

 

7.1.4:檢視幫助:

[root@docker-server3 ~]# docker-compose --help

 

7.2:從 docker compose啟動單個容器:

目錄可以在任意目錄,推薦放在有意義的位置。

[root@docker-server3 ~]# mkdir docker-compose

[root@docker-server3 ~]# cd docker-compose/

 

7.2.1:一個容器的docker compose檔案:

設定一個yml格式的配置檔案,因此要注意前後的縮排。

[root@docker-server3 docker-compose]# cat docker-compose.yml

web1:

image: 192.168.10.206/nginx/nginx_1.10.3

expose:

- 80

- 443

ports:

- "80:80"

- "443:443"

 

7.2.2:啟動容器:

必須要在docker compose檔案所在的目錄執行:

[root@docker-server3 docker-compose]# docker-compose up #前臺啟動

 

7.2.3:啟動完成:

 

7.2.4:web訪問測試:

 

7.2.5:後臺啟動服務:

#容器的在啟動的時候,會給容器自定義一個名稱

[root@docker-server3 docker-compose]# docker-compose up -d

 

7.2.6:自定義容器名稱:

[root@docker-server3 docker-compose]# cat docker-compose.yml

web1:

image: 192.168.10.206/nginx/nginx_1.10.3

expose:

- 80

- 443

container_name: nginx-web1 #自定義容器名稱

ports:

- "80:80"

- "443:443"

 

7.2.7:驗證容器:

 

7.2.8:檢視容器程序:

[root@docker-server3 docker-compose]# docker-compose ps

 

 

 

7.3:從docker compose啟動多個容器:

7.3.1:編輯docker-compose檔案:

[root@docker-server3 docker-compose]# cat docker-compose.yml

web1:

image: 192.168.10.206/nginx/nginx_1.10.3

expose:

- 80

- 443

container_name: nginx-web1

ports:

- "80:80"

- "443:443"

 

web2: #每一個容器一個ID

image: 192.168.10.206/nginx/nginx_1.10.3

expose:

- 80

- 443

container_name: nginx-web2

ports:

- "81:80"

- "444:443"

 

7.3.2:重新啟動容器:

[root@docker-server3 docker-compose]# docker-compose stop

[root@docker-server3 docker-compose]# docker-compose up –d

 

7.3.3:web訪問測試:

 

7.4:定義資料卷掛載:

7.4.1:建立資料目錄和檔案:

[root@docker-server3 ~]# mkdir -p /data/nginx

[root@docker-server3 ~]# echo "Test Nginx Volume" > /data/nginx/index.html

 

7.4.2:編輯compose配置檔案:

[root@docker-server3 docker-compose]# vim docker-compose.yml

web1:

image: 192.168.10.206/nginx/nginx_1.10.3

expose:

- 80

- 443

container_name: nginx-web1

volumes:

- /data/nginx:/usr/local/nginx/html

ports:

- "80:80"

- "443:443"

 

web2:

image: 192.168.10.206/nginx/nginx_1.10.3

expose:

- 80

- 443

container_name: nginx-web2

ports:

- "81:80"

- "444:443"

 

7.4.3:重啟容器:

[root@docker-server3 docker-compose]# docker-compose stop

[root@docker-server3 docker-compose]# docker-compose up -d

 

7.4.4:驗證web訪問:

#可以發現,同一個檔案,資料卷的優先順序比映象內的檔案優先順序高

 

7.4.5:其他常用命令:

7.4.5.1:重啟單個指定容器:

[root@docker-server3 docker-compose]# docker-compose restart web1

Restarting nginx-web1 ... done

 

7.4.5.2:重啟所以容器:

[root@docker-server3 docker-compose]# docker-compose restart

 

7.4.5.3:停止和啟動單個容器:

[root@docker-server3 docker-compose]# docker-compose stop web1

[root@docker-server3 docker-compose]# docker-compose start web1

 

7.4.5.4:停止和啟動所有容器:

[root@docker-server3 docker-compose]# docker-compose stop

[root@docker-server3 docker-compose]# docker-compose start

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7.5:實現單機版的HA+Nginx+Tomcat:

7.5.1:製作Haproxy映象:

[root@docker-server1 haproxy]# pwd

/opt/dockerfile/web/haproxy

 

7.5.1.1:編輯Dockerfile檔案:

[root@docker-server1 haproxy]# cat Dockerfile

#My Dockerfile

From docker.io/centos:7.2.1511

MAINTAINER zhangshijie "[email protected]"

 

#Yum Setting

ADD epel.repo /etc/yum.repos.d/epel.repo

ADD CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo

 

RUN yum install gcc gcc-c++ pcre pcre-devel openssl openssl-devel -y

 

ADD haproxy-1.7.9.tar.gz /usr/local/src

RUN cd /usr/local/src/haproxy-1.7.9 && make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy

RUN cp /usr/local/src/haproxy-1.7.9/haproxy-systemd-wrapper /usr/sbin/haproxy-systemd-wrapper

RUN cp /usr/local/src/haproxy-1.7.9/haproxy /usr/sbin/haproxy

ADD haproxy.service /usr/lib/systemd/system/haproxy.service

ADD haproxy /etc/sysconfig/haproxy

ADD run_haproxy.sh /root/script/run_haproxy.sh

RUN chmod a+x /root/script/run_haproxy.sh

 

CMD ["/root/script/run_haproxy.sh"]

EXPOSE 80 9999

 

7.5.1.2:準備服務啟動指令碼:

[root@docker-server1 haproxy]# cat haproxy.service

[Unit]

Description=HAProxy Load Balancer

After=syslog.target network.target

 

[Service]

EnvironmentFile=/etc/sysconfig/haproxy

ExecStart=/usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid $OPTIONS

ExecReload=/bin/kill -USR2 $MAINPID

 

[Install]

WantedBy=multi-user.target

 

7.5.1.3:前臺啟動指令碼:

[root@docker-server1 haproxy]# cat run_haproxy.sh

#!/bin/bash

/usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid

 

7.5.1.4:haproxy引數檔案:

[root@docker-server1 haproxy]# cat haproxy

# Add extra options to the haproxy daemon here. This can be useful for

# specifying multiple configuration files with multiple -f options.

# See haproxy(1) for a complete list of options.

OPTIONS=""

 

7.5.1.5:準備壓縮包及其他檔案:

 

7.5.1.6:執行構建映象:

[root@docker-server1 haproxy]# docker build -t 192.168.10.205/centos/centos_7.2.1511_haproxy_1.7.9 /opt/dockerfile/web/haproxy/

 

7.5.1.7:經映象上傳到harbor倉庫:

 

7.5.1.8:harbor倉庫驗證:

 

7.5.2:準備nginx映象:

參考2.3

 

7.5.3:準備tomcat映象:

參考2.4

 

7.5.4:編輯docker compose檔案及環境準備:

7.5.4.1:編輯docker compose檔案:

[root@docker-server3 docker-compose]# pwd

/root/docker-compose

[root@docker-server3 docker-compose]# cat docker-compose.yml

nginx-web1:

image: 192.168.10.205/nginx/nginx_1.10.3

expose:

- 80

- 443

container_name: nginx-web1

volumes:

- /data/nginx:/usr/local/nginx/html

- /usr/local/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf

links:

- tomcat-web1

- tomcat-web2

 

nginx-web2:

image: 192.168.10.205/nginx/nginx_1.10.3

volumes:

- /usr/local/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf

expose:

- 80

- 443

container_name: nginx-web2

links:

- tomcat-web1

- tomcat-web2

 

tomcat-web1:

container_name: tomcat-web1

image: 192.168.10.205/centos/jdk1.7.0.79_tomcat1.7.0.69

user: www

command: /apps/tomcat/bin/run_tomcat.sh

volumes:

- /apps/tomcat/webapps/SalesManager:/apps/tomcat/webapps/SalesManager

expose:

- 8080

- 8443

 

tomcat-web2:

container_name: tomcat-web2

image: 192.168.10.205/centos/jdk1.7.0.79_tomcat1.7.0.69

user: www

command: /apps/tomcat/bin/run_tomcat.sh

volumes:

- /apps/tomcat/webapps/SalesManager:/apps/tomcat/webapps/SalesManager

expose:

- 8080

- 8443

 

haproxy:

container_name: haproxy-web1

image: 192.168.10.205/centos/centos_7.2.1511_haproxy_1.7.9

command: /root/script/run_haproxy.sh

volumes:

- /etc/haproxy/haproxy.cfg:/etc/haproxy/haproxy.cfg

ports:

- "9999:9999"

- "80:80"

links:

- nginx-web1

- nginx-web2

7.5.4.2:準備nginx靜態檔案:

[root@docker-server3 docker-compose]# cat /data/nginx/index.html

Test Nginx Volume

 

7.5.4.3:準備nginx配置檔案:

#本地路徑和nginx路徑都是 /usr/local/nginx/conf/nginx.conf

[root@docker-server3 docker-compose]# grep -v "#" /usr/local/nginx/conf/nginx.conf | grep -v "^$"

user nginx;

worker_processes auto;

daemon off;

events {

worker_connections 1024;

}

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

upstream tomcat_webserver {

server tomcat-web1:8080;

server tomcat-web2:8080;

}

server {

listen 80;

server_name localhost;

location / {

root html;

index index.html index.htm;

}

location /SalesManager {

proxy_pass http://tomcat_webserver;

     proxy_set_header Host $host;

     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Real-IP $remote_addr;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

}

 

7.5.4.4:準備tomcat頁面檔案:

[root@docker-server3 docker-compose]# ll /apps/tomcat/webapps/SalesManager

total 8

-rw-r--r-- 1 www www 15 Dec 21 05:01 index.html

-rw-r--r-- 1 www www 696 Dec 21 05:01 showhost.jsp

[root@docker-server3 docker-compose]# cat /apps/tomcat/webapps/SalesManager/showhost.jsp

<%@page import="java.util.Enumeration"%>

<br />

host: <%try{out.println(""+java.net.InetAddress.getLocalHost().getHostName());}catch(Exception e){}%>

<br />

remoteAddr: <%=request.getRemoteAddr()%>

<br />

remoteHost: <%=request.getRemoteHost()%>

<br />

sessionId: <%=request.getSession().getId()%>

<br />

serverName:<%=request.getServerName()%>

<br />

scheme:<%=request.getScheme()%>

<br />

<%request.getSession().setAttribute("t1","t2");%>

<%

Enumeration en = request.getHeaderNames();

while(en.hasMoreElements()){

String hd = en.nextElement().toString();

out.println(hd+" : "+request.getHeader(hd));

out.println("<br />");

}

%>

 

7.5.5:啟動容器:

[root@docker-server3 docker-compose]# pwd

/root/docker-compose

[root@docker-server3 docker-compose]# docker-compose up –d

 

7.5.6:驗證容器啟動成功:

 

7.5.7:檢視啟動日誌:

[root@docker-server3 docker-compose]# docker-compose logs –f

 

7.5.8:訪問haroxy 管理介面:

192.168.10.207:9999/haproxy-status

 

7.5.9:訪問Nginx靜態頁面:

Web1:

 

#web2:

 

7.5.10:訪問tomcat靜態頁面:

 

7.5.11:訪問tomcat動態頁面: