docker 詳細教程(通俗易懂,帶有應用示例)

来源:https://www.cnblogs.com/xxctx/p/18354714
-Advertisement-
Play Games

1、Docker 基本概念 什麼是 Docker? Docker 是一個開源的容器化平臺,允許開發者封裝他們的應用程式及其所有依賴項到一個標準化的單元中,這個單元被稱為“容器”。容器可以在任何支持 Docker 的環境中運行,從而確保應用程式的可移植性和一致性。 Docker 的優勢 一致性和可移植 ...


1、Docker 基本概念

什麼是 Docker?

Docker 是一個開源的容器化平臺,允許開發者封裝他們的應用程式及其所有依賴項到一個標準化的單元中,這個單元被稱為“容器”。容器可以在任何支持 Docker 的環境中運行,從而確保應用程式的可移植性和一致性。

Docker 的優勢

  1. 一致性和可移植性:Docker 容器在任何支持 Docker 的平臺上都能運行,確保開發和生產環境的一致性。
  2. 資源隔離和控制:容器使用系統的資源而不是虛擬化,因此更高效,且提供了資源隔離和分配控制。
  3. 快速部署和啟動:容器的啟動速度非常快,通常只需要幾秒鐘。
  4. 簡化依賴管理:容器包含了應用程式運行所需的所有依賴,減少了“在我的機器上可以工作”的問題。

Docker 結構

  1. 鏡像(Image):一個 Docker 鏡像是一個只讀的模板,包含了運行某個應用程式所需的所有依賴、庫、配置文件等。鏡像可以用來創建容器。
  2. 容器(Container):容器是鏡像的一個運行實例。它是一個輕量級、獨立的可執行包,包含了軟體運行所需的所有內容。
  3. Dockerfile:一個文本文件,包含了創建 Docker 鏡像的所有命令。通過編寫 Dockerfile,開發者可以定義鏡像的內容和行為。
  4. Docker Hub:一個雲端的 Docker 鏡像庫,用戶可以從中拉取公共鏡像或上傳自己的鏡像。

安裝 Docker 後,Docker 本身是一個平臺或工具,它提供了運行容器的能力。但要運行具體的應用程式或服務,需要使用 Docker 鏡像。鏡像和 Docker 平臺之間的關係可以類比為軟體和操作系統之間的關係:

總結

  • Docker 平臺提供了運行和管理容器的能力,但不包含具體的應用程式。
  • Docker 鏡像是具體應用程式的封裝,包含了應用程式運行所需的一切內容。
  • Docker 容器是鏡像的運行實例,提供了一個獨立的運行環境。

2、Docker 安裝

參考我這篇文章中的 安裝docker

3、Docker 常用命令

文章中的 CONTAINER 表示容器的 id 或 name

鏡像管理(Images)

  1. 拉取鏡像

    docker pull ubuntu:20.04
    
    # 這個命令從 Docker Hub 拉取名為 `ubuntu` 且標簽為 `20.04` 的鏡像。
    
  2. 列出鏡像

    docker images
    

    列出本地所有可用的 Docker 鏡像。

  3. 刪除鏡像

    docker image rm ubuntu:20.04
    
    #  刪除本地名為 `ubuntu:20.04` 的鏡像。
    

    docker rmi ubuntu:20.04
    
    #  刪除本地名為 `ubuntu:20.04` 的鏡像。
    
  4. 提交容器為新鏡像

    docker commit CONTAINER IMAGE_NAME:TAG
    
    # 將一個正在運行的容器 `CONTAINER` 提交為一個新的鏡像 `IMAGE_NAME:TAG`。
    
  5. 保存鏡像到本地文件

    docker save -o ubuntu-20.04.tar ubuntu:20.04
    
    # 將 `ubuntu:20.04` 鏡像導出到本地文件 `ubuntu-20.04.tar` 中。
    
  6. 從本地文件載入鏡像

    docker load -i ubuntu-20.04.tar
    
    # 從本地文件 `ubuntu-20.04.tar` 中載入鏡像 `ubuntu:20.04`。
    

