天天看點

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

作者:大剛測試開發實戰

【docker 簡介】

一、什麼是docker

官方位址:https://docs.docker.com/

Docker 是一個基于go語言開發的開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實作虛拟化。

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

二、docker核心概念

docker三大核心概念:鏡像 Image、容器 Container、倉庫 Repository

  • 鏡像(Image):Docker 鏡像(Image),就相當于是一個 root 檔案系統。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 檔案系統。
  • 容器(Container):鏡像(Image)和容器(Container)的關系,就像是面向對象程式設計中的類和執行個體一樣,鏡像是靜态的定義,容器是鏡像運作時的實體。容器可以被建立、啟動、停止、删除、暫停等。基于鏡像可以建立容器,同一個鏡像可以建立多個容器;
docker 面向對象
容器 對象
鏡像
  • 倉庫(Repository):倉庫可看成一個代碼控制中心,用來儲存鏡像。鏡像存放在倉庫中,可以從倉庫中拉取。
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

三、docker架構及原理

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法
  • Docker 使用用戶端-伺服器 (C/S) 架構模式,使用遠端API來管理和建立Docker容器。
  • 架構上可以分為用戶端和服務端;
  • Docker Daemon是docker的守護程序;
  • containerd是容器運作的程序,是實作容器的核心;
  • 用戶端通過内部的API和服務端的守護程序進行互動,守護程序再通過containerd分發到各個容器;
概念 說明
Docker 鏡像(Images) Docker 鏡像是用于建立 Docker 容器的模闆。基于鏡像可以建立容器,同一個鏡像可以建立多個容器;
Docker 容器(Container) 容器是獨立運作的一個或一組應用,是鏡像運作時的實體。
Docker 用戶端(Client) Docker 用戶端通過指令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 與 Docker 的守護程序通信。
Docker 主機(Host) 一個實體或者虛拟的機器用于執行 Docker 守護程序和容器。
Docker Registry

Docker 倉庫用來儲存鏡像,可以了解為代碼控制中的代碼倉庫。

鏡像倉庫分為公共鏡像倉庫Docker Hub和一些私有化部署的倉庫比如:Harbor(這兩種類似于github和gitlab)

Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用。

一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個标簽(Tag);每個标簽對應一個鏡像。

通常,一個倉庫會包含同一個軟體不同版本的鏡像,而标簽就常用于對應該軟體的各個版本。我們可以通過 <倉庫名>:<标簽> 的格式來指定具體是這個軟體哪個版本的鏡像。如果不給出标簽,将以 latest 作為預設标簽。

Docker Machine Docker Machine是一個簡化Docker安裝的指令行工具,通過一個簡單的指令行即可在相應的平台上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

四、docker輕量級的實作原理

docker容器本質上是主控端的程序,Docker通過namespace實作了資源隔離,通過cgroups實作了資源限制,通過寫時複制機制(copy-on-write)實作了高效的檔案操作。

namespace資源隔離

linux核心提拱了6種namespace隔離的系統調用:

namespace 系統調用參數 隔離内容
UTS CLONE_NEWUTS 主機名或域名 (since Linux 2.6.19)
IPC CLONE_NEWIPC 信号量、消息隊列和共享記憶體(since Linux 2.6.19)
PID CLONE_NEWPID 程序編号(since Linux 2.6.24)
Network CLONE_NEWNET 網絡裝置、棧、端口等(since Linux 2.6.24)
Mount CLONE_NEWNS 挂載點(檔案系統)(since Linux 2.6.24)
User CLONE_NEWUSER 使用者組和使用者組(started in Linux 2.6.23 and completed in Linux 3.8)

五、docker的優缺點

1.優點

  • 更高效利用系統資源
  • 更快速的啟動時間
  • 一緻的運作環境
  • 持續傳遞和部署
  • 更輕松的遷移

2.缺點

  • Docker是基于Linux 64bit的,無法在32bit的 linux/Windows/unix環境下使用
  • Docker并非适合所有應用場景,Docker隻能虛拟基于 Linux的服務
  • Docker執行個體是無狀态的,不會儲存目前操作行為的資料:容器銷毀後,再次建立容器不會儲存之前的資料,一種方法是通過資料挂載技術将資料挂載到主控端指定目錄來解決此問題,另一種方法是通過docker commit指令來基于已有容器建構為新的鏡像,進而達到環境持久化的目的。

【docker 安裝與啟動】

一、docker安裝與啟動

1.安裝docker的幾種方式

1)安裝最新版本docker

① 先解除安裝舊版本的docker

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine           

② 指定Docker下載下傳源(可選,适用于首次安裝)

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

③ 安裝Docker(預設安裝最新版本)

yum install -y docker-ce docker-ce-cli containerd.io           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

④ 驗證是否安裝成功

docker version           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

2)安裝指定版本的docker

yum list docker-ce --showduplicates | sort -r  # 檢視所有可用版本
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io  # 安裝指定版本           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

3)通過腳本一鍵安裝docker

腳本内容如下:

#!/bin/bash
echo "set default docker install repo"
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
echo "install docker ..."
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl status docker           

2.啟動docker

systemctl start docker  # 啟動服務
systemctl status docker  # 檢視狀态
systemctl stop docker  # 停止服務
systemctl restart docker  # 重新開機服務           

二、建立第一個docker容器

1.建立容器

按照國際慣例,先運作一個hello-world的容器

docker run hello-world

# 如果網絡等一切正常的話,會出現如下提示,表示容器已經建立成功
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:18a657d0cc1c7d0678a3fbea8b7eb4918bba25968d3e1b0adebfa71caddbc346
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/           

2.檢視容器

docker ps -a  # 檢視所有容器

# 建立成功,容器清單中就會有hello-world的容器,但名字不是hello-world,因為我們在運作容器時并未指定名稱
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
a07f1a8ea1a4   hello-world   "/hello"   21 seconds ago   Exited (0) 20 seconds ago             adoring_chatterjee           

