【Docker#3】Window 和 Linux 上 docker安裝 相關知識

前置了解

  • X86 高并發:基于 x86 架構的處理器,在高負載下處理大量并發請求的能力。
  • ARM :使用 ARM 架構處理器的移動設備,具有低功耗和高性能的特點。

操作系統

  • CentOS:基于 Red Hat Enterprise Linux 的免費開源操作系統,適合企業級應用和服務器。
  • Ubuntu:基于 Debian 的免費開源操作系統,用戶友好,廣泛應用于個人電腦、服務器和云計算平臺。

一、LXC

1. LXC 是什么?

LXC(LinuX Containers)是一種操作系統層虛擬化技術,為 Linux 內核容器功能的一個用戶空間接口。

  • 它將應用軟件系統打包成一個軟件容器(Container),內含應用軟件本身的代碼,以及所需要的操作系統核心和庫。
  • 透過統一的名字空間和共享 API 來分配不同軟件容器的可用硬件資源,創造出應用程序的獨立沙箱運行環境,使得 Linux 用戶可以容易地創建和管理系統或應用容器。

盡管 LXC 極大地簡化了容器技術的使用,但比起直接通過內核調用來使用容器技術,其復雜程度其實并沒有多大降低,因為我們必須要學會 LXC 的一組命令工具,且由于內核的創建都是通過命令來實現的,通過批量命令實現數據遷移并不容易。

其隔離性也沒有虛擬機那么強大。后來就出現了 Docker,所以從一定程度上來說,Docker 就是 LXC 的增強版。

2. LXC 容器操作

Ubuntu 上安裝 LXC,如下:

  1. 檢查及卸載(如需)

    systemctl status lxc
    lxc-stop -n xxx # 停止所有運行的容器
    lxc-destroy -n xxx # 刪除所有容器
    apt-get purge --auto-remove lxc lxc-templates
    systemctl status lxc # 確保服務已卸載
    
  2. 安裝 LXC

    sudo apt install lxc lxc-templates bridge-utils -ysystemctl status lxc # 檢查服務是否正常
    

LXC的常用命令說明如下:

檢查系統支持性lxc-checkconfig

創建指定模板容器lxc-create -n NAME -t TEMPLATE_NAME [--template-options]

啟動容器lxc-start -n NAME -d

列出容器lxc-ls -f(-f 參數顯示容器得詳細信息)

查看容器信息lxc-info -n NAME

進入容器lxc-attach --name=NAME [--COMMAND]

停止容器lxc-stop -n NAME

刪除容器lxc-destroy -n NAME

實戰如下

