運維篇 docker知識回顧

對docker知識的回顧


1.docker的出現

項從輾轉於不同環境,因環境導致不可預知的問題。
而使用docker可以將環境一起打包,就解決了環境問題,而且他還有其他優點:

  1. 更輕量:基於容器的虛擬化,僅包含業務所需的runtime環境,centos/nbuntu基礎進行僅170M,宿主機可以容納100-1000個容器。
  2. 更高效:無操作系統虛擬化開銷
    1. 計算:輕量,無額外開銷
    2. 存儲:使用系統盤
    3. 網絡:宿主機網絡,NS(namespaces)隔離
  3. 更敏捷,更靈活:分層的存儲和包管理,devops理念;支持多種網絡配置

對於開發的優點:

  1. 簡化程序:開發者將他們的應用及依賴打包到一個可移植的容器中,然後發佈到任何流行的Linux機器上。
  2. 節省開支:雲計算時代的到來,使開發者不必爲了追求效果而配置高額的硬件,docker改變了高性能必然價格的思維定式,docker與雲的結合,讓雲空間得到更充分的利用,不僅解決了硬件管理的問題,也改變了虛擬化的方式。

2.docker架構

docker使用C/S架構,Client通過接口與server進程通信實現容器的構建,運行和發佈,如圖:

在這裏插入圖片描述

  • Host(docker宿主機)
    安裝docker程序,並運行了Docker daemon的主機。
  • Docker daemon(Docker守護進程);
    運行在宿主機上,Docker守護進程,用戶通過Docker client(Docker命令)與Docker daemon腳後;
  • Images(鏡像)
    將軟件環境打包好的模板,用來創建容器的,一個鏡像可以創建多個容器;
  • Containers(容器)
    docker的運行組件,啓動一個鏡像就是一個容器,容器與容器之間相互隔離,並且互不影響。
  • Docker Client(docker 客戶端)
    Docker命令行工具,用戶是用Docker client與Docker daemon進行通信並返回結果給用戶,也可以使用其他工具通過Dockers API與docker daemon同線;
  • Registry(倉庫服務註冊)
    registry上可以有多個倉庫,每隔倉庫可以看成是一個用戶,一個用戶的倉庫放了多個鏡像,倉庫分爲公開倉庫和私有倉庫,最大的公開倉庫是廣泛的Docker Hub,國內也有如阿里雲、時速雲等,可以給國內用戶提供穩定快速的服務。用戶可以在本地網絡創建一個私有倉庫,當用戶創建了自己的鏡像之後就可以使用push命令將它上傳到公有或私有倉庫。

3.docker的特點

  • 文件系統隔離:每個容器都有自己的文件系統
  • 進程隔離:每個容器都運行在自己的進程環境中
  • 網絡隔離:容器間的虛擬網絡接口和IP地址都是分開的
  • 資源隔離和分組:使用cgroups將CPU和內存之類的資源獨立分配給每個docker容器

