學習Docker,這裏沒有廢話

1. 初識Docker

1.1 Docker概念

  • Docker是一個開源的應用容器引擎。
  • Docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後發佈到任何流行的Linux機器上。
  • 容器是完全使用沙箱機制,相互隔離的,並且其性能開銷較低。

1.2 安裝Docker

Dcoker可以運行在MAC、Windows、Linux等操作系統上,這裏演示在CentOS 7的安裝過程。Docker官網:https://www.docker.com/,安裝過程如下:

# 1、yum 包更新到最新 
yum update
# 2、安裝需要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的 
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 設置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安裝docker,出現輸入的界面都按 y (這個步驟需要一定的時間,可能會失敗,失敗後重新執行)
yum install -y docker-ce
# 5、 查看docker版本,驗證是否驗證成功
docker -v

1.3 Docker架構

在這裏插入圖片描述

  • 鏡像(Images):鏡像是一個靜態的概念,它類似於面向對象程序設計中的類。
  • 容器(Container):如果鏡像是一個類的話,那麼容器就是該類的一個對象。容器是鏡像運行時的實體,容器可以被創建、啓動、停止、刪除和暫停等。
  • 倉庫(Registry):倉庫是用來保存鏡像的,和Maven的倉庫是一個意思。

1.4 配置Docker鏡像加速器

默認情況下,docker會從docker hubhttps://hub.docker.com/)上下載鏡像,但是docker hub的訪問太慢。一般我們都會配置鏡像加速器。我們以配置阿里雲鏡像加速器舉例:

  • 登錄阿里雲官方網站
    在這裏插入圖片描述

  • 登錄成功之後,找到“容器鏡像服務”功能
    在這裏插入圖片描述

  • 如果是第一次使用該功能,可能提示你開通服務
    在這裏插入圖片描述

  • 然後我們就可以看到左下角有個鏡像加速器的菜單了,點擊根據裏面的操作文檔進行配置即可。
    在這裏插入圖片描述

2. Docker命令

2.1 進程相關命令

  • 啓動docker服務
systemctl start docker
  • 停止docker服務
systemctl stop docker
  • 重啓docker服務
systemctl restart docker
  • 查看docker服務狀態
systemctl status docker
  • 設置開機啓動docker服務
systemctl enable docker

2.2 鏡像相關命令

  • 查看鏡像、查看本地所有的鏡像
docker images
docker images -q # 查看所有鏡像
  • 搜索鏡像:從網絡中查找需要的鏡像
docker search 鏡像名稱
  • 拉取鏡像:從Docker倉庫下載鏡像到本地,鏡像名稱格式爲:名稱:版本號,如果版本號不指定則是最新的版本。
docker pull 鏡像名稱:版本號
  • 刪除本地鏡像
docker rmi 鏡像id
docker rmi `docker images -q` #刪除所有本地鏡像

2.3 容器相關命令

  • 查看容器
# 查看正在運行的容器
docker ps
# 查看所有容器
docker ps -a
  • 創建並啓動容器
docker run 參數

參數說明:

-i:保持容器運行,通常與-t參數同時使用。加入it這兩個參數後,容器創建後自動進入容器中,退出容器後,容器自動關閉。

-t:爲容器重新分配一個僞輸入終端,通常與-i參數同時使用。

-d:以守護進程運行容器。創建一個容器在後臺進行,需要使用docker exec進入容器,退出容器後,容器不會關閉。

–name:爲創建的容器命名。

  • 進入容器
docker exec 參數 # 退出容器,容器不會關閉
  • 停止容器
docker stop 容器名稱
  • 啓動容器
docker start 容器名稱
  • 刪除容器:如果容器是運行狀態則刪除失敗,需要先停止容器才能刪除
docker rm 容器名稱
  • 查看容器信息
docker inspect 容器名稱

3. Docker容器數據卷

3.1 數據卷概念及作用

思考以下三個問題:

  1. Docker容器刪除後,在容器中產生的數據還在嗎?
  2. Docker容器和外部機器可以會直接交換文件嗎?
  3. 容器之間可以進行數據交互嗎?

上面三個問題的答案都是否定的。

針對第一個問題:容器都刪除了,那麼容器中的數據自然就不在了。

