docker介绍以及安装

文章目录

    • [1. 前言](#1. 前言)
    • [2. 概念介绍](#2. 概念介绍)
    • [3. ubuntu系统安装docker](#3. ubuntu系统安装docker)
    • [4. 参考](#4. 参考)

docker介绍以及安装

1. 前言

大家有没有遇到这种问题,一个程序在自己这边运行的很正常,在另外的电脑上就会出现各种问题,有依赖呀,有配置呀,总会把我们折腾的半死不活,最后问题解决了,也就那么回事儿。那有没有一种技术可以让这种环境差异消除呢?有,它就是我们的docker技术。

2. 概念介绍

  1. 镜像(Image)
    • 类似于"应用的安装包"或"乐高积木模板",包含运行程序所需的所有文件(如代码、库、配置、工具)。
    • 特点 :静态、只读、可复用,例如 nginx:latest 镜像就是预装了 Nginx 服务器的模板。
  2. 容器(Container)
    • 镜像的"运行实例",相当于"打开乐高积木盒开始拼装"。
    • 一种轻量级的运行时环境,通过隔离进程、文件系统、网络等资源,将应用程序及其依赖打包成独立单元,更加节省资源(cpu、内存、磁盘、带宽等)的虚拟机。
    • 特点 :动态、隔离,每个容器独立运行,互不影响;省钱、成本低、速度更加快,扩展性更加强。例如,一个容器跑网站前端,另一个跑数据库。
  3. 仓库(Repository)
    • 存储镜像的"云盘"或"超市",如 Docker Hub,用户可下载或上传镜像。
  4. Docker
    • 技术层面 :Docker是一种基于容器化技术 的解决方案,通过操作系统级虚拟化(如Linux的NamespaceCgroups)实现应用程序的轻量级封装与隔离,解决了传统虚拟机资源占用高、启动慢的问题。
    • 软件层面 :是一个容器化平台,是管理容器的一套软件,提供容器的构建、管理、分发和运行的完整工具链。它基于Linux容器技术,封装了镜像构建(Dockerfile)、网络配置、存储管理等功能,是容器技术的标准化实现。

容器与镜像的关系类似于C++中的对象与类。

名称 类比
容器 类的实例化对象
镜像
  1. docker 架构

    Docker 使用客户端-服务器(C/S) 架构模式,使用远程API来管理和创建Docker容器。

概念 说明
Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器(Container) 容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker SDK (SDK | Docker Docs) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。
  1. Docker 与虚拟机的区别:
维度 Docker 容器 虚拟机
资源占用 轻量(共享宿主机内核) 重(需完整操作系统)
启动速度 秒级 分钟级
隔离性 进程级隔离(较弱) 硬件级隔离(较强)
适用场景 开发、微服务、快速部署 高安全性需求(如隔离敏感系统)

比喻

  • Docker 容器像"小汽车",灵活轻便,适合日常通勤。
  • 虚拟机像"卡车",笨重但安全,适合运输危险品。

3. ubuntu系统安装docker

遇事不决,先看文档。官方文档 docker安装文档 如下,我们根据自己的OS来进行不同的操作。

先确认自己的系统是否满足要求,如 ubuntu 需要 64位,且版本不低于 20.04。

3.1 卸载旧版本

我们的Linux 发行版可能提供非官方的 Docker 软件包,这可能会发生冲突 使用 Docker 提供的官方软件包。您必须卸载这些软件包 在安装 Docker Engine 正式版之前。

要卸载的非官方软件包是:

  • docker.io
  • docker-compose
  • docker-compose-v2
  • docker-doc
  • podman-docker
bash 复制代码
# 命令行执行以下指令进行卸载
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

看文档描述,有4种方式进行安装:

这里本人选择的是第二种,使用存储库进行安装。

3.2使用存储库进行安装

  • 设置 Docker 的存储库

    bash 复制代码
    sudo apt-get update
    sudo apt-get install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    
    # Add the repository to Apt sources:
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
      $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update

    上面的脚本大概解释一下:

    第1行进行软件包索引,确保后续操作基于最新软件源信息;

    第2行安装HTTPS通信所需的CA证书和curl工具

    • ca-certificates:确保系统能验证HTTPS连接的安全性(如后续下载GPG密钥)
    • curl:用于从网络获取文件(如下载Docker的GPG密钥)

    第3行创建专门存储APT仓库密钥的目录

    第4行下载Docker官方GPG密钥到指定位置

    第5行赋予所有用户读取权限,使APT进程能访问密钥文件,同时保持写入权限受限

    第8-11行中

    • arch=$(dpkg --print-architecture) 自动检测系统架构(如amd64/arm64),避免手动指定错误
    • $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") 获取系统代号(如jammy),适配不同Ubuntu版本
    • signed-by= 显式声明密钥路径,取代过时的apt-key add方式,符合现代APT安全规范
    • sudo tee /etc/apt/sources.list.d/docker.list将上面的输出拷贝到/etc/apt/sources.list.d/docker.list文件

    上面的脚本直接使用就可以,官方已经帮我们都做好了不同平台以及系统的兼容性;

  • 安装Docker软件包

    要安装特定版本的 Docker Engine,请首先列出 存储库中的可用版本:

    bash 复制代码
    # List the available versions:
    apt-cache madison docker-ce | awk '{ print $3 }'
     
    # 会显示大致如下的内容
    5:28.1.1-1~ubuntu.22.04~jammy
    5:28.1.0-1~ubuntu.22.04~jammy
    5:28.0.4-1~ubuntu.22.04~jammy
    5:28.0.3-1~ubuntu.22.04~jammy
    5:28.0.2-1~ubuntu.22.04~jammy
    5:28.0.1-1~ubuntu.22.04~jammy
    5:28.0.0-1~ubuntu.22.04~jammy
    5:27.5.1-1~ubuntu.22.04~jammy

    这里28.1.1 是 docker 版本,本人选择的是最新的和系统匹配镜像版本号匹配的5:28.1.1-1~ubuntu.22.04~jammy

    • 设置版本号变量并进行软件包安装

      bash 复制代码
      VERSION_STRING=5:28.1.1-1~ubuntu.22.04~jammy
      sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin

    下面就要开始漫长的等待了,因为镜像源在国外,可能要等待几十分钟或者个把小时。😭真是君不见进度条几K每秒,等了十分钟还有几十分钟。


经过漫漫如长夜的等待,我们终于安装好了。

  • 查看docker版本

    docker --version

    bash 复制代码
    root@hcss-ecs-75d4:/etc/apt/keyrings# docker --version
    Docker version 28.1.1, build 4eba377
  • 启动docker服务

    bash 复制代码
    systemctl start docker
  • 设置docker开机启动

    bash 复制代码
    systemctl enable docker

    上面的指令都需要在root权限下进行。

  • 测试Docker 是否正常工作

    bash 复制代码
    docker run hello-world

    我们会发现,并没有成功,会有如下错误打印:

    bash 复制代码
    Unable to find image 'hello-world:latest' locally
    docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded
    
    Run 'docker run --help' for more information

    大致的意思是说本地找不到镜像hello-world:latest,要去https://registry-1.docker.io/v2/仓库下载,但是超时的意思了。


    那怎么办呢?🤔搜索了一下,发现可以设置镜像加速,好东西啊。

  • 镜像加速设置

    每个云服务器厂商应该都有加速地址,本人这个使用的菊花的云服务器,大致步骤如下:
    *

    1. 登录华为云控制台,搜索并进入容器镜像服务(SWR)
    2. 导航至镜像资源 > 镜像中心 > 镜像加速器 ,复制专属加速地址(格式为<系统分配前缀>.mirror.swr.myhuaweicloud.com)。
    • 注意:加速地址需通过华为云控制台获取,不可随意使用公开地址。

上面会有详细步骤,其他云服务器厂商应该的都差不多。

我们按照步骤完成后,再次来测试一下:

bash 复制代码
root@hcss-ecs-75d4:/etc/docker# sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
e6590344b1a5: Pull complete
Digest: sha256:c41088499908a59aae84b0a49c70e86f4731e588a737f1637e73c8c09d995654
Status: Downloaded newer image for hello-world:latest

Hello 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 the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share 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/

这次就是快呢~🥰

3.3 可能会遇到的问题

  1. curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection to download.docker.com:443 docker的密钥/etc/apt/keyrings/docker.asc下载失败

    • 看了一下描述,是443端口异常,查看服务器的安全组规则,将出方向规则443端口打开。(入方向规则也打开一下)
  2. Got permission denied while trying to connect to the Docker daemon socket at unix:/指令运行会报错

    • 这其实是权限不够,需要将当前用户加入到docker组。
      • 默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。即我们当前的用户不是root用户。
    • 解决方法:把我们当前的用户添加到docker组中
      • sudo gpasswd -a username docker #将普通用户username加入到docker组中,username这个字段也可以直接换成$USER。
      • newgrp docker #更新docker组
      • 再执行你报错的命令,此时就不会报错了

至此,docker安装就差不多结束了,其他平台的安装请参考官网文档。后面我们在继续更新docker其他内容。

4. 参考

  1. docker架构与安装
  2. 初识docker 基本概念及安装使用
相关推荐
就叫飞六吧44 分钟前
Kubernetes弹性伸缩:让应用自动应对流量洪峰与低谷
云原生·容器·kubernetes
独行soc1 小时前
2025年渗透测试面试题总结-某战队红队实习面经(附回答)(题目+回答)
linux·运维·服务器·学习·面试·职场和发展·渗透测试
星川皆无恙2 小时前
大数据产品销售数据分析:基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现
大数据·运维·爬虫·python·机器学习·数据分析·系统架构
sky北城4 小时前
Jenkins忘记admin密码后的恢复步骤
运维·jenkins
瑟王4 小时前
Kubernetes笔记(1)Kubernetes入门
容器·kubernetes
FBI HackerHarry浩4 小时前
Linux云计算训练营笔记day02(Linux、计算机网络、进制)
linux·运维·网络·笔记·计算机网络·进制
乐言3615 小时前
接口自动化工具如何选择?以及实战介绍
运维·自动化
原来是猿6 小时前
Linux下的好玩的命令
linux·运维·服务器
IT小饕餮6 小时前
华为私有协议Hybrid
运维·服务器·华为
Lw老王要学习6 小时前
25_05_02Linux架构篇、第1章_03安装部署nginx
linux·运维·nginx·架构·云计算·it