前置了解:
- 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,如下:
-
檢查及卸載(如需)
systemctl status lxc lxc-stop -n xxx # 停止所有運行的容器 lxc-destroy -n xxx # 刪除所有容器 apt-get purge --auto-remove lxc lxc-templates systemctl status lxc # 確保服務已卸載
-
安裝 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 虛擬化的區別
特性 | JVM | Docker 容器 |
---|---|---|
性能 | 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 架構
- 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):容器是獨立運行的一個或一組應用
類比理解:上面概念比較難以理解,我們列舉個生活中的案例,以一家人去旅游入住酒店為例。
- 我們一家人和朋友一塊旅游去酒店,我們就是 Docker Client。
- 到酒店辦理入住,辦理退房,繳費需要酒店前臺提供各種服務,酒店前臺就是我們的 Docker Daemon,Docker 的核心服務端。
- 酒店是建在美麗的海邊,酒店的宅基地和大樓就是我們實際的物理服務器或者虛擬服務器,也就是 Docker Host。
- 酒店就 1000 多個房間,每個房間里面不一樣,有標間、大床房、家庭房等,這就是 Docker 鏡像倉庫。
- 酒店的標準的房間豪華大床房和雙人標間,這個就是 Docker 鏡像,我們客戶是沒有辦法修改的。
- 我們辦理完入住了一個豪華大床房,然后把行李,個人物品帶到了一個具體的房間號,比如 9527,那么這個房間我們可以使用了,朋友也開了一間豪華大床房,雖然豪華大床房一樣,但是我們攜帶的物品都不一樣,這個就是容器 Docker Container。
- 容器的銷毀,也就是我們一周后旅游結束了,搬出了酒店,酒店把我們的房間恢復了鏡像原來的樣子。
4.3 Docker 生態
我們來考慮 2 個問題,Docker 為什么要設計鏡像,然后又搭建個 Docker Hub,搞個鏡像倉庫呢?我們來看下現在的時代發生了什么。
1. 數據量瘋狂增長:
- 其中 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