針對第二個問題:假設我們在Windows裝了個Linux虛擬機,然後在Linux虛擬機中啓動了一個docker容器,那麼此時Windows是無法和容器直接進行文件交換的。

針對第三個問題:容器是相互隔離的,彼此無法直接進行數據交互。

那麼要解決上面三個問題,就需要用到數據卷。

1)數據卷的概念

  • 數據卷是宿主機中的一個目錄或文件。
  • 當容器目錄和數據卷目錄綁定後,對方的修改會立即同步。
  • 一個數據卷可以被多個容器同時掛載。
  • 一個容器也可以掛載多個數據卷。

2)數據卷的作用

  • 容器數據持久化
  • 外部機器和容器間接通信
  • 容器之間數據交換

3.2 配置數據卷

3.2.1 設置數據卷

在這裏插入圖片描述

在創建啓動容器時,使用-v參數設置數據卷:

docker run ... -v 宿主機目錄(文件):容器內目錄(文件)...

注意事項:

  • 目錄必須是絕對路徑
  • 如果目錄不存在,會自動創建
  • 可以掛載多個數據卷(使用多個-v參數配置即可)

3.3 配置數據卷容器

在這裏插入圖片描述

  1. 創建啓動c3數據卷容器,使用-v參數設置數據卷

    docker run -it --name=c3 -v /volume centos:7 /bin/bash
    
  2. 創建啓動c1、c2容器,使用–volumes-from參數設置數據卷

    docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
    docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
    

4. Dockerfile

4.1 Docker鏡像原理

  • Linux文件系統的組成

在這裏插入圖片描述

Linux文件系統由bootfs和rootfs兩部分組成:

(1)bootfs:包含bootloader(引導加載程序)和 kernel(內核)。

(2)rootfs: root文件系統,包含的就是典型 Linux 系統中的/dev,/proc,/bin,/etc等標準目錄和文件。

不同的linux發行版,bootfs基本一樣,而rootfs不同,如ubuntu,centos等。

  • Docker鏡像原理
    在這裏插入圖片描述

(1)Docker鏡像是由特殊的文件系統疊加而成。

(2)一個鏡像可以放在另一個鏡像的上面,位於下面的鏡像成爲父鏡像,最底部的鏡像成爲基礎鏡像。

4.1.1 鏡像製作

(1)將容器轉爲鏡像

# 將容器轉爲鏡像
docker commit 容器id 鏡像名稱:版本號
# 將鏡像保存成壓縮文件
docker save -o 壓縮文件名稱 鏡像名稱:版本號
# 從壓縮文件加載鏡像
docker load -i 壓縮文件名稱

(2)通過Dockerfile製作鏡像

4.2 Dockerfile概念及作用

在這裏插入圖片描述

Dockerfile是一個文本文件,它包含了一條條的指令。每一條指令構建一層,基於基礎鏡像,最終構建出一個新的鏡像。

對於開發人員:可以爲開發團隊提供一個完全一致的開發環境;對於測試人員:可以直接拿開發時所構建的鏡像或者通過Dockerfile文件構建一個新的鏡像開始工作了;對於運維人員:在部署時,可以實現應用的無縫移植。

4.3 Dockerfile關鍵字

