1. 程式人生 > 實用技巧 >虛擬容器化學習----Docker學習

虛擬容器化學習----Docker學習

安裝前準備

  • yum install -y yum-utils device-mapper-persistent-data lvm2 安裝資料儲存驅動包 , 安裝yum工具
  • yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 設定安裝源
  • yum makecache fast yum自動檢測最快安裝源

安裝

yum -y install docker-ce 安裝docker開源社群版本

service docker start 啟動docker服務

檢測

docker version

檢視版本資訊

docker pull hello-world 下載docker hello-word

docker run hello-world

更換阿里雲的映象加速

  1. 登入阿里雲
  2. 搜尋映象加速器
  3. 根據相關操作文件操作即可
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [加速器地址]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker是什麼

Docker 是一種CS架構的軟體, Docker 是提供應用打包,部署於執行引用的容器平臺

docker 引擎包裹:

  1. docker 引擎
  2. docker REST API
  3. docker CLI

Docker 使用了HTTP 協議,docker的兼容於拓展很好

docker 結構

  • 客戶端:docker CLI
  • 通訊層:REST API
  • 引擎:docker daemon

容器與映象

映象: 映象是檔案,是隻讀的,提供了執行程式完整的軟硬體資源,是應用程式的集裝箱

容器: 映象的例項,由Docker負責建立,容器之間彼此隔離

docker 容器與映象在宿主機上的安裝路徑 /var/lib/docker

除非特殊需要,一般不建議修改預設安裝地址

Docker 常用命令

  • docker pull 映象名<:tags> - 從遠端倉庫抽取映象
    • tags:指定版本型別
  • docker images - 檢視本地映象
  • docker run 映象名 <:tags> - 建立容器,啟動應用
    • 如果在執行run的時候,映象在沒有pull到本地的話docker會先去pull latest 版本的映象 latest 版本為使用最多的版本
    • tags:指定版本型別
  • docker ps - 檢視正在執行中的映象
  • docker rm <-f> 容器id - 刪除容器
    • 如果容器在執行的情況下 <-f> 強制刪除
  • docker rmi <-f> 映象名<:tags> - 刪除映象
    • 如果映象存在且有容器在執行的情況下 <-f> 強制刪除
    • tags:指定版本型別
  • docker stop 容器id - 停止容器
  • docker exec [-it ] 容器id linux 命令...[bash || /bin/bash]
    • exec 在容器內部執行命令
    • -it 使用互動的方式執行命令

PS

  • hub.docker.com docker 遠端中央倉庫

  • 在開發中可以使用 -f 強制移除,但是在開發環境中不能這麼做,-f 相當於強制關機。

  • docker hub 一般有圖片或者映象名為需要的軟體名一般是官方提供的。其他的通常是有第三方或個人提供的。第三方的一般不推薦,除非你對它非常瞭解

Docker 宿主機與容器通訊

docker run -p 宿主機埠:容器內部埠 -d 容器名

  • -p 埠對映
  • -d 後臺執行

檢視

容器生命週期

DockerFile 構建映象

什麼是Dockerfile

  • DockerFile 是一個包含用於組合映象的命令的文字文件
  • Docker通過讀取Dockerfile中的指定命令按步自動生成映象
  • docker build -t 機構/映象名<:tags> Dockerfile 目錄

Docker 的分層(Docker layer)

docker file 在構建的過程中,每一步都會建立一個臨時容器,這個臨時容器是隻讀的,好處:臨時容器在使用的時候的好處在於可以共用。

列如

  1. 構建一個普通的Dockerfile

  2. 對Dockerfile重新進行編輯

修改完之後重新build,之後輸出如下

它使用了快取,這裡看到沒有使用快取的是由輸出的。使用快取的是沒有輸出的

Dockerfile 基礎命令

  • FROM 容器版本 基於基準映象

    • 儘量使用官方提供的BASE Image
    • FROM scratch 不依賴任何基準映象
  • MAINTAINER 作者 沒有執行含義,只是說明名作者

  • LABEL XXX="XXX" 描述性資訊

  • WORKDIR 容器目錄 切換工作目錄 , 如果當前目錄不存在的時候,會自動建立這個目錄

    • 這個目錄是通過我們的docker exec -it 程序號 bash 進入來的

  • 儘量使用絕對路徑

  • ADD 宿主機目錄 容器目錄 將宿主機的目錄全部複製到容器目錄中

    • ADD xxx.gz / 新增根目錄並解壓縮
    • ADD 除了複製,還具備新增遠端檔案功能
  • ENV XXX /XXX/XXX 設定環境常量

    • ENV JAVA_HOME /usr/local/openjdk8
    • RUN ${JAVA_HOME}/bin/java -jar XXX.jar
    • 儘量使用環境常量,可提高程式的維護性
  • RUN&&CMD&&ENTRYPOINT

    • RUN 在構建映象時執行命令(修改映象內部的檔案)
    • CMD|ENTRYPOINT 在容器建立時執行命令(對容器中的檔案進行操作)

