第一節:docker簡介、下載和配置鏡像加速器、以及鏡像和容器的使用


一. docker簡介

1. docker背景

 我們在實際開發中,會接觸到多個環境,比如:開發環境、測試環境、生產環境。經常會出現程序員在本機上運行好用的代碼,遷移到測試環境中不好用了; 測試環境校驗沒問題的程序發布到生產環境中又出錯了,然后開發、測試、運維各方人員開始扯皮,干架,出現這種情況,很大的一個原因是不同環境下所安裝的Runtime時版本不同,比如開發環境中安裝的是 .Net Core 3.1 ,而測試環境中安裝的是.Net Core 2.2 ; 再比如測試環境中安裝的是JDK8,生產環境中安裝的是JDK7,就會產生“水土不服”的問題,從而報錯。

 

   docker的誕生就是為了解決這種軟件跨環境遷移而出現的水土不服的問題。將發布包和運行環境一起打包在一個容器中進行遷移,就解決上述問題。

 

2. docker相關概念

 Docker 是一個開源的應用容器引擎誕生於 2013 年初,基於 Go 語言實現, dotCloud 公司出品(后改名為Docker Inc)

 Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上。

 容器是完全使用沙箱機制,相互隔離,容器性能開銷極低

 Docker 從 17.03 版本之后分為 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版)

 

3. 鏡像、容器、倉庫

(1). 鏡像(Image):就相當於是一個 root 文件系統。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 文件系統。

          就像軟件安裝包。我們可以把鏡像拉(pull)下來,增加我們的更改,然后發布(push)成新的鏡像,別人也可以下載我們發布的鏡像,然后繼續更改,繼續發布;

(2). 容器(Container):鏡像安裝后運行的實例;同一個鏡像可以在同一台服務器上安裝成多個容器,同一個鏡像可以同時裝在多個不同的服務器上

PS:鏡像和容器的關系,就像是面向對象程序設計中的類和對象一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。

(3). 倉庫(Repository):倉庫可看成一個代碼控制中心,用來保存鏡像,有公有倉庫和私有倉庫之分。常見的docker的官方倉庫、阿里雲、騰訊雲等等。

 

4. 相關地址

 docker官網:https://www.docker.com/

 鏡像官方地址:https://hub.docker.com/    (可以去搜索各種鏡像,查詢鏡像的版本號等)

 

二. 下載和配置鏡像加速器

1. docker的安裝

