【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;系统链路复杂、实例弹性伸缩、灰度发布等特点都给性能监控和问题诊断带来了新的挑战。传统的单机或轻量级监控方案已无法满足微服务环境下的全链路、分布式追踪和实时告警…