# 1. 檢查運行狀態
root@VM-8-10-ubuntu:~$ systemctl status lxc
● lxc.service - LXC Container Initialization and Autoboot CodeLoaded: loaded (/lib/systemd/system/lxc.service; enabled; vendor preset: enabled)Active: active (exited) since Fri 2025-07-11 15:28:38 CST; 3min 34s agoDocs: man:lxc-autostartman:lxcProcess: 2423230 ExecStartPre=/usr/lib/x86_64-linux-gnu/lxc/lxc-apparmor-load (code=exited, status=0/SUCCESS)Process: 2423235 ExecStart=/usr/lib/x86_64-linux-gnu/lxc/lxc-containers start (code=exited, status=0/SUCCESS)Main PID: 2423235 (code=exited, status=0/SUCCESS)CPU: 24ms# 2. 查看可用模板
root@VM-8-10-ubuntu:/home/lighthouse# ls /usr/share/lxc/templates/
lxc-alpine     lxc-centos    lxc-fedora         lxc-oci           lxc-plamo      lxc-sparclinux    lxc-voidlinux
lxc-altlinux   lxc-cirros    lxc-fedora-legacy  lxc-openmandriva  lxc-pld        lxc-sshd
lxc-archlinux  lxc-debian    lxc-gentoo         lxc-opensuse      lxc-sabayon    lxc-ubuntu
lxc-busybox    lxc-download  lxc-local          lxc-oracle        lxc-slackware  lxc-ubuntu-cloud# 3. 創建容器
lxc-create -n lxchost1 -t ubuntu -- -r xenial -a amd64 # Ubuntu上創建Ubuntu容器
lxc-create -n centos7 --template=download -- --dist=centos --release=7 --arch=amd64 # Ubuntu上創建CentOS容器# 4. 查看創建結果
root@VM-8-10-ubuntu:/home/lighthouse# lxc-ls -f
NAME     STATE   AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED 
lxchost1 STOPPED 0         -      -    -    false      # 5. 啟動容器
root@VM-8-10-ubuntu:/home/lighthouse# lxc-start -n lxchost1 -d
root@VM-8-10-ubuntu:/home/lighthouse# lxc-info -n lxchost1
Name:           lxchost1
State:          RUNNING
PID:            2455869
Link:           vethNx0mnETX bytes:      726 bytesRX bytes:      1.41 KiBTotal bytes:   2.12 KiB# 6. 使用 ssh 進入容器
root@VM-8-10-ubuntu:/home/lighthouse# ssh ubuntu@ip
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
ubuntu@1.12.51.69's password: # 密碼是當前 系統密碼# 7. 在容器中執行常用命令
ip addr # 查看網絡信息
df -h # 查看磁盤掛載情況
ps -ef # 查看進程信息
ubuntu@VM-8-10-ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           340M  1.1M  339M   1% /run
/dev/vda2        69G   23G   44G  35% /
tmpfs           1.7G   24K  1.7G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           340M  4.0K  340M   1% /run/user/1002
tmpfs           340M  4.0K  340M   1% /run/user/1001
tmpfs           1.7G     0  1.7G   0% /run/qemu
tmpfs           340M  4.0K  340M   1% /run/user/1000# 8. 從宿主機向容器中發送命令
root@VM-8-10-ubuntu:/home/lighthouse# lxc-attach -n lxchost1 --clear-env -- echo "Hello LXC"
Hello LXC# 9. 停止 & 刪除容器
root@VM-8-10-ubuntu:/home/lighthouse# lxc-stop -n lxchost1  
root@VM-8-10-ubuntu:/home/lighthouse# lxc-destroy -n lxchost1
  • 通過LXC學習容器的創建與管理,體會容器化技術的基本原理。
  • 了解Docker不是唯一的容器實現方式,Docker在0.9版本起引入了自家的 libcontainer,而如今大部分Docker使用的都是libcontainer而非LXC。

二、Docker 是什么?

1. Docker 是什么?

Docker 本質其實是 LXC 之類的增強版,它本身不是容器,而是容器的易用工具。

  • 容器是 Linux 內核中的技術,Docker 只是把這種技術在使用上簡易普及了。Docker 在早期的版本其核心就是 LXC 的二次封裝發行版。
  • Docker 作為容器技術的一個實現,或者說讓容器技術普及開來的最成功的實現。
  • Docker 是基于 Go 語言實現的一個開源項目,它的主要目標是“Build,Ship and Run Any APP,Anywhere”,即通過對組件的封裝、分發、部署、運行等生命周期的管理,使得用戶的應用及其運行環境能夠做到“一次封裝,到處運行”。

早期 Docker 利用 LXC 做容器管理引擎,但在創建容器時,不再使用 模板 去安裝生成,而是通過 鏡像技術把一個操作系統用戶空間所需要使用到的組件事先編排好,并整體打包成一個文件,image 文件),鏡像文件集中放在一個倉庫中。

當需要創建容器時,Docker 調用 LXC 的工具 lxc-create,但不再通過 lxc 的模板去安裝,而是連接到鏡像服務器上下載匹配的鏡像文件,而后基于鏡像啟動容器。

所以,Docker 極大地簡化了容器的使用難度。以后我們創建啟動容器,只需要一個命令,docker-run,docker-stop 就可以啟動停止一個容器了。

2. Docker 的引擎迭代

  • Docker 早期是基于 LXC 容器管理引擎實現。
  • 當后來成熟之后,Docker 自建了一個容器引擎叫 libcontainer。
  • 后來 CNCF 的介入,Docker 又研發了一個工業化標準的容器引擎 runC。
  • 目前所使用的新版 Docker,所使用的容器引擎就是 RunC。

3. 虛擬機 Vs Docker

虛擬機:在硬件層之上,在操作系統層就開始進行隔離。虛擬機通過偽造一個硬件的抽象接口,把操作系統嫁接到硬件上。

