Docker基礎(chǔ)命令學(xué)習(xí)及redis集群搭建
本堂課內(nèi)容
1、了解docker、docker命令簡(jiǎn)單理解,快速利用docker創(chuàng)建一個(gè)redis服務(wù)容器
2、docker容器的導(dǎo)入導(dǎo)出
3、dockerfile指令學(xué)習(xí)
4、docker主從快速配置
一、Docker 入門(mén)
Docker是什么?
Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,你可以將其理解為一個(gè)輕量級(jí)的虛擬機(jī),開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴(lài)包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上。
為什么要使用 Docker?
作為一種新興的虛擬化方式,Docker 跟傳統(tǒng)的虛擬化方式相比具有眾多的優(yōu)勢(shì)。
更高效的利用系統(tǒng)資源
由于容器不需要進(jìn)行硬件虛擬以及運(yùn)行完整操作系統(tǒng)等額外開(kāi)銷(xiāo),Docker 對(duì)系統(tǒng)資源的利用率更高。
無(wú)論是應(yīng)用執(zhí)行速度、內(nèi)存損耗或者文件存儲(chǔ)速度,都要比傳統(tǒng)虛擬機(jī)技術(shù)更高效。因此,相比虛擬機(jī)技術(shù),一個(gè)相同配置的主機(jī),往往可以運(yùn)行更多數(shù)量的應(yīng)用。
更快速的啟動(dòng)時(shí)間
傳統(tǒng)的虛擬機(jī)技術(shù)啟動(dòng)應(yīng)用服務(wù)往往需要數(shù)分鐘,而 Docker 容器應(yīng)用,由于直接運(yùn)行于宿主內(nèi)核,無(wú)需啟動(dòng)完整的操作系統(tǒng),因此可以做到秒級(jí)、甚至毫秒級(jí)的啟動(dòng)時(shí)間。大大的節(jié)約了開(kāi)發(fā)、測(cè)試、部署的時(shí)間。
一致的運(yùn)行環(huán)境
開(kāi)發(fā)過(guò)程中一個(gè)常見(jiàn)的問(wèn)題是環(huán)境一致性問(wèn)題。由于開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán)境不一致,導(dǎo)致有些 bug 并未在開(kāi)發(fā)過(guò)程中被發(fā)現(xiàn)。而 Docker 的鏡像提供了除內(nèi)核外完整的運(yùn)行時(shí)環(huán)境,確保了應(yīng)用運(yùn)行環(huán)境一致性,從而不會(huì)再出現(xiàn) 「這段代碼在我機(jī)器上沒(méi)問(wèn)題啊」 這類(lèi)問(wèn)題。
持續(xù)交付和部署
對(duì)開(kāi)發(fā)和運(yùn)維(DevOps)人員來(lái)說(shuō),最希望的就是一次創(chuàng)建或配置,可以在任意地方正常運(yùn)行。
使用 Docker 可以通過(guò)定制應(yīng)用鏡像來(lái)實(shí)現(xiàn)持續(xù)集成、持續(xù)交付、部署。開(kāi)發(fā)人員可以通過(guò) Dockerfile 來(lái)進(jìn)行鏡像構(gòu)建,并結(jié)合持續(xù)集成(Continuous Integration) 系統(tǒng)進(jìn)行集成測(cè)試,而運(yùn)維人員則可以直接在生產(chǎn)環(huán)境中快速部署該鏡像,甚至結(jié)合 持續(xù)部署(Continuous Delivery/Deployment) 系統(tǒng)進(jìn)行自動(dòng)部署。
而且使用 Dockerfile 使鏡像構(gòu)建透明化,不僅僅開(kāi)發(fā)團(tuán)隊(duì)可以理解應(yīng)用運(yùn)行環(huán)境,也方便運(yùn)維團(tuán)隊(duì)理解應(yīng)用運(yùn)行所需條件,幫助更好的生產(chǎn)環(huán)境中部署該鏡像。
更輕松的遷移
由于 Docker 確保了執(zhí)行環(huán)境的一致性,使得應(yīng)用的遷移更加容易。Docker 可以在很多平臺(tái)上運(yùn)行,無(wú)論是物理機(jī)、虛擬機(jī)、公有云、私有云,甚至是筆記本,其運(yùn)行結(jié)果是一致的。因此用戶(hù)可以很輕易的將在一個(gè)平臺(tái)上運(yùn)行的應(yīng)用,遷移到另一個(gè)平臺(tái)上,而不用擔(dān)心運(yùn)行環(huán)境的變化導(dǎo)致應(yīng)用無(wú)法正常運(yùn)行的情況。
更輕松的維護(hù)和擴(kuò)展
Docker 使用的分層存儲(chǔ)以及鏡像的技術(shù),使得應(yīng)用重復(fù)部分的復(fù)用更為容易,也使得應(yīng)用的維護(hù)更新更加簡(jiǎn)單,基于基礎(chǔ)鏡像進(jìn)一步擴(kuò)展鏡像也變得非常簡(jiǎn)單。此外,Docker 團(tuán)隊(duì)同各個(gè)開(kāi)源項(xiàng)目團(tuán)隊(duì)一起維護(hù)了一大批高質(zhì)量的 官方鏡像,既可以直接在生產(chǎn)環(huán)境使用,又可以作為基礎(chǔ)進(jìn)一步定制,大大的降低了應(yīng)用服務(wù)的鏡像制作成本。
對(duì)比傳統(tǒng)虛擬機(jī)總結(jié)
[圖片上傳失敗...(image-5c085d-1570611741878)]
Docker 的主要用途,目前有三大類(lèi)。
(1)提供一次性的環(huán)境。比如,本地測(cè)試他人的軟件、持續(xù)集成的時(shí)候提供單元測(cè)試和構(gòu)建的環(huán)境。
(2)提供彈性的云服務(wù)。因?yàn)?Docker 容器可以隨開(kāi)隨關(guān),很適合動(dòng)態(tài)擴(kuò)容和縮容。
(3)組建微服務(wù)架構(gòu)。通過(guò)多個(gè)容器,一臺(tái)機(jī)器可以跑多個(gè)服務(wù),因此在本機(jī)就可以模擬出微服務(wù)架構(gòu)。
1.1 Centos 安裝docker
1、更新update到最新的版本
yum update
2、卸載老版本docker
yum remove docker docker-common docker-selinux docker-engine
3、安裝需要的軟件包
yum install -y yum-utils device-mapper-persistent-data lvm2
4、設(shè)置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5、查看docker版本
yum list docker-ce --showduplicates|sort -r
6、安裝docker
yum install docker-ce-18.03.1.ce -y
7、啟動(dòng)docker
systemctl start docker
8、加入開(kāi)機(jī)自啟
systemctl enable docker
9、配置國(guó)內(nèi)鏡像
vi /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
1.2 docker基本概念
Docker 包括三個(gè)基本概念:
鏡像(Image)
容器(Container)
倉(cāng)庫(kù)(Repository)
Docker 鏡像就是一個(gè)只讀的模板。
例如:一個(gè)鏡像可以包含一個(gè)完整的 ubuntu 操作系統(tǒng)環(huán)境,里面僅安裝了 Apache 或用戶(hù)需要的其它應(yīng)用程序。
鏡像可以用來(lái)創(chuàng)建 Docker 容器。
Docker 提供了一個(gè)很簡(jiǎn)單的機(jī)制來(lái)創(chuàng)建鏡像或者更新現(xiàn)有的鏡像,用戶(hù)甚至可以直接從其他人那里下載一個(gè)已經(jīng)做好的鏡像來(lái)直接使用。
Docker 容器
Docker 利用容器來(lái)運(yùn)行應(yīng)用。
容器是從鏡像創(chuàng)建的運(yùn)行實(shí)例。它可以被啟動(dòng)、開(kāi)始、停止、刪除。每個(gè)容器都是相互隔離的、保證安全的平臺(tái)。
可以把容器看做是一個(gè)簡(jiǎn)易版的 Linux 環(huán)境(包括root用戶(hù)權(quán)限、進(jìn)程空間、用戶(hù)空間和網(wǎng)絡(luò)空間等)和運(yùn)行在其中的應(yīng)用程序。
Docker 倉(cāng)庫(kù)
倉(cāng)庫(kù)是集中存放鏡像文件的場(chǎng)所。有時(shí)候會(huì)把倉(cāng)庫(kù)和倉(cāng)庫(kù)注冊(cè)服務(wù)器(Registry)混為一談,并不嚴(yán)格區(qū)分。實(shí)際上,倉(cāng)庫(kù)注冊(cè)服務(wù)器上往往存放著多個(gè)倉(cāng)庫(kù),每個(gè)倉(cāng)庫(kù)中又包含了多個(gè)鏡像,每個(gè)鏡像有不同的標(biāo)簽(tag)。
倉(cāng)庫(kù)分為公開(kāi)倉(cāng)庫(kù)(Public)和私有倉(cāng)庫(kù)(Private)兩種形式。
最大的公開(kāi)倉(cāng)庫(kù)是 Docker Hub,存放了數(shù)量龐大的鏡像供用戶(hù)下載。
1.3 快速入門(mén)
利用docker快速安裝一個(gè)redis鏡像,了解dockerFile指令
Dockerfile 是一個(gè)文本文件,其內(nèi)包含了一條條的指令(Instruction),每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建。
具體的我們查看給大家的pdf的書(shū)籍,命令都是簡(jiǎn)單的,我們會(huì)慢慢的去學(xué)習(xí)
Docker常用指令
1.啟動(dòng)
docker start 容器名
2.刪除
docker rm 容器名
3.停止所容器
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
4.docker build -t 名稱(chēng) .
Usage:docker build [OPTIONS] PATH | URL | -
OPTIONS:
-t ,--tag list??#構(gòu)建后的鏡像名稱(chēng)
-f, --file string?#指定Dockerfiile文件位置
示例:
1,docker build .
2,docker build -t redis:v1 .
3,docker build -t redis:v2 -f /path/Dockerfile /path
一般常用第2種方式構(gòu)建,我們?cè)跇?gòu)建時(shí)都會(huì)切換到Dockerfile文件的目錄下進(jìn)行構(gòu)建,所以不需要指定-f參
5.進(jìn)入容器
Dockerfile快速入門(mén)指令
1.FROM 指定基礎(chǔ)鏡像
所謂定制鏡像,那一定是以一個(gè)鏡像為基礎(chǔ),在其上進(jìn)行定制。就像我們之前運(yùn)行了一個(gè)redis鏡像的容器,再進(jìn)行修改一樣,基礎(chǔ)鏡像是必須指定的。而 FROM 就是指定基礎(chǔ)鏡像,因此一個(gè) Dockerfile 中 FROM 是必備的指令,并且必須是第一條指令。
在 Docker Store 上有非常多的高質(zhì)量的官方鏡像,有可以直接拿來(lái)使用的服務(wù)類(lèi)的鏡像,如nginx 、 redis 、 mongo 、 mysql 、 httpd 、 php 、 tomcat 等;如果沒(méi)有找到對(duì)應(yīng)服務(wù)的鏡像,官方鏡像中還提供了一些更為基礎(chǔ)的操作系統(tǒng)鏡像,
如ubuntu 、 debian 、 centos、 alpine 等這些操作系統(tǒng)的軟件庫(kù)
2、RUN 執(zhí)行命令
RUN 指令是用來(lái)執(zhí)行命令行命令的。
格式:
RUN \<command\> (類(lèi)似/bin/sh -cshell格式)
RUN ["executable", "param1", "param2"] (exec格式)
類(lèi)似shell腳本風(fēng)格的:
FROM alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add gcc g++ libc-dev wget vim openssl-dev make linux-headers
RUN mkdir -p /usr/src/redis
RUN cd /usr/src/redis
RUN wget -O redis-4.0.11.tar.gz "http://download.redis.io/releases/redis-4.0.11.tar.gz"
RUN tar -xzf redis-4.0.11.tar.gz -C /usr/src/redis
RUN cd /usr/src/redis/redis-4.0.11 && make && make PREFIX=/usr/local/redis install
之前說(shuō)過(guò),Dockerfile 中每一個(gè)指令都會(huì)建立一層, RUN 也不例外。每一個(gè) RUN 的行為,就和剛才我們手工建立鏡像的過(guò)程一樣:新建立一層,在其上執(zhí)行這些命令,執(zhí)行結(jié)束后, commit這一層的修改,構(gòu)成新的鏡像。使用 Dockerfile 定制鏡像
而上面的這種寫(xiě)法,創(chuàng)建了很多層鏡像。這是完全沒(méi)有意義的,而且很多運(yùn)行時(shí)不需要的東西,都被裝進(jìn)了鏡像里,比如編譯環(huán)境、更新的軟件包等等。結(jié)果就是產(chǎn)生非常臃腫、非常多層的鏡像,不僅僅增加了構(gòu)建部署的時(shí)間,也很容易出錯(cuò)。 這是很多初學(xué)
Docker 的人常犯的一個(gè)錯(cuò)誤。Union FS是有最大層數(shù)限制的,比如 AUFS,曾經(jīng)是最大不得超過(guò) 42 層,現(xiàn)在是不得超過(guò) 127 層。
二、Docker容器的遷移處理
? ? 在業(yè)務(wù)的開(kāi)發(fā)過(guò)程當(dāng)中我們會(huì)面臨,多個(gè)不同的系統(tǒng)或平臺(tái)的環(huán)境統(tǒng)一的問(wèn)題,比如本地開(kāi)發(fā)的環(huán)境需要遷移到服務(wù)器,docker的強(qiáng)大之處也在這里,可以做到很方便的處理
2.1、導(dǎo)出鏡像
導(dǎo)出容器可以導(dǎo)出一個(gè)已經(jīng)創(chuàng)建的容器到一個(gè)文件,不管容器處于什么狀態(tài),可以使用docker export 命令。
命令格式為:docker export [-o|--output[=""]] CONTATINER
其中可以通過(guò)-o來(lái)指定導(dǎo)出的tar文件名,也可以直接通過(guò)重定向來(lái)實(shí)現(xiàn)。
??另一種格式為:docker export 容器id/name >文件名.tar
2.2、導(dǎo)入容器
導(dǎo)入的文件可以使用docker import 命令導(dǎo)入變成鏡像,該命令的格式為:
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY[:YAG]]
其中-c 選項(xiàng)可以在導(dǎo)入的同時(shí)執(zhí)行對(duì)容器進(jìn)行修改的Dockerfile指令(網(wǎng)絡(luò)等修改)
另外 docker save&load 命令也可以導(dǎo)入一個(gè)鏡像存儲(chǔ)文件,但是跟docker import 命令是有區(qū)別的
2.用export&import 還是 save & load ?
export&import 和 save & load 是docker中的兩組命令,我們先主要看看他們的區(qū)別:
| 類(lèi)型 | 導(dǎo)出的對(duì)象 | 導(dǎo)出文件大小 | 是否可回滾到歷史層 |
|---|---|---|---|
| export & import | 將容器導(dǎo)出 | 大 | 是 |
| save & load | 用來(lái)將一個(gè)或者多個(gè)image打包 | 小 | 否 |
相對(duì)于文件大小來(lái)說(shuō),save方式導(dǎo)出的文件比export方式導(dǎo)出的文件大
正是因?yàn)閟ave方式保存了鏡像的歷史和層(layer),使其可以層回滾,即回滾到之前的歷史層,所以save方式導(dǎo)出的文件稍微大一些
反觀export方式,在導(dǎo)出過(guò)程中丟失所有的歷史,導(dǎo)致其不可以層回滾,導(dǎo)出的文件會(huì)小一些
可以通過(guò) docker history 鏡像名 看到層關(guān)系
注意事項(xiàng)
如果容器運(yùn)行就退出,并且無(wú)報(bào)錯(cuò)
1、docker容器必須有一個(gè)前臺(tái)進(jìn)程,如果沒(méi)有,容器會(huì)被認(rèn)為空閑,自動(dòng)退出
2、top、tail、腳本掛起到前臺(tái)
三、Redis主從集群規(guī)劃
3.1 集群節(jié)點(diǎn)規(guī)劃
| 容器名稱(chēng) | 容器IP地址 | 映射端口號(hào) | 宿主機(jī)IP地址 | 服務(wù)運(yùn)行模式 |
|---|---|---|---|---|
| Redis-master | 192.168.1.2 | 6380 -> 6379 | 172.16.188.78 | Master |
| Redis-slave | 192.168.1.3 | 6381 -> 6379 | 172.16.188.78 | Slave |
3.2、容器網(wǎng)絡(luò)
Docker安裝后,默認(rèn)會(huì)創(chuàng)建下面三種網(wǎng)絡(luò)類(lèi)型
docker network ls 查看默認(rèn)的網(wǎng)絡(luò)
[圖片上傳失敗...(image-c4cee6-1570611741878)]
在啟動(dòng)容器時(shí)使用 --network bridge 指定網(wǎng)絡(luò)類(lèi)型
bridge:橋接網(wǎng)絡(luò)
默認(rèn)情況下啟動(dòng)的Docker容器,都是使用 bridge,Docker安裝時(shí)創(chuàng)建的橋接網(wǎng)絡(luò),每次Docker容器重啟時(shí),會(huì)按照順序獲取對(duì)應(yīng)的IP地址,這個(gè)就導(dǎo)致重啟下,Docker的IP地址就變了
none:無(wú)指定網(wǎng)絡(luò)
使用 --network=none ,docker 容器就不會(huì)分配局域網(wǎng)的IP
host: 主機(jī)網(wǎng)絡(luò)
使用 --network=host,此時(shí),Docker 容器的網(wǎng)絡(luò)會(huì)附屬在主機(jī)上,兩者是互通的。
例如,在容器中運(yùn)行一個(gè)Web服務(wù),監(jiān)聽(tīng)8080端口,則主機(jī)的8080端口就會(huì)自動(dòng)映射到容器中
<font face="微軟雅黑" color = #42A5F5 >3.3、 指定自定義網(wǎng)絡(luò)</font>
因?yàn)槟J(rèn)的網(wǎng)絡(luò)不能制定固定的地址,所以我們將創(chuàng)建自定義網(wǎng)絡(luò),并指定網(wǎng)段:192.168.1.0/24 并命名為mynetwork,指令
如下:
docker network create --subnet=192.168.1.0/24 mynetwork
3.4、創(chuàng)建dockerfile
具體看發(fā)放給大家的文件
3.5、 在dockerfile目錄 執(zhí)行下面代碼,注意后面上下文點(diǎn)號(hào)
docker build -t redis-test .
創(chuàng)建完成后可以docker image查看生成的鏡像
3.6、接下來(lái)使用此docker鏡像 創(chuàng)建容器
代碼如下:
docker run -itd --name redis-master --net mynetwork -p 6380:6379 --ip 192.168.1.2 redis
參數(shù)說(shuō)明:
具體可以參看一些文檔
http://www.runoob.com/docker/docker-run-command.html
http://www.dockerinfo.net/docker%E5%AE%B9%E5%99%A8-2
-d: 后臺(tái)運(yùn)行容器,并返回容器ID;
-i: 以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用;
-p: 端口映射,格式為:主機(jī)(宿主)端口:容器端口
-t: 為容器重新分配一個(gè)偽輸入終端,通常與 -i 同時(shí)使用;
-V: 為容器掛載目錄,比如 /usr/docker/data:/data 前者為數(shù)宿主機(jī)目錄后者為容器內(nèi)目錄
--ip: 為容器制定一個(gè)固定的ip
--net: 指定網(wǎng)絡(luò)模式
這樣,我們創(chuàng)建了2個(gè)容器,來(lái)一起查看下結(jié)果
docker ps -a
查看容器ip地址
docker network inspect mynetwork
<font face="微軟雅黑" color = #42A5F5 > 3.7 、配置主從機(jī)器</font>
通過(guò)docker命令分別運(yùn)行redis容器
docker run -it --name redis-master --net mynetwork -p 6380:6379 --ip 192.168.1.2 redis
docker run -it --name redis-slave --net mynetwork -p 6380:6379 --ip 192.168.1.2 redis
<font face="微軟雅黑" color = #42A5F5 > 3.8、進(jìn)入容器 </font>
docker exec -it redis-master bash