docker入門(mén)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容