容器:也是一種虛擬化的實現技術,它在操作系統之上進行環境隔離,每個容器可以有自己的一套工具和庫,但是它們共享操作系統的內核!

特性虛擬機Docker
磁盤占用幾個 GB 到幾十個 GB幾十 MB 到 幾百 MB
CPU 內存占用虛擬操作系統非常占用 CPU 和內存,需要通過虛擬層調用占用率高Docker 引擎占用資源極低,直接作用于硬件資源占用少
虛擬化層級硬件層之上,模擬完整操作系統操作系統層之上,隔離進程環境
安裝管理需要專門的運維技術安裝、管理方便
內核共享不共享,每個 VM 有自己的 OS 內核共享宿主機的內核
啟動速度較慢(需要啟動完整的操作系統)極快(秒級甚至毫秒級)
資源消耗高(每個 VM 占用內存和磁盤空間大)低(輕量級,共享資源)
隔離性強(完全隔離,安全性高,系統級別)相對弱(依賴于命名空間和控制組,進程級別)
可移植性一般(鏡像體積大,遷移復雜)高(容器鏡像小,便于部署)
適用場景多租戶、安全要求高的環境快速部署、微服務、CI/CD

docker 不需要虛擬內核,所以啟動可以更快,相當于 windows 的開機時間省去了

🎮 游戲廳 vs 手機游戲

  • 虛擬機 = 游戲廳里的街機:每臺機器都自帶電源、屏幕、主板……雖然功能全,但笨重、耗電。
  • Docker 容器 = 手機上的模擬器游戲:所有游戲共享手機系統資源,只需裝個 App 就能玩,小巧方便,啟動快。

🏗? 建房子 vs 搭積木

  • 虛擬機 = 每次蓋一棟新樓:地基、水電、裝修都要從頭開始,費時費力。
  • Docker 容器 = 在一個大樓里隔出不同的房間:共享基礎設施,只改內部布置,快速靈活。
┌───────────────┬──────────────────────────────┐	┌───────────────┬──────────────────────────────┐
│     層級      │         虛擬機 (VM)          │		 │     層級      │         容器 (Docker)        │		
├───────────────┼──────────────────────────────┤	 ├───────────────┼──────────────────────────────┤
│   應用程序    │       各自獨立的應用         │		  │   應用程序    │       各自獨立的應用         │
│   操作系統    │        各自獨立的操作系統     	│		│   容器引擎    │        Docker Engine         │ 
│   Hypervisor  │        虛擬化層(監控器)     │	   │   操作系統    │        共享同一個 Linux 內核 │ 
│   物理硬件    │        物理服務器             │	   │   物理硬件    │        物理服務器             │
└───────────────┴──────────────────────────────┘ 	└───────────────┴──────────────────────────────┘

Docker 為什么比虛擬機資源 利用率高,啟動快,耦合低

  • Docker 有比虛擬機更少的抽象層。Docker 不需要 Hypervisor 實現 硬件資源虛擬化,運行在 Docker 容器上的程序直接使用的是實際物理機的硬件資源。因此在 CPU、內存利用率上 Docker 將會在效率上有明顯的優勢。Docker 利用的是宿主機的內核,而不需要 Guest OS,節省了 Guest OS 占用的資源。
  • Docker 不需要 Guest OS,創建一個容器時,不需要和虛擬機一樣重新加載一個操作系統內核。從而避免引尋、加載操作系統內核返回時耗時耗資源的過程,當新建一個虛擬機時,虛擬機軟件需要加載 Guest OS,返回新建過程是分鐘級別的。而新建一個 Docker 容器只需要幾秒鐘。

Docker 和 JVM 虛擬化的區別

特性JVMDocker 容器
性能Jvm 需要占用一定的 CPU 和內存基本沒有損失
虛擬層面基于 JVM 虛擬機,更加上層基于操作系統,更加通用
代碼無關性一個特定代碼的執行平臺,它是運行時才存在的,只能支撐特定代碼的執行,并且必須是在 jvm 進程內模擬了一整個操作系統,它是靜態存在的,可以支撐任何代碼,相同平臺的應用程序
主機隔離性jvm 不隔離主機通過命名空間實現隔離

4. 關于 Docker