容器管理(Containers)

  1. 創建容器

    docker create -it ubuntu:20.04
    
    # 使用鏡像 `ubuntu:20.04` 創建一個容器。
    
  2. 查看容器

    docker ps -a
    
    # 查看本地所有容器(包括運行中和停止的)。
    
  3. 啟動容器

    docker start CONTAINER
    
    # 啟動一個停止的容器 `CONTAINER`。
    
  4. 停止容器

    docker stop CONTAINER
    
    # 停止一個運行中的容器 `CONTAINER`。
    
  5. 重啟容器

    docker restart CONTAINER
    
    # 重啟一個容器 `CONTAINER`。
    
  6. 創建並啟動容器

    docker run -p 20000:22 --name mycontainer -itd ubuntu:20.04
    
    # 使用 `ubuntu:20.04` 鏡像創建並啟動一個容器
    # -p 20000:22 指的是它將容器內的埠 22(通常是 SSH 服務埠)映射到主機的埠 20000
    # --name 重命名
    # 也可以不加 -p --name 及 後面的參數
    
  7. 進入到容器

    docker attach CONTAINER
    
    #  附加到一個運行中的容器。按 `Ctrl + p`,再按 `Ctrl + q` 可以退出容器而不停止它。
    
  8. 在容器中執行命令

    docker exec CONTAINER COMMAND
    
    # 不進入運行中的容器  並且執行命令 `COMMAND`。
    
  9. 刪除容器

    docker rm CONTAINER
    
    #  刪除一個容器 `CONTAINER`。
    
  10. 刪除所有停止的容器

    docker container prune
    
    # 刪除所有已停止的容器。
    
  11. 導出容器到本地文件

    docker export -o xxx.tar CONTAINER
    
    # 將容器 `CONTAINER` 導出到本地文件 `xxx.tar` 中。
    
  12. 從本地文件導入容器

    docker import xxx.tar image_name:tag
    
    # 從本地文件 `xxx.tar` 中導入為鏡像 `image_name:tag`。
    
  13. 查看容器進程

    docker top CONTAINER
    
    # 查看容器 `CONTAINER` 中的進程。
    
  14. 查看容器資源使用

    docker stats
    
    # 查看所有容器的統計信息,包括 CPU、記憶體、網路等。
    
  15. 複製文件

    docker cp CONTAINER:xxx xxx
    
    #  在本地(鏡像)和容器之間複製文件。
    
  16. 重命名容器

    docker rename CONTAINER NEW_NAME
    
    # 重命名容器 `CONTAINER` 為 `NEW_NAME`。
    
  17. 更新容器資源限制

    docker update CONTAINER --memory 500M --memory-swap 1G 
    
    # memory: 容器可用的記憶體上限。
    # memoryswap: 容器可用的總記憶體,包括交換空間。如果沒有顯式設置,memoryswap 預設為 memory 的兩倍。
    # 修改容器 `CONTAINER` 的記憶體限製為 500M。
    

通過這些命令,我們可以有效地管理 Docker 鏡像和容器,滿足各種開發和部署需求。

4、Docker 應用示例

下麵我們演示 在 docker 的一個容器裡面配置一個 ssh 登陸, 相當於是在自己的遠程雲伺服器裡面通過 docker 創建了一個容器 (虛擬機)

這個示例非常常用, 我們之後開發一般會把項目部署到 docker 的容器里, 本地連接雲端伺服器的 docker的容器 就需要用到 ssh

1、下載一個ubuntu鏡像

docker pull ubuntu:20.04
# 這裡我用的 20.04

2、基於 下載的鏡像 創建一個容器

docker run -p 20000:22 --name test1 -itd ubuntu:20.04
# -p 20000:22 指的是它將容器內的埠 22(通常是 SSH 服務埠)映射到主機的埠 20000。(本機也就是當前的伺服器)

3、進入到創建的容器

docker attach test1

4、設置這個容器的 root 密碼

passwd

5、下載ssh服務

# 下載
apt update
apt install -y openssh-server

# 編輯配置文件(預設是ssh配置文件不允許以root用戶登陸)
vim /etc/ssh/sshd_config