RUN 構建時執行

  • 命令格式 RUN yum install -y vim # Shell
  • 命令格式 RUN ["yum","install","-y","vim"] #Exec
    • 在分不清的情況下推薦使用

Shell 執行方式

  1. 使用Shell執行時,當前shell 時父程序,生成一個子shell程序
  2. 在子shell中執行指令碼,指令碼執行完畢,退出子shell程序,回到當前shell

Exec 執行方式

  1. 使用Exec方式,會用Exec程序替換當前程序,並保持PID不變
  2. 執行完畢,直接退出,並不會退回之前的程序環境

ENTRYPOINT 啟動命令

  • ENTRYPOINT (入口點) 用於在容器啟動時執行命令
  • Dockerfile中只有最後一個ENTRYPOINT會被執行
  • 推薦使用Exec格式

CMD 預設命令

  • CMD 用於設定預設執行的命令
    • 如Dockerfile中出現多個CMD,則只有最後一個被執行
    • 如容器啟動時附加指令,則CMD被忽略
    • 推薦使用Exec命令格式
    • 若容器啟動時有其他的引數,CMD 將不會執行

當我們使用下面這種情況啟動容器時CMD將不會被執行,這裡可以配合ENTRYPOINT一起使用。

Dockerfile 使用例子

使用Dockerfile 構建redis

FROM centos
# 安裝C編譯元件
RUN ["yum","install","-y","gcc","gcc-c++","net-tools","make"]
WORKDIR /usr/local
ADD redis-5.0.5.tar.gz .
WORKDIR /usr/local/redis-5.0.5/src
RUN make && make install
WORKDIR /usr/local/redis-5.0.5
ADD redis.conf .
EXPOSE 6379
CMD ["redis-server","redis.conf"]
  • 構建映象

docker build -t xxx/xxx:1.0 .

  • 啟動容器

docker run -p 7000:6379 xxx/xxx:1.0

容器間的單向訪問

docker 內部每個容器都會有一個虛擬ip

docker inspect id 顯示容器的原資料

ip放再netSetting中。

在容器間通訊的時候不能使用ip進行通訊,這個虛擬ip會變動的。

這時我們可以通過對容器取個名字

docker run -d --name xxx 映象

在沒有配置的情況下,ip預設時互通的,但是別名時無法訪問得

若要能使用別名訪問需要在啟動的時候新增額外的引數

docker run -d --name xxx --link 別名 映象名

Bridge 網橋雙向通訊

docker 環境下的網橋能夠直接連結到宿主機的物理網絡卡上,配置了網橋後,容器內部可以直接訪問到公網上的資料了。

網橋還可以實現docker容器網路上的分組,只要繫結在同一個網橋上,這是容器在網路層面進行了分組。在同一個網橋上,天然互通。

  • docker network ls :列出docker網路服務
  • docker network create -d bridge 網橋名稱 建立網橋
  • docker network connect 網橋名稱 容器名稱 容器與網橋繫結

Volume 容器間資料共享

在宿主機上開個空間,所有容器可以讀取這個空間上的檔案

  1. 通過設定-v掛在宿主機目錄

    docker run --name 容器名 —v 宿主機路徑:容器內掛在路徑 映象名

  2. 通過--volumes-from 共享容器內掛載點

    1. 建立共享容器docker create --name 共享容器名 -v /xx/xx:/xx/xx 鏡映象名 /bin/true
    2. 共享容器掛載點 docker run --volumes-from 共享容器名 --name xxx -d 映象名

DockerCompose容器編排

docker 官方為我們提供的容器編排工具時docker compose

我們可以使用docker compose對一組容器進行編排,讓他們有順序的建立。有順序的啟動。

  • Docker Compose 單機多容器部署工具
  • 通過yml檔案定義多容器如何部署
  • WIN/MAC 預設提供Docker Compose, Linux 需要安裝

安裝

由於是github 所以下載會比較慢

https://docs.docker.com/compose/install/

安裝後若出現

Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/doc

這種情況的問題則是版本不對,需要去官網下載對應版本的docker-compose然後手動替換掉

docker-compose官網:https://github.com/docker/compose/releases/

/usr/local/bin/ 路徑下的docker-compose 刪除

重新上傳正確版本的docker-compose

授權chmod +x /usr/local/bin/docker-compose