4.1 Docker 版本

Docker 發展過程中衍生了以下版本,目前我們學習和使用提到的版本是 docker-ce。

  • lxc:上文中提到,lxc 是最早的 linux 容器技術,早期版本的 docker 直接使用 lxc 來實現容器的底層功能。雖然使用者相對較少,但 lxc 項目仍在持續開發演進中。
  • libcontainer:docker 從 0.9 版本開始自行開發了 libcontainer 模塊來作為 lxc 的替代品實現容器底層特性,并在 1.10 版本徹底去除了 lxc。在 1.11 版本拆分出 runc 后,libcontainer 也隨之成為了 runc 的核心功能模塊,runc 后續變成了容器標準。
  • moby:moby 是 docker 公司發起的開源項目,其中最主要的部分就是同名組件 moby,事實上這個 moby 就是 dockerd 目前使用的開源項目名稱,docker 項目中的 engine(dockerd)倉庫現在就是從 moby 倉庫 fork 而來的,使用 containerd 作為運行時標準。Moby
  • docker-ce:docker 的開源版本,CE 指 Community Edition。docker-ce 中的組件來自于 moby、containerd 等其他項目。Pricing | Docker
  • docker-ee:docker 的收費版本,EE 指 Enterprise Edition。其基礎組件來源和 docker-ce 是一樣的,但附加了一些其他的組件和功能。Pricing | Docker
4.2 Docker 架構

img

  • Docker 倉庫(Registry):Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。Docker Hub 供了龐大的鏡像集合供使用。
  • Docker Daemon:Docker Daemon 是服務器組件,是 Docker 最核心的后臺進程,我們也把它稱為 守護進程
  • Docker 客戶端(Client):Docker 客戶端通過命令行或者其他工具使用 Docker API 與 Docker 的守護進程通信。
  • Docker 主機(Host):一個物理或者虛擬的機器用于執行 Docker 守護進程和容器。
  • Docker 鏡像(Images):Docker 鏡像是用于創建 Docker 容器的模板。
  • Docker 容器(Container):容器是獨立運行的一個或一組應用

類比理解:上面概念比較難以理解,我們列舉個生活中的案例,以一家人去旅游入住酒店為例。

  1. 我們一家人和朋友一塊旅游去酒店,我們就是 Docker Client。
  2. 到酒店辦理入住,辦理退房,繳費需要酒店前臺提供各種服務,酒店前臺就是我們的 Docker Daemon,Docker 的核心服務端。
  3. 酒店是建在美麗的海邊,酒店的宅基地和大樓就是我們實際的物理服務器或者虛擬服務器,也就是 Docker Host。
  4. 酒店就 1000 多個房間,每個房間里面不一樣,有標間、大床房、家庭房等,這就是 Docker 鏡像倉庫。
  5. 酒店的標準的房間豪華大床房和雙人標間,這個就是 Docker 鏡像,我們客戶是沒有辦法修改的。
  6. 我們辦理完入住了一個豪華大床房,然后把行李,個人物品帶到了一個具體的房間號,比如 9527,那么這個房間我們可以使用了,朋友也開了一間豪華大床房,雖然豪華大床房一樣,但是我們攜帶的物品都不一樣,這個就是容器 Docker Container。
  7. 容器的銷毀,也就是我們一周后旅游結束了,搬出了酒店,酒店把我們的房間恢復了鏡像原來的樣子。
4.3 Docker 生態

我們來考慮 2 個問題,Docker 為什么要設計鏡像,然后又搭建個 Docker Hub,搞個鏡像倉庫呢?我們來看下現在的時代發生了什么。

1. 數據量瘋狂增長

img

  • 其中 1 ZB = 1024 EB = 10242{1024}^210242PB = 10243{1024}^310243TB = 10244{1024}^410244GB = 10245{1024}^510245MB = 10246{1024}^610246KB

隨著物聯網、邊緣計算等智能終端設備不斷普及,受到來自物聯網設備信號、元數據、娛樂相關數據、云計算和邊緣計算的數據增長的驅動,全球數據量呈現加速增長。根據 IDC 分布的《數據時代 2025》預測,全球數據量將從 2018 年的 33ZB 增至 2025 年的 175ZB,增長超過 5 倍;中國平均增速快于全球 3%,預計到 2025 年將增至 48.6ZB,占全球數據圈的比例由 23.4%提升至 27.8%。其中,中國企業級數據量將從 2015 年占中國數據量的 49%增長到 2025 年的 69%。