4.docker的安裝

  1. 操作系統64位,Centos的內核版本3.1及以上
    查看內核版本:
    uname -r
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PRABZCOy-1588084686371)(en-resource://database/4164:1)]

  2. yum最新
    sudo yum update

  3. 安裝安裝需要的軟件包
    yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的

yum install -y yum-utils device-mapper-persistent-data lvm2
#安裝前可查看device-mapper-persistent-data和lvm2是否已經安裝
rpm -qa|grep device-mapper-persistent-data
rpm -qa|grep lvm2

  1. 設置yum源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  1. 更新yum軟件包索引

yum makecache fast

  1. 安裝docker-ce

yum list docker-ce -y
#查看docker版本
docekr version 或者 docker -v

  1. 啓動docker

systemctl start docker
#開機啓動
systemctl enable docker

出現下面語句就OK了

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

  1. 更換鏡像地址(鏡像加速器)
    阿里雲容器鏡像地址:
    https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
    可以指定多個鏡像地址。
    vim /etc/docker/daemon.json
    下面這個是我自己私有的

{ “registry-mirrors”: [“https://5258x07n.mirror.aliyuncs.com”] }

記住更改完要重啓docker

systemctl restart docker

5.docker的常用命令

  • 查找鏡像
    docker search 名稱
    如:docker search mysql
  • 下載鏡像
    docker pull 名稱
    如:docker pull mysql,他就會下載最新版本的mysql
  • 查看下載的鏡像
    docker images
  • 刪除鏡像
    docker rmi -f 鏡像ID或鏡像名:版本
  • 刪除容器
    docker rm 容器名或ID
  • 查看元信息
    docker inspect 鏡像ID或鏡像名:版本
  • 運行鏡像

docker run --name 容器名 -i -t -d -p 主機端口:容器端口 -v 主機目錄:容器目錄 鏡像名稱
–name 啓動後的容器名稱
-i 交互模式運行
-t 分配一個僞終端,常與-i組合使用
-d 後臺運行
-v 指定掛卷目錄

  • 查看運行的容器
    docker ps
    查看所有的容器,包括歷史記錄
    docker ps -a
  • 停止容器
    docker stop 容器名或ID
  • 啓動容器
    docker start 容器名或ID
  • 查看日誌
    docker logs 容器名或ID
  • 進入容器
    docker exec -it 容器名 bash

6.製作鏡像

從官方下載的鏡像,往往需要我們自定義很多東西,而爲了能夠將我們自定義的東西保存下來,就是將其製作爲一個鏡像

更新鏡像:
docker commit -a 作者名 -m 描述信息 容器ID或名稱:版本 鏡像名
構建鏡像:
docker build -f 目錄文件 -t 鏡像名和版本 .
#-f 指定dockerfile文件路徑,不指定,默認Dockerfile
#-t 指定鏡像名稱和版本
#. 指當前目錄,這裏實際上需要一個上下文路徑
我打包了一個jar測試:

    #java基礎鏡像
    FROM java:8
    #作者
    MAINTAINER ali
    #複製文件到鏡像
    ADD sso-eureka-server-1.0-SNAPSHOT.jar /sso-eureka-server-1.0-SNAPSHOT.jar
    #暴露端口
    EXPOSE 8000
    #啓動後執行命令
    CMD ["java","-jar","sso-eureka-server-1.0-SNAPSHOT.jar"]
    #下面這句也是一樣的
    #ENTRYPOINT ["java","-jar","sso-eureka-server-1.0-SNAPSHOT.jar"]

構建:

docker build -f ./DockerFile -t sso-eureka .

運行:

docker run -itd -p 8000:8000 --name sso sso-eureka
在這裏插入圖片描述

7.dockerFile常用指令

  • FROM
    第一行必須是 FROM ,指定基礎鏡像

  • MAINTAINER
    作者信息

  • LABEL
    給鏡像指定元數據,可以有多個

  • COPY
    用於從宿主機複製文件到創建的新鏡像文件

    COPY <src>...<dest> 
    COPY ["<src>",..."<dest>"] 
    #<src>:要複製的源文件或者目錄,可以使用通配符
    #<dest>:目標路徑,即正在創建的image的文件系統路徑;建議<dest>使用絕對路徑,否則COPY指令則以WORKDIR爲其起始路徑
    

    注意:如果你的路徑中有空白字符,通常會使用第二種格式

    • 規則:

      • 必須是build上下文中的路徑,不能是其父目錄中的文件(當前目錄下)

      • 如果是目錄,則其內部文件或子目錄會被遞歸複製,但目錄自身不會被複制

      • 如果指定了多個,或在中使用了通配符,則必須是一個目錄,則必須以/符號結尾

      • 如果不存在,將會被自動創建,包括其父目錄路徑

  • ADD
    基本用法和COPY指令一樣,ADD支持使用TAR文件和URL路徑

    ADD <src>...<dest> 
    ADD ["<src>",..."<dest>"]
    
    • 規則:
      • 和COPY規則相同\如果爲URL並且沒有以/結尾,則指定的文件將被下載到
      • 如果是一個本地系統上壓縮格式的tar文件,它會展開成一個目錄;但是通過URL獲取的tar文件不會自動展開
      • 如果有多個,直接或間接使用了通配符指定多個資源,則必須是目錄並且以/結尾
  • WORKDIR
    用於爲Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定設定工作目錄,只會影響當前WORKDIR之後的指令。
    在Dockerfile文件中,WORKDIR可以出現多次,路徑可以是相對路徑,但是它是相對於前一個WORKDIR指令指定的路徑另外,WORKDIR可以是ENV指定定義的變量

  • VOLUME
    用來創建掛載點,可以掛載宿主機上的卷或者其他容器上的卷

  • EXPOSE
    用於給容器打開指定要監聽的端口以實現和外部通信
    語法:

    EXPOSE <port>[/<protocol>] [<port>[/<protocol>]...]
    

    protocol>用於指定傳輸層協議,可以是TCP或者UDP,默認是TCP協議

    EXPOSE可以一次性指定多個端口,例如:EXPOSE 80/tcp 80/udp

  • ENV

    用來給鏡像定義所需要的環境變量,並且可以被Dockerfile文件中位於其後的其他指令(如ENV、ADD、COPY等)所調用

    ENV <key> <value>
    ENV <key>=<value>...
    

    第一種格式中,之後的所有內容都會被視爲的組成部分,所以一次只能設置一個變量

    第二種格式可以一次設置多個變量,如果當中有空格可以使用 \ 進行轉義或者對加引號進行標識;另外 \ 也可以用來續行

  • CMD
    容器啓動時運行的命令

    CMD <command>
    CMD ["<executable>","<param1>","<param2>"]
    CMD ["<param1>","<param2>"]
    

    前兩種語法和RUN相同
    第三種語法用於爲ENTRYPOINT指令提供默認參數
    RUN和CMD區別:

    • RUN指令運行於鏡像文件構建過程中,CMD則運行於基於Dockerfile構建出的新鏡像文件啓動爲一個容器的時候
    • CMD指令的主要目的在於給啓動的容器指定默認要運行的程序,且在運行結束後,容器也將終止;不過,CMD命令可以被docker run的命令行選項給覆蓋
    • Dockerfile中可以存在多個CMD指令,但是隻有最後一個會生效
  • RUN
    指定docker build過程中運行的指令
    用法:

    RUN shell命令
    #這種寫法和上面不一樣
    RUN ["/bin/bash","-c","命令"]]
    
  • ENTRYPOINT
    類似CMD功能,用於指定容器默認運行的程序。

     ENTRYPOINT<command> ENTRYPOINT["<executable>","<param1>","<param2>"]
    

    和CMD不同的是ENTRYPOINT啓動的程序不會被docker run命令指定的參數所覆蓋,而且,這些命令行參數會被當做參數傳遞給ENTRYPOINT指定的程序(但是,docker run命令的–entrypoint參數可以覆蓋ENTRYPOINT)docker run命令傳入的參數會覆蓋CMD指令的內容並且附加到ENTRYPOINT命令最後作爲其參數使用同樣,Dockerfile中可以存在多個ENTRYPOINT指令,但是隻有最後一個會生效Dockerfile中如果既有CMD又有ENTRYPOINT,並且CMD是一個完整可執行命令,那麼誰在最後誰生效

8.推送鏡像

阿里雲官網:https://cr.console.aliyun.com/cn-hangzhou/repositories

  1. 創建命名空間

  2. 創建倉庫

  3. 訪問憑證設置密碼用於登錄
    在這裏插入圖片描述在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

  4. 登錄阿里雲Docker Registry

$ sudo docker login [email protected] registry.cn-hangzhou.aliyuncs.com

用於登錄的用戶名爲阿里雲賬號全名,密碼爲開通服務時設置的密碼。您可以在訪問憑證頁面修改憑證密碼。
2. 從Registry中拉取鏡像

$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/alry/sso:[鏡像版本號]

  1. 將鏡像推送到Registry

$ sudo docker login [email protected] registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/alry/sso:[鏡像版本號]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/alry/sso:[鏡像版本號]

請根據實際鏡像信息替換示例中的[ImageId]和[鏡像版本號]參數。

#docker網絡

Docker允許通過外部訪問容器或容器互聯的方式來提供網絡服務。

安裝Docker時,會自動安裝一塊Docker網卡稱爲docker0,用於Docker各容器及宿主機的網絡通信,網段爲172.0.0.1。

Docker網絡中有三個核心概念:沙盒(Sandbox)、網絡(Network)、端點(Endpoint)。

  • 沙盒,提供了容器的虛擬網絡棧,也即端口套接字、IP路由表、防火牆等內容。隔離容器網絡與宿主機網絡,形成了完全獨立的容器網絡環境。
  • 網絡,可以理解爲Docker內部的虛擬子網,網絡內的參與者相互可見並能夠進行通訊。Docker的虛擬網絡和宿主機網絡是存在隔離關係的,其目的主要是形成容器間的安全通訊環境。
  • 端點,位於容器或網絡隔離牆之上的洞,主要目的是形成一個可以控制的突破封閉的網絡環境的出入口。當容器的端點與網絡的端點形成配對後,就如同在這兩者之間搭建了橋樑,便能夠進行數據傳輸了。

8.1 Docker的四種網絡模式

Docker服務在啓動的時候會創建三種網絡,bridge、host和none,還有一種共享容器的模式container

Bridge

橋接模式,主要用來對外通信的,docker容器默認的網絡使用的就是bridge。

使用bridge模式配置容器自定的網絡配置

#配置容器的主機名 
docker run --name t1 --network bridge -h [自定義主機名] -it --rm busybox 
#自定義DNS 
docker run --name t1 --network bridge --dns 114.114 -it --rm busybox 
#給host文件添加一條 
docker run --name t1 --network bridge --add-host [hostname]:[ip] -it --rm busybox

Host

host類型的網絡就是主機網絡的意思,綁定到這種網絡上面的容器,內部使用的端口直接綁定在主機上對應的端口,而如果容器服務沒有使用端口,則無影響。

None

從某種意義上來說,none應該算不上網絡了,因爲它不使用任何網絡,會形成一個封閉網絡的容器

container

共享另外一個容器的network namespace,和host模式差不多,只是這裏不是使用宿主機網絡,而是使用的容器網絡

8.2 自定義docker0橋的網絡屬性信息

/etc/docker/daemon.json文件

{
"bip": "192.168.5.5/16",
"fixed-cidr": "10.20.0.0/16",
"fixed-cidr-v6": "2001:db8::/64",
"mtu": 1500,
"default-gateway": "10.20.1.1",
"default-gateway-v6": "2001:db8:abcd::89",
"dns": ["10.20.1.2","10.20.1.3"]
}

核心選項爲bip,即bridge ip之意,用於指定docker0橋自身的IP地址;其它選項可通過此地址計算得出

創建自定義的橋網絡
docker network create -d bridge --subnet "172.26.0.0/16" --gateway "172.26.0.1" mybr0

9.Docker Compose

Dockerfile模板文件來快速構建一個自己的鏡像並運行爲應用容器。但是在平時工作的時候,我們會碰到多個容器要互相配合來使用的情況,比如數據庫加上咱們Web應用等等。這種情況下,每次都要一個一個啓動容器設置命令變得麻煩起來,所以Docker Compose誕生了。

9.1 簡介

Compose的作用是“定義和運行多個Docker容器的應用”。使用Compose,你可以在一個配置文件(yaml格式)中配置你應用的服務,然後使用一個命令,即可創建並啓動配置中引用的所有服務。

Compose中兩個重要概念:

  • 服務 (service):一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例。
  • 項目 (project):由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml文件中定義。

9.2安裝

Compose項目是用Python寫的,可以使用Python-pip安裝,也可以通過GitHub下載二進制文件進行安裝。

通過Python-pip安裝

  1. 安裝Python-pip
    yum install -y epel-release
    yum install -y python-pip

  2. 安裝docker-compose
    pip install docker-compose

  3. 驗證是否安裝
    docker-compose --version

  4. 卸載
    pip uninstall docker-compose

通過GitHub鏈接下載安裝

  1. 1.通過GitHub獲取下載鏈接,以往版本地址:https://github.com/docker/compose/releases
curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  1. 給二進制下載文件可執行的權限
    chmod +x /usr/local/bin/docker-compose

  2. 可能沒有啓動程序,設置軟連接,比如:
    ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

  3. 驗證是否安裝
    docker-compose --version

  4. 卸載
    如果是二進制包方式安裝的,刪除二進制文件即可。
    rm /usr/local/bin/docker-compose

9.3 Docker-compose編寫

知識參考:https://www.cnblogs.com/minseo/p/11548177.html
通過定義一個docker-compse.yml模板文件來定義一組相關聯的應用容器爲一個項目。
標準的模板應該包含:version、services、networks三大部分,最關鍵的是services和networks兩個部分。
這裏借用《 持續集成篇四 搭建sonar》的步驟創建一個搭建soanrQube平臺的docker-compose.yml

version: '2'
services:
  pgdb2:
    image: postgres
    ports:
      - 5433:5432
    volumes:
      - /data/pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: "sonar"

  sonarqube2:
    image: sonarqube
    ports:
      - 9001:9000
    volumes:
      - /data/sonarqube2/conf:/opt/sonarqube/conf
      - /data/sonarqube2/data:/opt/sonarqube/data
      - /data/sonarqube2/logs:/opt/sonarqube/logs
      - /data/sonarqube2/extensions:/opt/sonarqube/extensions
    depends_on:
      - pgdb2
    links:
      - pgdb2:db
    environment:
      SONARQUBE_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONARQUBE_JDBC_USERNAME: sonar
      SONARQUBE_JDBC_PASSWORD: "sonar"
      ES_JAVA_OPTS: "-Xms1g -Xmx1g"
    container_name: sonarqube2

在這裏插入圖片描述

9.4 docker-compose.yml配置services下的屬性定義

該段是對上面yaml文件的解析和說明

image

指定服務的鏡像名稱或ID,如果本地不存在,則拉取

build

和image不同,image是基於鏡像,build是基於dockerFile;docker-compose必須定義image和build中的一個,其他都是可選的。
在version 1中,不允許同時使用image和build,但是version 2是可以的,如果指定了這兩個,那麼build出來的鏡像會打上image的標籤。
build目錄指定可以是絕對路徑,也可以是相對路徑。

commond

可以覆蓋容器啓動後默認執行的命令

container_name

compose的容器不指定名稱時的名稱格式是:<項目名稱>_<服務名稱>_<序號>
在這裏插入圖片描述

這裏的項目名稱在啓動時沒有指定則用默認的文件目錄名稱爲項目名。
使用該標籤指定名稱;

depends_on

啓動需要順序(依賴)的容器需要設置該屬性

links

這個和depends_on有些不同,links是連接到其他服務中的容器,詳細看註釋

#services下的服務(省略部分代碼)
#數據庫服務postgres
pgdb2:  
    image: postgres  
    ports:   
    #我這邊暴露的端口是5433,內部容器端口是5432,注意看下面的連接時5432
        - 5433:5432
    #sonarqube服務
 sonarqube2: 
    image: sonarqube 
    ports:    
    #暴露對外的端口,訪問9001
        - 9001:9000  
    #依賴postgres服務
    depends_on:    
        - pgdb2  
    #連接pgdb2服務內部容器
    links:   
    #鏈接到postgres數據庫,另起別名“db”
        - pgdb2:db  
    environment:    
    #請注意這裏連接的地址,我使用使用的是pgdb2的別名db,然後端口是pgdb2的內部端口,沒有使用外部端口
        SONARQUBE_JDBC_URL: jdbc:postgresql://db:5432/sonar

ports

端口映射

ports:
    - "8000:8000"

volumes

掛卷設置;

  • 指定一個路徑時,會在容器創建目錄
  • 指定兩個路徑:主機路徑:容器路徑
    • 主機路徑使用絕對路徑,則以compose配置文件坐在目錄路徑爲準
    • 用戶相對路徑:~/ 表示 /home/<用戶目錄>/ 或者是 /root/
   volumes:
   #容器內創建目錄
       - /var/lib/mysql
       #主機路徑映射到容器路徑
       - /opt/data:/var/lib/mysql
       #以compose當前目錄爲爲準
       - ./cache:/tmp/cache
       #以用戶路徑爲準
       - ~/configs:/etc/configs/:ro

expose

暴露端口,不做端口映射,僅指定容器端口。

expose:
    - "3000"

environment

環境變量:

environment: 
    POSTGRES_USER: sonar 
    #這裏不用引號也可以,如果中間有空格就需要使用雙引號
    POSTGRES_PASSWORD: "sonar"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章