当前位置: 首页 > java >正文

【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.xdnf.cn/news/15887.html

相关文章:

  • 算法训练营day25 回溯算法④ 补充联系题目 332.重新安排行程、51. N皇后、37. 解数独
  • 【详细笔记】两类曲线积分转换
  • 14.多播与广播
  • ESMFold 安装教程
  • Linux主机 ->多机器登录
  • 尚庭公寓--------登陆流程介绍以及功能代码
  • PostgreSQL 字段类型速查与 Java 枚举映射
  • XSS的介绍
  • LWJGL教程(3)——时间
  • JWT原理及利用手法
  • 基于单片机倾角测量仪/角度测量/水平仪
  • spring-ai-alibaba如何上传文件并解析
  • 【高等数学】第四章 不定积分——第四节 有理函数的积分
  • 元学习算法的数学本质:从MAML到Reptile的理论统一与深度分析
  • 人脸识别:AI 如何精准 “认人”?
  • 【新手向】PyTorch常用Tensor shape变换方法
  • Spring Boot 订单超时自动取消的 3 种主流实现方案
  • 响应式编程入门教程第九节:UniRx 高级特性与自定义
  • LeetCode|Day20|9. 回文数|Python刷题笔记
  • DOM型XSS破坏
  • PID控制原理分析及应用(稳态误差详细分析)(一)
  • 如何升级Docker部署的Dify
  • API接口签名和敏感信息加密使用国密SM方案
  • 数据结构——时间复杂度
  • Python知识点4-嵌套循环break和continue使用死循环
  • 论文分享(一)
  • Spring MVC上下文容器在Web容器中是如何启动的(源码深入剖析)?
  • Self-Consistency:跨学科一致性的理论与AI推理的可靠性基石
  • Linux操作系统从入门到实战(十一)回车换行问题与用户缓冲区问题
  • 通俗易懂神经网络:从基础到实现