2. 處理能力快速增加:

  • 騰訊云全球服務器數量 100w+,數據量 EB+;2020 年阿里云:在全國已建成 5 大超級數據中心,阿里云在全球 22 個地域部署了上百個數據中心,服務器的總規模數已經接近 200 萬臺。
    某省疾控中心疫苗預約系統、全員核酸檢測系統、健康碼系統共 300 余臺服務器,并為核酸檢測系統快速擴容計算和存儲資源。
    (重申 云 的概念:就像水和電一樣的一種資源,但是不用了又可以歸還)

3. 軟件需求爆發式增長

  • 軟件發布頻繁:研發模式從瀑布開發演變為敏捷開發,原來 3 個月上一次新功能,現在兩周一次,而開發過程中我們也經常遇到需要修改需求,然后變更再發布的情況。
    • 軟件上線有問題需要快速回滾,對軟件有著極強的版本管理和回滾訴求。
  • 軟件需要共享:軟件的研發人員、研發公司在設計、研發好一款軟件的時候,如何方便地共享給他人,而又能快速地使用起來。
    環境搭建復雜
  • 技術種類繁多:每個項目組使用的語言不一樣,需要不同的環境,每個都得搞一套。每次都要從 yum 開始一個個完成部署安裝,每次都有各種奇怪的問題,運維成本很高。

Docker 解決方案:云時代需要我們針對這些訴求有一套針對性的解決方案。

思考一:我們要處理海量的數據,如何處理呢?

  • 購買大量的服務器,并研發對應軟件。
    開發的需求需要頻繁的變更上線,如何才能將修改的代碼快速地分發到幾百或者幾千臺服務器呢?如何共享軟件呢?
  • 搞一個中心倉庫,讓各個服務器去下載軟件包,安裝,所以 CentOS 搞了 yum 倉庫,docker 設計了鏡像倉庫,docker hub 是公共的托管倉庫。

思考二:軟件設計好以后,怎么快速安裝啟動,有問題回滾呢?

  • 將 docker 需要的所有信息設計一套軟件格式,把所有的依賴搞進去,并打上版本標簽,這樣不會換一個服務器各種問題,所以 Docker 設計了鏡像,根據版本標簽就可以實現回滾了

思考三:不同的開發環境怎么搭建呢,一會 java,一會 c++?

  • docker 設計了鏡像來應對,鏡像里面存放了需要運行的環境,就像我們的 iPhone 內置 ios,我們的華為 mate 50 內置鴻蒙一樣,一條命令就可以完成某個環境的搭建。

三、Docker 安裝

下面我們來快速安裝一下 Docker,對 Docker 有個初步的認識和了解。

① 確定 CPU 版本以及操作系統版本,如下:

root@VM-8-10-ubuntu:/home/lighthouse# uname -a	# CPU 架構
Linux VM-8-10-ubuntu 5.15.0-126-generic #136-Ubuntu SMP Wed Nov 6 10:38:22 UTC 2024 x86_64 x86_64 x86_64 GNU/Linuxroot@VM-8-10-ubuntu:/home/lighthouse# cat /etc/*release*	# OS 版本
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04 LTS"
PRETTY_NAME="Ubuntu 22.04 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04 (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

② 卸載之前版本,如果是新購買的云服務器是沒有的,比如輸入 docker 顯示沒有這個命令,就無需卸載

# 卸載舊版本
sudo apt-get remove docker docker-engine docker.io containerd runc# 卸載歷史版本
# 卸載軟件
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y# 刪除目錄
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
  • 舊版本是因為 歷史上 docker 名字發生了改變,后面才變為 社區版 docker-ce

③ 準備條件

sudo apt update	# 更新軟件包索引# curl 命令安裝	-- 以便能夠通過HTTPS使用APT
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -y 
root@VM-8-10-ubuntu:/home/lighthouse# curl www.baidu.com	# 測試# 創建 gpg key 目錄 -- 
sudo mkdir -m 0755 -p /etc/apt/keyrings# 下載并添加GPG密鑰
#添加 Docker 官方 GPG key (可能國內現在訪問會存在問題)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 阿里源(推薦使用阿里的gpg KEY)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg#添加 apt 源:
#Docker官方源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null#阿里apt源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null#更新源
sudo apt update
sudo apt-get update