關鍵字 作用 備註
FROM 指定父鏡像 指定dockerfile基於那個image構建
MAINTAINER 作者信息 用來標明這個dockerfile誰寫的
LABEL 標籤 用來標明dockerfile的標籤 可以使用Label代替Maintainer 最終都是在docker image基本信息中可以查看
RUN 執行命令 執行一段命令 默認是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”]
CMD 容器啓動命令 提供啓動容器時候的默認命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”]
ENTRYPOINT 入口 一般在製作一些執行就關閉的容器中會使用
COPY 複製文件 build的時候複製文件到image中
ADD 添加文件 build的時候添加文件到image中 不僅僅侷限於當前build上下文 可以來源於遠程服務
ENV 環境變量 指定build時候的環境變量 可以在啓動的容器的時候 通過-e覆蓋 格式ENV name=value
ARG 構建參數 構建參數 只在構建的時候使用的參數 如果有ENV 那麼ENV的相同名字的值始終覆蓋arg的參數
VOLUME 定義外部可以掛載的數據卷 指定build的image那些目錄可以啓動的時候掛載到文件系統中 啓動容器的時候使用 -v 綁定 格式 VOLUME [“目錄”]
EXPOSE 暴露端口 定義容器運行的時候監聽的端口 啓動容器的使用-p來綁定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR 工作目錄 指定容器內部的工作目錄 如果沒有創建則自動創建 如果指定/ 使用的是絕對地址 如果不是/開頭那麼是在上一條workdir的路徑的相對路徑
USER 指定執行用戶 指定build或者啓動的時候 用戶 在RUN CMD ENTRYPONT執行的時候的用戶
HEALTHCHECK 健康檢查 指定監測當前容器的健康監測的命令 基本上沒用 因爲很多時候 應用本身有健康監測機制
ONBUILD 觸發器 當存在ONBUILD關鍵字的鏡像作爲基礎鏡像的時候 當執行FROM完成之後 會執行 ONBUILD的命令 但是不影響當前鏡像 用處也不怎麼大
STOPSIGNAL 發送信號量到宿主機 該STOPSIGNAL指令設置將發送到容器的系統調用信號以退出。
SHELL 指定執行腳本的shell 指定RUN CMD ENTRYPOINT 執行命令的時候 使用的shell

5. Docker應用部署

5.1 部署MySQL

  1. 搜索mysql鏡像

    docker search mysql
    
  2. 拉取mysql鏡像

    docker pull mysql:5.6
    
  3. 創建並啓動容器,設置端口映射、目錄映射

    docker run -id \
    -p 3306:3306 \
    --name=mysql \
    -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \
    -v /usr/local/docker/mysql/logs:/logs \
    -v /usr/local/docker/mysql/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    mysql:5.6
    
  4. 進入容器,操作mysql

    docker exec -it mysql /bin/bash
    
  5. 登錄mysql,就可以操作mysql數據庫了

    mysql -uroot -p123456
    

5.2 部署Tomcat

  1. 搜索tomcat鏡像

    docker search tomcat
    
  2. 拉取tomcat鏡像

    docker pull tomcat
    
  3. 創建並啓動容器,設置端口映射、目錄映射

    docker run -id \
    -p 8080:8080 \
    --name tomcat \
    -v /usr/local/docker/tomcat:/usr/local/tomcat/webapps \
    tomcat
    
  4. 到數據卷目錄中,創建index.html

    # 1.進入數據卷目錄
    cd /usr/local/docker/tomcat
    # 2.創建test目錄
    mkdir test
    # 3.創建index.html文件
    echo "Hello, this is tomcat container from docker" > index.html
    
  5. 瀏覽器訪問tomcat
    在這裏插入圖片描述

5.3 部署Nginx

  1. 搜索nginx鏡像

    docker search nginx
    
  2. 拉取nginx鏡像

    docker pull nginx
    
  3. 創建並啓動容器,設置端口映射、目錄映射

    docker run -id \
    --name=nginx \
    -p 80:80 \
    -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v /usr/local/docker/nginx/logs:/var/log/nginx \
    -v /usr/local/docker/nginx/html:/usr/share/nginx/html \
    nginx
    
  4. 瀏覽器訪問nginx

5.4 部署Redis

  1. 搜索redis鏡像

    docker search redis
    
  2. 拉取redis鏡像

    docker pull redis:5.0
    
  3. 創建容器,設置端口映射

    docker run -id --name=redis -p 6379:6379 redis:5.0
    
  4. 使用外部機器連接redis

    ./redis-cli.exe -h 192.168.1.17 -p 6379
    

6. Docker服務編排

微服務架構的應用系統中一般包含若干個微服務,每個微服務一般都會部署多個實例,如果每個微服務都要手動啓停,維護的工作量會很大。

  • 要從Dockerfile build image或者去docker hub拉取image
  • 要創建多個container
  • 要管理這些container(啓動、停止、刪除)

而服務編排就是:按照一定的業務規則批量管理容器。

6.1 Docker Compose

Docker Compose是一個編排多容器分佈式部署的工具,提供命令集管理容器化應用的完整開發週期,包括服務構建,啓動和停止。使用步驟:

  1. 利用Dockerfile 定義運行環境鏡像
  2. 使用docker-compose.yml定義組成應用的各服務
  3. 運行docker-compose up 啓動應用