三、解除安裝docker

1.正常方式解除安裝

① 停止docker服務

systemctl stop docker           

② 搜尋已經安裝的docker安裝包

yum list installed | grep docker
rpm -qa | grep docker
yum -y remove docker-ce.x86_64 
yum -y remove docker-ce-cli.x86_64 
yum -y remove containerd.io.x86_64           

③ 移除所有相關安裝包

yum -y remove contained.io.x86_64           

④ 删除docker鏡像及相關檔案夾

rm -rf /var/lib/docker           

2.腳本解除安裝

所謂的使用腳本安裝和解除安裝,通俗了解就是把上述多個操作步驟的指令放在一個腳本中批量執行,内容如下:

#!/bin/bash
systemctl stop docker
yum -y remove docker-ce.x86_64
yum -y remove docker-ce-cli.x86_64
yum -y remove containerd.io.x86_64
rm -rf /var/lib/docker
rm -rf /etc/docker/daemon.json           

【docker 常用操作指令】

一、鏡像操作指令

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法
指令 說明
pull 拉取鏡像
search 搜尋相關鏡像
tag 重命名鏡像
rmi 删除鏡像
images 或 image ls 檢視所有鏡像
build 基于Dockerfile建構鏡像
commit 基于已有容器建構鏡像

1.拉取鏡像

使用"docker pull 鏡像名稱",拉取遠端倉庫的鏡像到本地(先校驗本地是否存在,本地不存在時再預設從官網拉取最新版本的鏡像)

以busybox為例:

BusyBox 是一個內建了三百多個最常用Linux指令和工具的軟體。BusyBox 包含了一些簡單的工具,例如ls、cat和echo等等,還包含了一些更大、更複雜的工具,例grep、find、mount以及telnet。有些人将 BusyBox 稱為 Linux 工具裡的瑞士軍刀。簡單的說BusyBox就好像是個大工具箱,它內建壓縮了 Linux 的許多工具和指令,也包含了 Linux 系統的自帶的shell。

docker pull busybox  # 拉取鏡像           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

在拉取鏡像前,也可以通過docker search指令搜尋不同類型的鏡像

docker search busybox  # 搜尋相關鏡像           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

2.檢視鏡像

使用 "docker image ls" 或 "docker images" 指令檢視本地已經存在的鏡像

docker images  # 檢視所有鏡像
docker images | grep busybox  # 檢視指定鏡像           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

3.修改鏡像名稱

使用 "docker tag 原始鏡像名稱 新名稱" 指令重命名鏡像,如:docker tag busybox:latest mybusybox:V1.0,重命名鏡像會新增一條鏡像,相當于建立了一個副本,但ID相同。

docker tag busybox:latest mybusybox:V1.0           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

4.删除鏡像

使用 "docker rmi 鏡像名稱" 指令删除無用鏡像,通過鏡像名稱删除,隻會删除指定名稱的鏡像;通過鏡像ID删除,會删除所有ID相同的鏡像。

docker rmi mybusybox:V1.0
docker rmi -f ff4a8eb070e1           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

二、容器操作指令

容器操作指令:

指令 說明
create 建立容器
run 運作容器,run = pull + create + start
exec...-it...sh 進入容器内部
start 啟動容器
restart 重新開機容器
stop 停止容器
rm 删除容器
commit 基于已有容器建構鏡像
ps 檢視容器狀态:
  • docker ps -a:檢視所有容器
  • docker ps -l:檢視最近操作的容器
logs 檢視容器日志:
  • docker logs 容器名:檢視指定容器的運作日志
  • docker logs -f 容器名:實時檢視指定容器的運作日志

容器操作相關參數:

指令 說明
--name 指定容器名稱:
  • --name=容器名
  • --name 容器名
-d 背景運作
-p 映射端口,主控端端口:容器端口,例如:
  • -p 3307:3306
-v 挂載目錄到本地,主控端目錄:容器目錄,例如:
  • -v /usr/local/nginx:/usr/local/nginx
--restart 自動重新開機,例如:
  • --restart=always,跟随docker服務的重新開機而重新開機

1.建立容器

docker create (--name=容器名) 鏡像名,例如:

docker create --name=mybusybox busybox           

2.檢視容器狀态

docker ps -a  # 檢視所有容器
docker ps -a | grep mybusybox  # 過濾檢視指定容器
docker ps -l  # 檢視最近操作的容器           

通過create指令建立完成後的容器是"Created"狀态的,可以通過start指令來啟動容器

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

3.啟動容器

docker start mybusybox           

4.進入容器

通過"docker exec -it 容器名 sh"指令進入容器内部,例如:

docker exec -it mybusybox sh           

5.運作容器

docker run = docker pull + docker create + docker start

docker run --name=mynginx -d -p 81:80 nginx           

6.停止容器

docker stop 容器名或容器ID,例如:

docker stop mybusybox
docker stop 6fbf5a7a580b           

7.删除容器

docker rm 容器名或容器ID,删除前要先停止容器,例如:

docker stop mybusybox
docker rm mybusybox
docker rm 6fbf5a7a580b           

8.檢視容器日志

  • docker logs 容器名或容器ID:以檔案形式檢視日志,類似 cat;
  • docker logs 容器名或容器ID:實時檢視日志,類似 tail -f;

例如:

docker logs sonic_sonic-server-controller_1
docker logs -f sonic_sonic-server-controller_1           

9.基于已有容器建構為新的鏡像模闆

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

用法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS 釋義
-a 标注作者資訊
-c 使用Dockerfile指令來生成鏡像
-m 送出說明資訊,類似于git commit -m "xxxx"
-p 在送出時,暫停容器

例如:目前有個需求,将目前伺服器上正在運作的一個容器,無痕遷移到另一台伺服器上運作。意味着需要執行以下步驟:

将目前正在運作的容器建構為新的鏡像A>>将新鏡像A的鏡像檔案複制到另一台伺服器或直接将鏡像A送出到鏡像倉庫>>在另一台伺服器上将鏡像A從鏡像倉庫下載下傳下來>>基于鏡像A建立容器并運作

① 打包容器

為了便于示範,先将一個檔案複制到已有容器内

docker cp jdk_install.sh mysql:/home           

② 檢視容器内檔案

docker exec -it mysql sh           

可以看到,已經将jdk_install.sh檔案複制到了mysql容器的/home目錄下:

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

③ 基于容器建構新的鏡像

docker commit -a "chenjigang" mysql new-mysql           

通過"docker images"指令檢視目前鏡像清單,可以看到名為new-mysql的鏡像:

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

④ 基于新鏡像運作容器

docker run -d --name new-mysql-container -e MYSQL_ROOT_PASSWORD=123456 -p 3308:3306 new-mysql           

⑤ 檢視容器内檔案

docker exec -it new-mysql-container sh           

通過下圖可以看出,之前複制到容器内的jdk_install.sh檔案,已經儲存到鏡像中、并跟随出現在新的容器内:

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

【docker 使用技巧】

一、更換鏡像源

1.配置檔案路徑:/etc/docker/daemon.json,若不存在則建立此檔案

{
        "registry-mirrors":[
        "http://registry.docker-cn.com",
        "http://docker.mirrors.ustc.edu.cn",
        "http://hub-mirror.c.163.com",
        "http://cr.console.aliyun.com/",
        "https://8wb4g36l.mirror.aliyuncs.com"
]
}           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

2.配置完成後重新開機docker服務

systemctl restart docker.service           

二、更換存儲目錄

docker安裝完成後,預設存儲路徑為/var/lib/docker。建立容器後,每個容器的資料卷容量上限與/var/lib/docker所在的挂載的磁盤大小有關。例如下圖所示:挂載的磁盤大小為50GB,則docker容器資料卷上限就是50GB,如果有多個容器,則這些容器共享50GB的容量,而且同時也與挂載磁盤下的其他目錄共享使用。那麼如果運作的容器數量較多,或是遇到需要存儲大量資料如gitlab這類容器,50G顯然就有些捉襟見肘。此時可以通過修改docker存儲路徑的方式擴容容器的容量上限。特别提一句,docker存儲路徑最好盡早修改,這樣可以避免後期因磁盤寫滿導緻的各種容器運作異常問題。

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

三種方式修改docker存儲路徑,分别為:

1.方式一:修改docker配置檔案

編輯docker配置檔案

vi /usr/lib/systemd/system/docker.service           

使用"--graph"或"-g"參數指定存儲位置

ExecStart=/usr/bin/dockerd --graph /home/docker_home           

修改完成後重新加載配置檔案并重新開機docker服務

// reload配置檔案 
systemctl daemon-reload 
 
// 重新開機docker
systemctl restart docker.service           

2.方式二:建立daemon.json檔案

docker1.12或以上版本,可以建立或修改daemon.json檔案來指定存儲位置。docker檢視版本指令“docker version”

vi /etc/docker/daemon.json           

在最後添加graph字段,定義docker目錄

{
        "registry-mirrors":[
        "http://registry.docker-cn.com",
        "http://docker.mirrors.ustc.edu.cn",
        "http://hub-mirror.c.163.com",
        "http://cr.console.aliyun.com/",
        "https://8wb4g36l.mirror.aliyuncs.com"
],
        "graph": "/home/docker_home"
}
           

修改完成後同樣需要重新加載配置檔案、重新開機docker服務

systemctl daemon-reload
systemctl restart docker.service           

3.方式三:建立軟連結(推薦)

前兩種方式适用于首次安裝docker後沒有pull過鏡像、建立過容器。即使修改了存儲路徑,因為沒有鏡像和容器,是以也不會産生任何影響。

建立軟連結的方式,适用于已經建立過容器、并且容器已經産生資料的情況。這種方式可以避免對鏡像及現有容器資料造成破壞,以及更改存儲路徑後找不到資料的情況。具體步驟如下:

① 檢視docker路徑

預設情況下Docker的存放位置為:/var/lib/docker,也可以通過如下指令檢視docker存儲路徑

docker info | grep "Docker Root Dir"           

② 停掉docker服務

systemctl stop docker           

③ 移動docker目錄

mv /var/lib/docker /home/docker_home           

③ 建立軟連結

  • /home/docker_home為源檔案目錄,也就是新設定的docker存儲目錄
  • /var/lib/docker為軟連結目标目錄,與此目錄建立連結後,相當于原來的docker配置保持不變,但真正的存儲目錄是其背後所指向的/home/docker_home
ln -s /home/docker_home /var/lib/docker           

④ 啟動docker服務

systemctl start docker           

修改完成後,我們可以通過以下指令檢視docker的存儲目錄:

docker info | grep "Root Dir"  
# 修改成功會傳回以下内容:
# Docker Root Dir: /home/docker_home           

檢視/var/lib/目錄,docker目錄是一個軟連結,指向/home/docker_home,配置正确。

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

三、修改時區

1.建立容器時設定時區

建立時增加映射使用主機時區

-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime           

2.建立容器後修改時區

① 檢視主控端時區

通過date -R指令可以看出,主控端的時區為東八區,檢視/etc/localtime,可以看出localtime實際上是一個軟連結,背後指向的是/usr/share/zoneinfo/Asia/Shanghai

[root@test_host home]# date -R
Thu, 08 Sep 2022 11:05:37 +0800
[root@test_host home]# ls -l /etc/localtime
lrwxrwxrwx. 1 root root 35 8月  29 17:17 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai           

② 拷貝本地時區到docker容器内部

docker cp /usr/share/zoneinfo/Asia/Shanghai docker.ui:/etc/localtime           

③ 進入容器内部檢視時區

docker exec -it docker.ui sh  # 進入docker.ui容器
ls /etc  # 檢視/etc下是否存在已經複制的localtime檔案
date -R  # 檢視時區           