④ 安裝

sudo apt install docker-ce docker-ce-cli containerd.io # 安裝 Docker Engine# 查看Docker版本
sudo docker version	
root@VM-8-10-ubuntu:/home/lighthouse# docker version
Client: Docker Engine - CommunityVersion:           28.3.2API version:       1.51Go version:        go1.24.5Git commit:        578ccf6Built:             Wed Jul  9 16:13:42 2025OS/Arch:           linux/amd64Context:           defaultServer: Docker Engine - CommunityEngine:Version:          28.3.2API version:      1.51 (minimum version 1.24)Go version:       go1.24.5Git commit:       e77ff99Built:            Wed Jul  9 16:13:42 2025OS/Arch:          linux/amd64Experimental:     falsecontainerd:Version:          1.7.27GitCommit:        05044ec0a9a75232cad458027ca83437aae3f4darunc:Version:          1.2.5GitCommit:        v1.2.5-0-g59923efdocker-init:Version:          0.19.0GitCommit:        de40ad0

⑤ 自啟動配置

#配置加載 
sudo systemctl daemon-reload 
#啟動服務 
sudo systemctl start docker 
#開啟啟動 
sudo systemctl enable docker 
#查看服務狀態 
sudo systemctl status docker 

執行 hello-world

如果出現了如下報錯:

root@VM-8-10-ubuntu:/home/lighthouse# docker run hello-world
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)Run 'docker run --help' for more information

原因:因為最近國內無法訪問到Docker的,首先在安裝的時候,我們選擇的是國內阿里的源,因此就需要在docker daemon 配置文件中增加國的可用的 docker hub mirror ,找到你的daemon.json 文件,解決辦法如下:

root@VM-8-10-ubuntu:/etc/docker# vim /etc/docker/daemon.json
vi /etc/docker/daemon.json 
{"registry-mirrors": ["https://docker.m.daocloud.io","https://dockerhub.timeweb.cloud","https://huecker.io"]
}
# 通常來講如果沒有其它的配置,那么daemon.json完整的文件內容就是如上# 文件內容輸入后
root@VM-8-10-ubuntu:/etc/docker# sudo systemctl daemon-reload
root@VM-8-10-ubuntu:/etc/docker# sudo systemctl restart docker# 此時就可以正常輸出了
root@VM-8-10-ubuntu:/home/lighthouse# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
e6590344b1a5: Pull complete 
Digest: sha256:ec153840d1e635ac434fab5e377081f17e0e15afab27beb3f726c3265039cfff
Status: Downloaded newer image for hello-world:latestHello 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 theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare 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/# 查看所有容器
root@VM-8-10-ubuntu:/home/lighthouse# docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
a856f33f502f   hello-world   "/hello"   7 minutes ago   Exited (0) 7 minutes ago             affectionate_leavitt

允許非Root用戶執行docker 命令

當我們安裝好了Docker之后,有兩種方式來執行docker 命令

  • 在docker命令前加上sudo, 比如:sudo docker ps
  • sudo -i 切換至root用戶,再執行docker 命令

是不是可以讓當前用戶在不切root,或者不加sudo 的情況下正常使用 docker 命令呢?答案是有的,如下:

# 1.添加docker用戶組
root@VM-8-10-ubuntu:/home/lighthouse# sudo groupadd d# 2.將當前用戶添加到用戶組
root@VM-8-10-ubuntu:/home/lighthouse# sudo usermod -aG docker lighthouse# 3.使權限生效
lighthouse@VM-8-10-ubuntu:~$ newgrp docker
lighthouse@VM-8-10-ubuntu:~$ docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
a856f33f502f   hello-world   "/hello"   10 minutes ago   Exited (0) 10 minutes ago             affectionate_leavitt

但是此時我們會發現,當每次打開新的終端,都必須先執行一次 newgrp docker 命令,否則當前用戶還是不可以執行docker命令,那我們該怎么解決呢,更新.bashrc文件:我們需要編輯 ~/.bashrc文件,并在文件末尾增加 如下一行:

groupadd -f docker

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915464.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915464.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915464.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一次 POI 版本升級踩坑記錄

前言 結論先行。 開發過程中由于可能涉及到二次開發,若原系統開發時間久遠,沒有達成一致規范設計,導致風格各異,確實滿足當時開發場景,但增大了后續的更新的難度,容易出現俄羅斯套娃現象,新的更…

硬件設計學習DAY13——電源緩沖電路設計全解

每日更新教程,評論區答疑解惑,小白也能變大神!" 目錄 一.緩沖電路介紹 1.1緩沖電路的作用 1.2寄生參數的來源 1.3緩沖電路的類型 1.4常見緩沖電路設計 1.5設計原則 二.吸收與緩沖 2.1吸收與緩沖的核心作用 2.2電壓尖峰與吸收措…

鴻蒙搜狐新聞如何在Native調用ArkTS方法

01前言鴻蒙作為一款新興的智能操作系統,現在適配鴻蒙系統的應用越來越多,同時會面臨三端兼容問題,如同一產品功能,需要維護iOS、Android、鴻蒙三端代碼。拿文件上傳、下載功能場景舉例,同時要適配iOS、Android、鴻蒙三…

Java行為型模式---中介者模式

中介者模式基礎概念中介者模式(Mediator Pattern)是一種行為型設計模式,其核心思想是通過一個中介對象來封裝一系列對象之間的交互,使各對象不需要顯式地相互引用,從而降低耦合度,并可以獨立地改變它們之間…

Python爬蟲實戰:研究Korean庫相關技術

一、引言 1.1 研究背景與意義 隨著韓流文化在全球的傳播,韓語網頁內容急劇增加。韓國在科技、娛樂等領域的信息具有重要研究價值。然而,韓語獨特的黏著語特性(如助詞體系、詞尾變化)給信息處理帶來挑戰。傳統爬蟲缺乏對韓語語言特點的針對性處理,本研究旨在開發一套完整…

表單校驗--數組各項獨立校驗

寫需求時遇到一個這樣的問題&#xff0c;就是校樣項是多個的&#xff0c;但是其字段名稱相同這時我們可以這樣校驗&#xff0c;注意字段之間的關聯性<div v-for"(item,index) in formData.hospitalDoctorList" :key"item.key || index"><el-form-…

基于SpringBoot和leaflet-timeline-slider的歷史敘事GIS展示-以哪吒2的海外國家上映安排為例

目錄 前言 一、哪吒2的海外之路 1、海外征戰歷程 2、上映國家空間查詢 二、后端接口的實現 1、模型層的實現 2、上映時間與國家 3、控制層的實現 三、基于leaflet-timeline-slider的前端實現 1、時間軸控件的引入及定義 2、時間軸綁定事件 3、成果展示 四、總結 前言…

tar 解壓:Cannot change ownership to uid 1000, gid 1000: Operation not permitted

tar 解壓 tar.gz 壓縮包報錯&#xff1a; # tar xzf $INPUT_FOLDER/archive.tar.gz -C /mnt/test-nas/[..] tar: xx.jpg: Cannot change ownership to uid 1000, gid 1000: Operation not permitted原因是用普通用戶執行的解壓縮腳本&#xff0c;用root用戶執行tar解壓縮&…

騰訊客戶端開發面試真題分析

以下是針對騰訊客戶端開發工程師面試問題的分類與高頻問題分析&#xff08;基于??105道問題&#xff0c;總出現次數118次??&#xff09;。按技術領域整合為??7大類別??&#xff0c;按占比排序并精選高頻問題標注優先級&#xff08;1-5&#x1f31f;&#xff09;&#x…

線上問題排查之【CPU飆高100%】