6.2 安裝Docker Compose

# Compose目前已經完全支持Linux、Mac OS和Windows,在我們安裝Compose之前,需要先安裝Docker。下面我 們以編譯好的二進制包方式安裝在Linux系統中。 
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 設置文件可執行權限 
sudo chmod +x /usr/local/bin/docker-compose
# 查看版本信息 
docker-compose -version

6.3 卸載Docker Compose

# 二進制包方式安裝的,刪除二進制文件即可
rm /usr/local/bin/docker-compose

6.4 使用Docker Compose

我們以編排Nginx+SpringBoot項目舉例,該SpringBoot項目裏有一個HelloController類,目標是通過Nginx代理訪問/hello
在這裏插入圖片描述

  • 創建Spring Boot項目的Dockerfile文件
FORM java:8
MAINTAINER root <[email protected]>
ADD /usr/soft/springboot-hello-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar
  • 製作Spring Boot項目鏡像
docker build -f /usr/local/docker/docker-compose/Dockerfile -t app
  • 編寫docker-compose.yml
version: '3'
services:
  nginx:
   image: nginx
   ports:
    - 80:80
   links:
    - app
   volumes:
    - ./nginx/conf.d:/etc/nginx/conf.d
  app:
    image: app
    expose:
      - "8080"
  • 創建./nginx/conf.d目錄,並別寫app.conf文件
mkdir -p ./nginx/conf.d

# app.conf
server {
    listen 80;
    access_log off;

    location / {
        proxy_pass http://app:8080;
    }
   
}
  • 使用docker-compose 啓動容器
docker-compose up
  • 測試訪問
http://192.168.1.17/hello

7. Docker私有倉庫

Docker官方的Docker hub(https://hub.docker.com)是一個用於管理公共鏡像的倉庫,我們可以從上面拉取鏡像 到本地,也可以把我們自己的鏡像推送上去。但是,有時候我們的服務器無法訪問互聯網,或者你不希望將自己的鏡像放到公網當中,那麼我們就需要搭建自己的私有倉庫來存儲和管理自己的鏡像。

7.1 私有倉庫搭建

# 1、拉取私有倉庫鏡像 
docker pull registry
# 2、啓動私有倉庫容器 
docker run -id --name=registry -p 5000:5000 registry
# 3、打開瀏覽器,輸入地址http://私有倉庫服務器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有倉庫搭建成功
# 4、修改daemon.json   
vim /etc/docker/daemon.json    
# 在上述文件中添加一個key,保存退出。此步用於讓 docker 信任私有倉庫地址;注意將私有倉庫服務器ip修改爲自己私有倉庫服務器真實ip 
{"insecure-registries":["私有倉庫服務器ip:5000"]} 
# 5、重啓docker服務 
systemctl restart docker
docker start registry

7.2 將鏡像上傳至私有倉庫

# 1、標記鏡像爲私有倉庫的鏡像     
docker tag centos:7 私有倉庫服務器IP:5000/centos:7
# 2、上傳標記的鏡像     
docker push 私有倉庫服務器IP:5000/centos:7

7.3 從私有倉庫拉取鏡像

#拉取鏡像 
docker pull 私有倉庫服務器ip:5000/centos:7

8. Docker相關概念

容器就是將軟件打包成標準化單元,以用於開發、交付和部署。

  • 容器鏡像是輕量的、可執行的獨立軟件包 ,包含軟件運行所需的所有內容:代碼、運行時環境、系統工具、系統庫和設置。
  • 容器化軟件在任何環境中都能夠始終如一地運行。
  • 容器賦予了軟件獨立性,使其免受外在環境差異的影響,從而有助於減少團隊間在相同基礎設施上運行不同軟件時的衝突。

8.1 Docker容器虛擬化與傳統虛擬機比較

相同:

  • 容器和虛擬機具有相似的資源隔離和分配優勢。

不同:

  • 容器虛擬化的是操作系統,虛擬機虛擬化的是硬件。
  • 傳統虛擬機可以運行不同的操作系統,容器只能運行同一類型操作系統。
    在這裏插入圖片描述
——End——
更多精彩分享,可掃碼關注微信公衆號哦。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章