通過下圖可以看出,/etc下已經存在了主控端複制過來的localtime檔案,時區為東八區,已經修正。

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

四、拷貝檔案

主要用到"docker cp"指令

1.從主控端拷貝到容器

docker cp 主控端檔案路徑 容器名:目錄,例如:

docker cp redis_log mysql:/home           

2.從容器内拷貝到主控端

docker cp 容器名:檔案路徑 主控端目錄,例如:

docker cp mysql:/home/mayfly-go.sql /home/           

五、常見問題解決

1.容器報錯ipv4網絡不可用

運作容器時報錯

如果是容器運作直接報這個錯, 解決方式:

① 在主控端上執行

echo "net.ipv4.ip_forward=1" >>/usr/lib/sysctl.d/00-system.conf             

② 重新開機network和docker服務

systemctl restart network
systemctl restart docker           

建立容器時報錯

“WARNING: IPv4 forwarding is disabled. Networking will not work.”

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

如果是運作鏡像、建立容器的時候報這個錯,則直接重新開機docker服務:

systemctl restart docker           

【docker 一鍵快速搭建環境】

1.docker一鍵搭建Jenkins

# 拉取鏡像
docker pull jenkins
# 運作容器
docker run -d --name=jenkins -v /home/jenkins:/var/jenkins_home -p 8088:8080 -u root --restart=always jenkins           

前台通路:http://192.168.1.122:8088/

注意:首次通路需輸入密碼,主控端上密碼檔案路徑為 /home/jenkins/secrets/initialAdminPassword,或是進入容器内檢視:/var/jenkins_home/secrets/initialAdminPassword

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

初始化完成後,原始密碼檔案自動删除:

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

2.docker一鍵搭建Gitlab

# 拉取鏡像
docker pull gitlab/gitlab-ce
# 建立gitlab環境變量
export GITLAB_HOME=/home/gitlab
# 運作容器
docker run -d --name=gitlab -u root --restart=always -v $GITLAB_HOME/config:/etc/gitlab -v $GITLAB_HOME/logs:/var/log/gitlab -v $GITLAB_HOME/data:/var/opt/gitlab -p 443:443 -p 8081:80 -p 2222:22 gitlab/gitlab-ce           

http://192.168.1.122:8081/ 首次通路會提示修改密碼,使用者名為 root

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

3.docker一鍵搭建Nginx

官網位址:https://hub.docker.com/_/mysql

# 拉取鏡像
docker pull nginx
# 運作容器
docker run -d --name mynginx -p 81:80 nginx           

浏覽器端通路:http://192.168.1.123:81/

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

4.docker一鍵搭建MySQL

官網位址:https://hub.docker.com/_/mysql

# 拉取鏡像
docker pull mysql
# 運作容器
docker run -d -e MYSQL_ROOT_PASSWORD=123456 --name=mymysql -p 3307:3306 mysql
# 進入mysql容器
docker exec -it mysql sh
# 登入mysql
mysql -uroot -p123456           

mysql指令行操作

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

使用工具連接配接mysql資料庫

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

5.一鍵搭建RabbitMQ

# 拉取鏡像
docker pull rabbitmq:3.7-management
# 啟動容器
docker run --name=rabbitmq -d --restart always -p 15672:15672 -p 5672:5672 -v /home/rabbitmq:/var/lib/rabbitmq rabbitmq:3.7-management           

注:如果docker pull rabbitmq後面不帶management,啟動rabbitmq後是無法打開管理界面的,是以我們需要下載下傳帶management插件的rabbitmq

浏覽器端通路:http://192.168.1.123:15672/,登入賬号和密碼都是:guest

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

【dockerfile 定制鏡像】

一、Dockerfile是什麼?

1.簡介

Dockerfile 是一個用來建構鏡像的文本檔案,文本内容包含了一條條建構鏡像所需的指令和說明。

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

2.作用

Dockerfile的作用:定制鏡像,所謂定制鏡像,就是以一個鏡像為基礎,在其上進行定制,豐富功能、提前作一些配置等。

二、Dockerfile常用指令

1.常用指令釋義