目錄 案例 發現問題 排查問題 步驟一 步驟二 步驟三 案例 import java.util.concurrent.TimeUnit;/*** 簡單寫一個CPU飆高的案例*/ public class CpuLoadUp {// 這里定義了一個標識private volatile static int flag 0;public static void main(String[] args) {// 執行…

c語言 進階 動態內存管理

動態內存管理1. 為什么存在動態內存分配2. 動態內存函數的介紹?2.1 malloc 和 freemalloc 函數free 函數2.2內存泄漏2.3 calloc2.4 realloc3. 常見的動態內存錯誤3.1 對NULL指針的解引用操作3.2 對動態開辟空間的越界訪問3.3 對非動態開辟內存使用free釋放3.4 使用free釋放一塊…

Redis的五大基本數據類型

一、Redis基本知識與Redis鍵&#xff08;key&#xff09;常用操作命令。redis的默認端口6379。mysql默認端口號3306。 默認16個數據庫&#xff0c;類似數組的下標從0開始&#xff0c;初始默認使用0號庫。可以使用select index來切換數據庫&#xff0c;如&#xff1a;select 1&a…

達夢數據庫JSON_TABLE使用說明

在達夢數據庫&#xff08;DM Database&#xff09;中&#xff0c;將 JSON 數據轉換為表格形式可以使用內置的 JSON_TABLE 函數。以下是詳細步驟和示例&#xff1a;1. 核心函數&#xff1a;JSON_TABLE JSON_TABLE 用于將 JSON 數據解析為關系表結構&#xff0c;支持從 JSON 對象…

A316-1926-V1 USB多路高清音頻解碼器模組技術解析

隨著數字音頻技術的不斷發展&#xff0c;高品質音頻解決方案的需求日益增長。本文將介紹一款基于XMOS技術的高性能USB音頻解碼器模組——A316-1926-V1&#xff0c;這是一款專為高清音頻應用設計的專業模組。核心技術與特性A316-1926-V1是一款集成了多項先進技術的USB多路高清音…

.NET 8 中的 KeyedService

.NET 8 中的 KeyedService&#xff1a;新特性解析與使用示例 一、引言 在 .NET 8 的 Preview 7 版本中&#xff0c;引入了 KeyedService 支持。這一特性為開發者提供了按名稱&#xff08;name&#xff09;獲取服務的便利&#xff0c;在某些場景下&#xff0c;開發者無需再自行…

Paimon對比基于消息隊列(如Kafka)的傳統實時數倉方案的優勢

弊端&#xff1a;數據重復 -> 優勢&#xff1a;Paimon 主鍵表原生去重原方案弊端 (Kafka)問題: 消息隊列&#xff08;Kafka&#xff09;是僅支持追加&#xff08;Append-Only&#xff09;的日志流。當 Flink 作業發生故障恢復&#xff08;Failover&#xff09;或業務邏輯迭代…

Linux Shell 命令 + 項目場景

shell 命令1. 基礎文件操作命令1.1 ls - 列出目錄內容1.2 find - 文件搜索2. 版本控制命令2.1 git - 版本控制系統2.2 高級 Git 操作3. 文本搜索命令3.1 grep - 文本搜索3.2 高級搜索技巧4. Android 構建系統命令4.1 source - 加載環境變量4.2 lunch - 選擇構建目標4.3 m - And…

A316-Mini-V1:超小尺寸USB高清音頻解碼器模組技術探析

引言 隨著便攜式音頻設備的普及&#xff0c;對小型化、高性能音頻解決方案的需求日益增長。本文將介紹一款極致小型化的高性能USB音頻解碼器模組——A316-Mini-V1&#xff0c;這是一款基于XMOS XU316芯片的微型音頻處理模組。產品概述 A316-Mini-V1是一款專為小尺寸產品設計的M…

低代碼平臺買saas好還是私有化好

選擇低代碼平臺采用SaaS還是私有化部署&#xff0c;應根據企業具體情況考慮安全性、成本控制、維護難度、擴展需求等因素。 其中&#xff0c;安全性是決定企業選擇的重要因素之一。私有化部署意味著企業能夠完全掌控數據和系統的安全管理&#xff0c;更適合對數據安全要求極高的…

基于SkyWalking的微服務APM監控實戰指南

基于SkyWalking的微服務APM監控實戰指南 1. 業務場景描述 隨著微服務在生產環境中大規模應用&#xff0c;系統鏈路復雜、實例彈性伸縮、灰度發布等特點都給性能監控和問題診斷帶來了新的挑戰。傳統的單機或輕量級監控方案已無法滿足微服務環境下的全鏈路、分布式追蹤和實時告警…