# 在 sshd_config中添加如下內容
PermitRootLogin yes
PasswordAuthentication yes
# 上面兩個內容分別是允許 ssh以 root 用戶登陸 和 啟用了密碼認證

# 啟動ssh服務
service ssh start

# 查看是否啟動
service ssh status

6、遠程伺服器登陸登陸

Ctrl + p 然後按 Ctrl + q 掛起這個容器

# 在本機 ssh 登陸
ssh root@localhost -p 20000
# ssh 連接本機的 20000 埠, 因為我們創建的 docker 容器的22埠給改成 20000埠了

至此,我們完成了在本機伺服器登陸本機docker的容器

下麵我們繼續, 讓 本地電腦 直接登錄到 遠程伺服器的docker容器里。(這裡說的 本地電腦 指自己的沒有公網ip的電腦,本機、遠程伺服器 指的是我們租的有公網ip的電腦)

7、開放 伺服器的20000埠

在這裡插入圖片描述

8、本地連接 伺服器的容器

# root 是因為我們伺服器的那個容器預設是一個root用戶, 我們還沒有給他創建其他用戶
# 把 127.0.0.1 改成你伺服器的 公網ip
ssh [email protected] -p 20000

常見問題 : 你伺服器的docker的那個容器沒有打開,讓那個 容器 處於開啟狀態

至此已經完成了本地直連伺服器的 docker 容器。簡化本地登陸 可以參看我這篇文章 -> 地址 (文章 2、3節講的就是簡化登錄和免密登陸)

完結,覺得不錯的可以點個贊


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在C#中,集合是用於存儲和操作一組數據項的數據結構。這些集合通常位於 System.Collections 和 System.Collections.Generic 命名空間中。下麵我將概述C#中幾種常用的集合類型及其特點: 1. System.Collections 命名空間中的集合 這個命名空間 ...
  • ...
  • 前言 在實際項目開發中,需求變更和項目迭代是常態。要求我們能夠迅速響應,對資料庫結構進行相應的調整,如添加新表、更新現有表結構或增加欄位等。 為了確保團隊成員之間的信息同步,實時更新和維護資料庫文檔變得至關重要。這不僅提升了資料庫的可讀性,也極大提高了開發效率和團隊協作的流暢性。 SmartSQL, ...
  • 前言 .NET許可權管理及快速開發框架、最好用的許可權工作流系統。 基於經典領域驅動設計的許可權管理及快速開發框架,源於Martin Fowler企業級應用開發思想及最新技術組合(SqlSugar、EF、Quartz、AutoFac、WebAPI、Swagger、Mock、NUnit、Vue2/3、Ele ...
  • 本章將和大家分享Linux系統中的管道命令、grep命令、sed命令和awk命令。廢話不多說,下麵我們直接進入主題。 一、管道命令 Linux 中的管道命令(pipe)是一種非常強大的特性,它允許你將一個命令的輸出作為另一個命令的輸入。管道命令極大地增強了命令行的靈活性和功能,使得複雜的數據處理任務 ...
  • 1. 配置 1.1 如果是配置全局文件,則編輯/etc/mail.rc 1.2 如果是配置當前用戶,則編輯~/.mailrc 2. 配置文件內容 # 這裡填入smtp地址,這裡的xxx為qq或者163等,如果用的雲伺服器,安全組策略要開放465/25埠,入站和出站都要開放該埠 set smtp= ...
  • 一、背景 在公司軟體的實際開發中,當一個版本的客戶端安裝包本地調試、測試驗證都沒問題後外發,到用戶實際機器上出問題了,怎麼辦? 很多人說,讓客戶給出復現步驟,我來試試!但是按照步驟操作之後還是沒效果。這時你又想到了是不是環境的差異,但是又說不上來是哪裡出問題。提供兩個辦法:1.寫日誌,編一個相近版本 ...
  • 1、用戶操作 阿裡雲預設是 root 用戶,我們一般要自己創建一個用戶,然後給該用戶 sudo 許可權 添加用戶 sudo adduser newUserName 賦予sudo許可權 sudo usermod -aG sudo newUserName 刪除用戶 sudo deluser --remove ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...