指令 說明
FROM 指定基礎鏡像
MAINTAINER 增加說明資訊,如維護者姓名郵箱等,非必須
RUN 執行具體的linux指令(用于建構鏡像時執行相關的指令)
USER 基于哪個使用者運作容器
ADD 将本地的檔案添加到鏡像内(支援正規表達式拷貝,支援更多的檔案類型的拷貝,如網絡檔案的下載下傳後拷貝,ADD http://xxxx/test.tar.gz /test/)
COPY 将本地檔案拷貝到鏡像内(隻支援基本的檔案、檔案夾的拷貝,推薦使用COPY),最好将要拷貝的檔案置于Dockerfile同一目錄下
WORKDIR 目錄切換指令,類似于linux的cd指令WORKDIR /home/jenkins_home/conf 等同于以下指令:
  • WORKDIR /home
  • WORKDIR jenkins_home/conf
EXPOSE 指定容器監聽的端口,僅作為說明,不會真正生效,還是需要使用docker run -p參數進行端口映射
CMD 類似于RUN指令,差別與CMD是在啟動容器時執行相關的指令,CMD echo "hello world" 或 ['ECHO','hello world']都可以,推薦使用後者清單形式
ENTRYPOINT 指定ENTRYPOINT參數後,使用docker run xxxx 啟動容器時,docker run 後面的參數不會被覆寫
ENV 指定運作容器時的環境變量,格式為 KEY=VALUE或KEY VALUE,如ENV VERSION=2.0在後續指令中可以使用$VERSION進行替換2.0
VOLUME 資料棧聲明,做匿名挂載用,假設指令為VOLUME /usr/local,則在啟動容器後會在伺服器上docker預設路徑/var/lib/docker/volumes/下自動生成一個檔案夾,用于挂載/usr/local,常用于執行docker run指令時忘記指定-v 參數,進而自動儲存一些重要的資料時使用

2.'CMD'、'ENTERPOINT'、'docker run xxx' 三者之間的差別與聯系

  • 若指定了CMD ['ECHO','hello world'],同時使用了docker run -p 8080:80 xxx,則docker run 後面的參數會覆寫CMD後面的指令;
  • 若指定了ENTRYPOINT ['nginx'],同時使用了docker run -p 8080:80 xxx,則會把docker run 後面的參數作為參數傳遞給ENTRYPOINT,與ENTRYPOINT後面的參數拼接起來;
  • 若CMD ['ECHO','hello world'],同時指定了ENTRYPOINT ['nginx'],則會把CMD後的參數作為參數傳遞給ENTRYPOINT,與ENTRYPOINT後面的參數拼接起來;

總結:CMD相對更為靈活,使用者可以通過docker run 更改dockerfile中CMD的指令,而ENTRYPOINT則更為單一,使用docker run指令行參數啟動容器時無法修改dockerfile中ENTRYPOINT的指令;

3.Dockerfile示例

自定義Dockerfile

# 基于centos7鏡像
FROM centos:7

# 維護者資訊
MAINTAINER "chenjigang"

# 基于root使用者運作容器
USER root

# 運作指令
RUN echo "test dockerfile..."
RUN mkdir -p /home/docker_home

# 本地複制檔案到鏡像内
COPY docker_install.sh /home/docker_home/docker_install.sh

# 切換目錄
WORKDIR /home/docker_home
RUN ls -al

RUN yum install -y net-tools
RUN ifconfig           

mysql示例

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

三、從Dockerfile建構鏡像

Dockerfile 建立完成後,可以使用 docker build 指令根據 Dockerfile 建構一個鏡像。Docker build常用的指令包括兩個參數:

  • -t 指定鏡像的名字
  • -f 顯示指定建構鏡像的 Dockerfile 檔案,若目前操作目錄與Dockerfile檔案處于同一目錄,則使用.也可以,否則需使用 -f 參數指定Dockerfile檔案路徑(注:Dockerfile 命名為非固定命名,可更改)

基于上面第一個Dockerfile送出建構:

# 運作目前目錄下的Dockerfile檔案,生成一個名為mycentos7的鏡像
docker build -t mycentos7 .           

如下圖所示,運作docker build建構鏡像指令後,正在按照上述自定義的Dockerfile中的步驟順序執行:

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

從下圖可以看出,已經成功建構了一個鏡像:mycentos7:latest

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

檢視鏡像清單,存在新建構的鏡像mycentos7:

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

基于mycentos7鏡像建立一個容器:

docker run -it --name mycentos7 mycentos7:latest sh           

此時,啟動容器,進入鏡像shell環境内會發現Dockerfile檔案中定義的指令已生效:

  • 指定的docker_install.sh已複制到mycentos鏡像的/home/docker_home檔案夾下;
  • net-tools工具已提前安裝成功,"ifconfig"指令可以正常執行;
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

四、Dockerfile建構鏡像原理

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

每多一行指令,鏡像就會多一層

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

【docker-compose 容器編排】

一、Docker-Compose介紹

1.簡介

Docker-Compose項目是Docker官方的開源項目,負責實作對Docker多容器編排管理系統。使用 Docker-compose,可以用一個 YAML 檔案定義一組要啟動的容器,以及容器運作時的屬性。 Docker-Compose的工程配置檔案預設為docker-compose.yml

項目位址:https://github.com/docker/compose

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

2.Docker-Compose前世今生

Docker Compose 的前身是 Fig,現階段 Docker Compose 是 Docker 官方的單機多容器管理系統(不能跨機器),它本質是一個Python 腳本,它通過解析使用者編寫的 yaml 檔案,調用 Docker API 實作動态的建立和管理多個容器。

二、Docker-Compose安裝

1.使用curl指令安裝(推薦)

# 下載下傳 Docker Compose 的安裝包
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 修改 Docker Compose 執行權限
sudo chmod +x /usr/local/bin/docker-compose           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

2.使用PIP安裝

需提前安裝Python環境

pip install -U docker-compose           

三、Docker-Compose常用指令組成

Docker Compose 檔案主要分為三部分: services(服務)、networks(網絡) 和 volumes(資料卷)

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

1.常用指令說明

指令 說明
image 鏡像名稱,基于哪個鏡像,使用現有的鏡像
build 使用自定義的鏡像,若目前docker-compose.yml和Dockerfile在同一路徑下,則build的鍵值用 . 也可以,若不在同一路徑下,或Dockerfile檔案不是用的預設名稱Dockerfile,則需指定Dockerfile的路徑
command 啟動鏡像時用的指令,類似于Dockerfile中的CMD指令
container_name 容器名稱
depends_on 指定服務啟動順序,如存在多個服務nginx、db、Jenkins時,則在Jenkins服務下定義depends_on: db,會優先啟動db服務
links 解決容器之間的連結,使用db可以連結到db服務,使用别名test_db也可以
ports 指定端口,端口映射時使用,類似于docker指令中的-p參數
volumes 資料挂載時使用,類似于docker指令中的-v參數

2.docker-compose.yml示例

支援四種命名格式:docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml

sonic私有雲真機平台:http://192.168.1.20:3000/Index/Devices

下面就以前面分享過的《開源雲真機平台-Sonic應用實踐》中的sonic服務的docker-compose.yml為例,一起來看看上述指令的用法:

version: '3'  # 版本
services:  # 服務,
  sonic-server-eureka:  # 容器名(sonic微服務注冊中心)
    image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-server-eureka:v1.5.0-release"
    hostname: sonic-server-eureka
    environment:  # 環境,讀取配置檔案中eureka的使用者名密碼等
      - SONIC_EUREKA_USERNAME
      - SONIC_EUREKA_PASSWORD
      - SONIC_EUREKA_PORT
      - SONIC_EUREKA_HOST=sonic-server-eureka
    volumes:  # 目錄映射
      - ./logs/:/logs/
    networks:  # 網絡名
      - sonic-network
    ports:  # 端口映射
      - "${SONIC_EUREKA_PORT}:${SONIC_EUREKA_PORT}"
  sonic-server-gateway:  # 容器名(sonic微服務網關)
    image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-server-gateway:v1.5.0-release"
    hostname: sonic-server-gateway
    environment:  # 同樣也是一些環境配置,用于和eureka容器通信
      - SONIC_EUREKA_USERNAME
      - SONIC_EUREKA_PASSWORD
      - SONIC_EUREKA_PORT
      - SONIC_EUREKA_HOST=sonic-server-eureka
      - SECRET_KEY
      - EXPIRE_DAY
    volumes:
      - ./logs/:/logs/
    depends_on:  # 指定服務啟動順序,先啟動sonic-server-eureka容器
      - sonic-server-eureka
    networks:  # 網絡,各個容器必須處于同一網絡下才能互相通信
      - sonic-network
    restart: on-failure
  sonic-server-controller:  # 容器名
    image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-server-controller:v1.5.0-release"
    environment:  # 環境配置,讀取資料庫、賬号等配置
      - SONIC_EUREKA_USERNAME
      - SONIC_EUREKA_PASSWORD
      - SONIC_EUREKA_PORT
      - SONIC_EUREKA_HOST=sonic-server-eureka
      - MYSQL_HOST
      - MYSQL_PORT
      - MYSQL_DATABASE
      - MYSQL_USERNAME
      - MYSQL_PASSWORD
      - SONIC_SERVER_HOST
      - SONIC_SERVER_PORT
      - SECRET_KEY
      - EXPIRE_DAY
      - REGISTER_ENABLE
      - NORMAL_USER_ENABLE
      - LDAP_USER_ENABLE
      - LDAP_USER_ID
      - LDAP_BASE_DN
      - LDAP_BASE
      - LDAP_USERNAME
      - LDAP_PASSWORD
      - LDAP_URL
    networks:
      - sonic-network
    volumes:
      - ./logs/:/logs/
    depends_on:
      - sonic-server-eureka
    restart: on-failure
  sonic-server-folder:
    image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-server-folder:v1.5.0-release"
    environment:
      - SONIC_EUREKA_USERNAME           

通過上述配置我們能夠發現,docker-compose.yml這個配置檔案,就是由前面我們介紹的一個個指令按照一定的格式、順序、規則進行排列、相結合組成,進而實作不同容器的排編,互相通信,進而實作強大的功能。

四、Docker-Compose操作指令

用法:

Define and run multi-container applications with Docker.

Usage:

docker-compose [-f <arg>...] [--profile <name>...] [options] [--] [COMMAND] [ARGS...]

docker-compose -h|--help

1.docker-compose操作指令

官方所有指令

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

常用指令

指令 說明
up 啟動容器編排(前提是目前目錄存在docker-compose.yml檔案)
down 删除容器編排,适用于docker-compose.yml檔案發生變更、或安裝出錯時的解除安裝重裝
ps 檢視所有服務狀态,類似于docker ps -a
start 啟動服務
stop 指定服務啟動順序,如存在多個服務nginx、db、Jenkins時,則在Jenkins服務下定義depends_on: db,會優先啟動db服務
logs 檢視docker-compose記錄檔

2.docker-compose操作參數

官方所有選項

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

常用選項

參數 說明
-f 指定yml檔案啟動,目前目錄下不存在docker-compose.yml檔案時使用
-d 背景運作

3.容器編排操作實踐

啟動容器編排

docker-compose up # 啟動容器(前提是目前目錄存在docker-compose.yml檔案)
docker-compose -f docker-compose.yml up -d  # 指定yml檔案啟動并設定背景運作           

啟動容器編排:建立網絡>>建立并運作各個容器>>各個容器之間建立連接配接

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

在使用"docker-compose up"和"docker-compose down"指令時,若目前目錄下不存在以下四種中的任一格式檔案:docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml,或也未使用-f參數指定其他檔案時,會報錯提示:

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

删除容器編排

docker-compose down           

删除容器編排:停止各個容器>>移除各個容器>>删除容器建立的網絡

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

檢視容器狀态

docker-compose ps  # 檢視所有服務狀态,類似于docker ps -a           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

啟動服務

# docker-compose start  啟動所有服務
# docker-compose start [SERVICE...]    啟動指定服務
docker-compose start           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

停止服務

# docker-compose stop    停止所有服務
# docker-compose stop [options] [SERVICE...]    停止指定服務
docker-compose stop           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

與down指令不同,stop隻會停止相關容器,但不會删除相關容器

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

檢視日志

docker-compose logs           

五、利用Docker Compose搭建wordpress部落格系統

前面對一些常用指令作了說明,以及通過sonic前背景服務的docker-compose.yml案例對容器編排作了簡單介紹,下面我們結合一個docker-compose搭建WordPress的案例來搭建我們自己的容器編排服務,官方配置檔案内容如下:

1.配置docker-compose.yml

官網位址:https://docs.docker.com/compose/wordpress/

services:
  db:
    # We use a mariadb image which supports both amd64 & arm64 architecture
    image: mariadb:10.6.4-focal
    # If you really want to use MySQL, uncomment the following line
    #image: mysql:8.0.27
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=somewordpress
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    expose:
      - 3306
      - 33060
  wordpress:
    image: wordpress:latest
    volumes:
      - wp_data:/var/www/html
    ports:
      - 88:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress
volumes:
  db_data:
  wp_data:           

【注意】

  • 上述配置内容是可以自由修改的,并不一定要按照它的來,比如我本地就有MySQL,那就不需要再配置一個mysql或mariadb的容器
  • yml檔案中冒号後面要帶空格,嚴格規範格式

2.檢視容器狀态

docker-compose ps -a           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

3.前端通路

啟動docker-compose,各個容器處于up狀态,此時就可以通路前端頁面,http://192.168.1.123:88/,會先進行安裝配置,如:設定資料庫、站點取名

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

個人部落格首頁如下:

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

因為我是内網伺服器,隻能在區域網路内通路,公網無法通路。如果你有一台帶有公網的雲伺服器,如阿裡雲,那麼妥妥的就可以搭建自己的個人網站了,這種對伺服器要求不高,入門級的就可以。現在的雲伺服器都挺便宜,一年才幾十塊錢,像阿裡雲伺服器個人使用者可以免費體驗一個月。關于WordPress詳細搭建方法可以參考我前面介紹的《用2核2G的華為雲伺服器搭建WordPress部落格系統》

【docker 鏡像倉庫】

在前面的文章中,我們介紹了如何定制鏡像、容器編排,但仿佛對鏡像管理并沒有提及,那麼鏡像檔案我們是否可以像管理代碼一樣實作push、pull的操作呢?答案是有的,docker-hub就是一款公共倉庫,在上面可以搜尋到别人建立好的各種各樣的鏡像,以及管理自己的鏡像;Harbor是一款私有化鏡像倉庫,我們可以把鏡像上傳上去,同一内網下的其他使用者均可以下載下傳使用,因為是部署在自己的伺服器,是以對于安全性這方面更有保障。docker-hub和Harbor的關系我們可以類比成GitHub和Gitlab。

一、公共鏡像倉庫Docker-hub

1.docker-hub簡介

公共鏡像倉庫一般是 Docker 官方或者其他第三方組織(阿裡雲,騰訊雲,網易雲等)提供的,允許所有人注冊和使用的鏡像倉庫。Docker Hub 是全球最大的鏡像市場,目前已經有超過 10w 個容器鏡像。

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

2.送出鏡像到倉庫

具體步驟:新增賬號>>登入>>建立倉庫>>>linux指令行docker登入>>修改鏡像名稱(保持與倉庫名稱一緻)>>送出鏡像到倉庫

① 建立鏡像倉庫

類似于github上建立代碼倉庫,分為public(公開的,網際網路可見)和private(受保護的,盡自己可見)兩種。

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

② Linux指令行登入Docker賬号

docker login  # 登入docker-hub           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

③ 修改鏡像名稱,保持與鏡像倉庫一緻

docker tag joinsunsoft/docker.ui:latest chenjigang/auto-test:v1.1           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

④ 送出鏡像到公共倉庫

docker push chenjigang/auto-test:v1.1           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

⑤ 檢視鏡像倉庫

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

二、私有化鏡像倉庫Harbor

1.Harbor簡介

Harbor是由VMware公司開源的企業級的Docker Registry管理項目,它包括權限管理(RBAC)、LDAP、日志稽核、管理界面、自我注冊、鏡像複制和中文支援等功能。

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

作為一個企業級私有 Registry 伺服器,Harbor 提供了更好的性能和安全。提升使用者使用 Registry 建構和運作環境傳輸鏡像的效率。Harbor 支援安裝在多個 Registry 節點的鏡像資源複制,鏡像全部儲存在私有 Registry 中, 確定資料和知識産權在公司内部網絡中管控。另外,Harbor 也提供了進階的安全特性,諸如使用者管理,通路控制和活動審計等。

  • 基于角色的通路控制 - 使用者與 Docker 鏡像倉庫通過 “項目” 進行組織管理,一個使用者可以對多個鏡像倉庫在同一命名空間(project)裡有不同的權限。
  • 鏡像複制 - 鏡像可以在多個 Registry 執行個體中複制(同步)。尤其适合于負載均衡,高可用,混合雲和多雲的場景。
  • 圖形化使用者界面 - 使用者可以通過浏覽器來浏覽,檢索目前 Docker 鏡像倉庫,管理項目和命名空間。
  • AD/LDAP 支援 - Harbor 可以內建企業内部已有的 AD/LDAP,用于鑒權認證管理。
  • 審計管理 - 所有針對鏡像倉庫的操作都可以被記錄追溯,用于審計管理。
  • 國際化 - 已擁有英文、中文、德文、日文和俄文的本地化版本。更多的語言将會添加進來。
  • RESTful API - RESTful API 提供給管理者對于 Harbor 更多的操控,使得與其它管理軟體內建變得更容易。
  • 部署簡單 - 提供線上和離線兩種安裝工具, 也可以安裝到 vSphere 平台 (OVA 方式) 虛拟裝置。

gitee位址:https://gitee.com/project_harbor/harbor?utm_source=alading&utm_campaign=repo

2.Harbor搭建

安裝說明: Harbor的所有服務元件都是在Docker中部署的,是以官方安裝使用Docker-compose快速部署,是以需要安裝 Docker、Docker-compose。由于Harbor是基于Docker Registry V2版本,是以就要求Docker版本不小于1.10.0, Docker-compose版本不小于1.6.0。

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

① 下載下傳并解壓安裝包

線上下載下傳:

wget https://github.com/goharbor/harbor/releases/download/v2.2.2/harbor-online-installer-v2.2.2.tgz
tar -xvf harbor-online-installer-v2.2.2.tgz           

② 編輯配置檔案

cp harbor.yml.tmpl harbor.yml  # 複制一份harbor.yml檔案
vi harbor.yml           

按照如下内容編輯:

  • hostname改為本機ip
  • 端口預設80,可以改為其他指定端口
  • 注釋掉https的相關配置
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

③ 準備安裝環境

./prepare  # 執行prepare腳本           

執行完成後,本地會多一個docker-compose.yml檔案和common目錄

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

④ 安裝harbor

./install.sh  # 安裝harbor           

安裝過程中會自動下載下傳harbor鏡像并啟動相關容器。

⑤ 通路harbor

安裝成功後,即可通路harbor:http://192.168.1.122:8087,其中:ip為本機ip,端口為配置檔案harbor.yml中配置的端口。預設賬号和密碼為:admin Harbor12345

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

harbor.yml檔案中可檢視或修改密碼

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

⑥ 安裝過程中常見問題及解決

  • 報錯redis容器重複
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

原因:本地已存在redis容器,harbor無法啟動redis容器

解決辦法:修改harbor目錄下docker-compose.yml中的redis容器名稱,重新啟動

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法
docker-compose up -d           

檢視harbor各個容器狀态:

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法
  • 報錯registry容器重複

若本地之前已存在registry容器時,harbor安裝過程會報錯,解決方案:删除原registry容器,重新執行./install.sh進行安裝;若此方式仍報錯,則執行docker-compose up -d啟動各個服務;

3.推送本地鏡像到Harbor

① 建立項目

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

② Docker登入

由于之前登入過docker-hub,是以再次使用“docker login”指令登入時,預設登入的還是docker-hub的位址。是以,如果想要登入harbor,需要在登入時指定登入位址。

docker login 192.168.1.122:8087           

首次登入,根據提示輸入harbor使用者名及密碼即可,與前端登入使用的賬号密碼一緻。

由于我前面登入過一次這個位址,本地會儲存認證記錄,是以再次登入時無需輸入使用者名密碼即可登入成功。

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

如遇以下報錯:

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

則要在/etc/docker/daemon.json檔案中将本機ip(端口非80時需要帶上端口号)加入到insecure-registries清單中,并重載配置。

{
        "registry-mirrors":[
        "http://registry.docker-cn.com",
        "http://docker.mirrors.ustc.edu.cn",
        "http://hub-mirror.c.163.com",
        "http://cr.console.aliyun.com/",
        "https://8wb4g36l.mirror.aliyuncs.com"
],
        "insecure-registries":["192.168.1.122:8087"],
        "graph": "/home/docker_home"
}           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法
systemctl daemon-reload
systectl restart docker           

再次登入後登入成功:

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

③ 本地鏡像打tag

鏡像名稱需要命名為:ip:端口号/項目名稱/鏡像名:tag名,才能上傳到該指定項目下,例如rabbitmq鏡像,則名稱為:192.168.1.122:8087/harbor/rabbitmq:5.7.33

為了友善測試,我直接複制本地的一個鏡像,并重新命名:

docker tag rabbitmq:3.7-management 192.168.1.122:8087/harbor/rabbitmq:3.7-management           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

④ 推送本地鏡像到Harbor

docker push 192.168.1.122:8087/harbor/rabbitmq:3.7-management           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

檢視名為harbor的項目下,存在rabbitmq:3.7-management,測試成功。

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

⑤ 從Harbor拉取鏡像

  • 拉取鏡像
docker pull 192.168.1.122:8087/library/mysql:5.7.33           

從下圖可以看出,MySQL鏡像已經拉取成功

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

同時,Harbor管理端也能看到最新的拉取時間:

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法
  • 建立容器
docker run -it -d -e MYSQL_ROOT_PASSWORD=123456 --name=mysql -p 3307:3306 192.168.1.122:8087/library/mysql:5.7.33           
docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

登入MySQL

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

【docker 可視化管理工具-DockerUI】

一、簡介

DockerUI是一款開源的、強大的、輕量級的Docker管理工具。DockerUI覆寫了 docker cli 指令行 95% 以上的指令功能,通過可視化的界面,即使是不熟悉docker指令的使用者也可以非常友善的進行Docker和Docker Swarm叢集進行管理和維護。

DockerUI後端使用Go語言開發,前台架構使用CubeUI。通過Docker Restful API,經過Go語言編寫的Proxy端, 實作和Docker Daemon進行通信,進而實作Docker的管理指令和維護指令。

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

官網:https ://github.com/gohutool/docker.ui

二、特征

  • Docker主機管理管理 資料卷管理、鏡像管理、容器管理、建構管理、倉庫配置管理、網絡配置管理
  • Docker swarm叢集管理 叢集配置資訊、節點管理、服務管理、任務管理、密碼管理、配置管理
  • 任務安排 Docker任務排程、docker swarm任務排程

三、安裝

1.正常方式安裝

1)下載下傳docker.ui源碼

git clone https://github.com/gohutool/docker.ui.git           

2)安裝golang運作環境

① 建立go檔案夾

cd /home
mkdir go           

② 下載下傳go壓縮包并解壓縮

https://golang.google.cn/dl/,選擇對應系統下載下傳檔案

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

也可以通過wget指令下載下傳:

wget https://golang.google.cn/dl/go1.19.1.linux-amd64.tar.gz
tar -xvf go1.19.1.linux-amd64.tar.gz           

③ 添加到環境變量

編輯/etc/profile,添加如下内容:

export GO_HOME=/home/golang/go
export PATH=$PATH:$GO_HOME/bin           

④ 重載環境變量

source /etc/profile           

⑤ 驗證是否安裝成功

go --help           

出現以下資訊表示安裝配置成功:

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

3)項目配置

進入docker.ui項目目錄,執行以下指令

export GO111MODULE=on
export GOPROXY="https://goproxy.cn,direct"
go mod tidy
go mod download
go build -o server .  # 執行完成後目錄下會多出一個server檔案           

4)啟動服務

./server           

2.通過容器安裝

1)拉取鏡像

docker image pull joinsunsoft/docker.ui           

2)建立容器

docker run --restart always --name docker.ui -d -v /home/docker_data/docker.ui/docker.sock:/var/run/docker.sock -p 8999:8999 joinsunsoft/docker.ui           

3.浏覽器通路

http://192.168.1.122:8999

預設賬号密碼:ginghan 123456

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

四、操作快照

鏡像清單

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

搜尋/拉取鏡像

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

建構鏡像

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

導入/導出鏡像

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

推送鏡像

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法

執行鏡像

docker從入門到實戰-萬字長文全面介紹docker入門及高階用法