(1). yum 包更新到最新  (可省略這一步!!更新比較慢

【sudo yum update】

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

【sudo yum install -y yum-utils device-mapper-persistent-data lvm2】

(3). 設置yum源

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

(4). 安裝docker,出現輸入的界面都按 y  (在指令中加入  -y的話,一路安裝不需要確認了)

下載最新版本:sudo yum install -y docker-ce docker-ce-cli containerd.io

                     或 【sudo yum install -y docker-ce】 這里發現我只安裝docker-ce的時候,docker-ce-cli 和 containerd.io這兩個工具也都給安裝了,所以這兩個指令等效

eg:失敗截圖(或者安裝完以后無法啟動,建議先安裝containerd.io ,再安裝 docker-ce ,docker-ce-cli ,詳見下面)

根據提示執行命令: sudo yum install -y docker-ce docker-ce-cli containerd.io --nobest】 或sudo yum install  -y docker-ce docker-ce-cli containerd.io --skip-broken】 完成下載  (下載比較慢,大約10min)

下載中截圖:

在centos8系統中,上述步驟可能還不行,需要先單獨安裝一下containerd.io,

sudo yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.13-3.1.el7.x86_64.rpm

然后再重新執行一下docker的安裝指令 【sudo yum install -y docker-ce docker-ce-cli】

 

(5). 查看docker版本,驗證是否驗證成功

【docker -v】

 

2. docker相關指令

(1). 啟動docker:【sudo systemctl start docker】

(2). 停止docker:【sudo systemctl  stop docker

(3). 重啟docker:【sudo systemctl restart docker

(4). 查看docker服務狀態:sudo systemctl  status docker

(5). 設置開機啟動docker:sudo systemctl  enable docker

 

3. 配置鏡像加速器

(1). 默認鏡像的下載地址是:https://hub.docker.com/  國外的,下載慢的要死,我們可以把它配置成國內的鏡像,常見的有以下這幾種:

  USTC:中科大鏡像加速器(https://docker.mirrors.ustc.edu.cn)

  阿里雲:注冊登錄后查看  (推薦!!!)

  網易雲:注冊登錄后查看

  騰訊雲:注冊登錄后查看

(2) . 配置阿里雲的鏡像加速器(都類似)

A. 登錄阿里雲--------進入控制台------搜索容器鏡像服務並進入-------選擇鏡像加速器--------復制地址

B. 進入Linux系統

(1). 打開配置文件: 【vi /etc/docker/daemon.json】 默認是空的

(2). 復制下面代碼到上面的文件里,進行保存

{ "registry-mirrors": ["https://阿里雲復制的地址"] }

(3). 執行相關重啟命令:【sudo systemctl daemon-reload 】和【sudo systemctl restart docker

簡單方法(推薦)

  直接去阿里雲那復制整段代碼,copy到Linux系統,敲回車一步搞定。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ijmr3it2.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

 

 

三. 鏡像和容器的使用

1. 鏡像

A 相關指令:

(0). 構建鏡像:docker build -t  <imageName>:版本號 .      (注:最后是一個空格和一個點, 版本號可以省略)

ps:如果Dockerfile文件不在當前目錄,或者重命名了,需要通過 -f參數指定路徑。  eg:【docker build -f ./ypfcentos_Dockerfile -t ypfcentos:1.0 .    】  

(1). 搜索鏡像: docker search imageName

(2).下載鏡像:docker pull <imageName> 

     下載指定版本號的鏡像:docker pull imageName:版本號

PS:鏡像可以去這個網站上找:https://hub.docker.com ,版本號也上這找。

(3). 查看所有映像:docker images   【等價 docker image ls】

(4). 查看所有鏡像ID:docker images –q

(5). 刪除指定鏡像:docker rmi <imageid  或 imageName>

(6). 刪除全部鏡像:docker rmi $(docker images -q)

(7). 刪無標簽鏡像:docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

B. 案例:

(1). 刪除系統中nginx鏡像 和 redis 鏡像(分別通過name 和 ID)

(2). 下載5.7版本的MySql鏡像

 先去倉庫中查詢一下有沒有5.7這個版本,經查詢是有的, 然后進行下載即可。

2. 容器

A. 相關指令:

(1). 運行容器:docker run 各種參數 <imageName>    

PS:當本機一個鏡像存在多個版本的時候需要加上版本號:  docker run 各種參數 <imageName>:版本號

參數說明:

--name:指定容器名稱  eg:   --name=ypf  或者 --name ypf  都行

-i:保持容器運行。通常與 -t  或 -d同時使用。

-t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用,容器創建后自動進入容器中,退出容器后,容器自動關閉

-d:以守護(后台)模式運行容器。創建一個容器在后台運行,需要使用docker exec 進入容器。退出后,容器不會關閉。

  -it 創建的容器一般稱為交互式容器,-id 創建的容器一般稱為守護式容器

-p:指定端口映射  eg: -p 5001:80 (其中5001表示docker主機《即linux系統》對外開放的端口,80表示容器對外開放的端口-dockerFile中)

-P:暴露所有端口 

 常用組合:

【docker run -it --name=xxx  <imageName>】: 以交互式創建容器,容器創建后自動進入容器中,退出容器后,容器自動關閉

【docker run -id --name xxx  <imageName>:7】:以守護時創建容器,並且制定使用鏡像的版本為7, i可以省略

【docker run --name xxx -id -p 5001:80 <imageName>】: 以守護時創建容器,並做端口映射,linux端口5001,容器端口為80

(2). 查看運行容器:docker ps      【等價  docker container ls】

      查看所有容器:docker ps -a  

(3). 進入容器內部:docker exec -it <containerId> /bin/bash       (可省略bin,簡介寫法  【docker exec -it <containerId> bash】)

注:這里不能 -id

(4). 退出當前容器:exit

(5). 啟動一個容器:docker start  <containerId  或 containerName>

(6). 停止一個容器:docker stop $(docker ps -q)

      停止一個容器:docker stop $(docker ps -q)

(7). 刪除單個容器:docker rm <containerId  或 containerName>    (加個 -f 可以強制刪除啟動的容器

   刪除所有容器:docker rm $(docker ps -aq)

(8). 查看容器信息:docker inspect  <containerName>

(9). 查看容器日志:

docker logs [OPTIONS] 容器name/ID
  Options:
        --details        顯示更多的信息
    -f, --follow         跟蹤實時日志
        --since string   顯示自某個timestamp之后的日志,或相對時間,如42m(即42分鍾)
        --tail string    從日志末尾顯示多少行日志, 默認是all
    -t, --timestamps     顯示時間戳
        --until string   顯示自某個timestamp之前的日志,或相對時間,如42m(即42分鍾)

假設容器的名字為test1

 A. 查看最近20分鍾內的所有日志 

docker logs --since 20m  test1】

 B. 查看最近20分鍾內的最新的100條日志

docker logs --since 20m --tail 100 test1】

 C. 查看最近20分鍾內的最新的100條日志,並實時監控后續日志

docker logs -f --since 20m --tail 100 test1】

 D. 查詢某個時間段內的日志

docker logs --since="2020-09-17" test1】   查詢20200917后的所有日志

docker logs --since="2020-09-17"  --until="2020-09-18" test1】查詢20200917-20200918之間的日志

B. 案例:

(1). 用交互式的方式創建一個名為myCentos1的容器,查看是否直接進入容器,退出后容器是否關閉。

(2). 指定端口的用法

【docker run -id --name=ypfwebapicontainer1 -p 8000:9000 ypfwebapi1】 

(3). 隨機所有端口的用法

 【docker run -id --name=test1 -P ypfwebapi1】

 

 

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鵬飛)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 聲     明1 : 如有錯誤,歡迎討論,請勿謾罵^_^。
  • 聲     明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM