docker安装及使用

本章要点:docker安装、加速器站点、镜像查看类命令,镜像导入导出

官方教程

安装说明

从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。

Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。

本文介绍 Docker CE 的安装使用

  1. 本文安装前说明

    架构:    X86_64
    内核:	   3.10
    操作系统: centos 7
    
  2. 跟官方走,如果有先卸载

    yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
    
  3. 安装一些必要的系统工具

    安装所需的软件包。 yum-utils 提供了 yum-config-manager 应用,并 device-mapper-persistent-data 和 lvm2 由需要 devicemapper 存储驱动程序。
    
    # centos基础源:  https://developer.aliyun.com/mirror/centos
    # centos epel源: https://developer.aliyun.com/mirror/epel
    
    wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    
    yum install -y yum-utils device-mapper-persistent-data lvm2 yum-utils
    
  4. 添加软件源信息

    • 官方源

      yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
      
    • 阿里源

      yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      
    • 阿里源-arm架构

      [docker-ce-stable]
      name=Docker CE Stable - aarch64
      baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/aarch64/stable
      enabled=1
      gpgcheck=1
      gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
      
      [c7-docke1r]
      name=docker 
      baseurl=http://mirror.centos.org/altarch/7/extras/aarch64/
      gpgcheck=0
      enabled=1
      
  5. 正式安装, 这里直接用阿里云的参考

    # step 1: 安装必要的一些系统工具
    sudo yum install -y yum-utils
    
    # Step 2: 添加软件源信息
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    # Step 3: 安装Docker
    yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin
    
    # Step 4: 开启Docker服务,启动前先配加速站点
    systemctl start docker
    
    # 注意:
    # 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
    # vim /etc/yum.repos.d/docker-ce.repo
    #   将[docker-ce-test]下方的enabled=0修改为enabled=1
    #
    # 安装指定版本的Docker-CE:
    # Step 1: 查找Docker-CE的版本:
    # yum list docker-ce.x86_64 --showduplicates | sort -r
    #   Loading mirror speeds from cached hostfile
    #   Loaded plugins: branch, fastestmirror, langpacks
    #   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
    #   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
    #   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
    #   Available Packages
    # Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
    # sudo yum -y install docker-ce-[VERSION]
    
    # 如果一直报 docker-compose-plugin 不存在,则直接下载到本地先安装,然后在安装
    # 下载指定版本 RPM(以 2.27.0 为例,兼容性强)
    wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-compose-plugin-2.27.0-1.el7.x86_64.rpm 
    # 安装本地 RPM 
    sudo yum install -y ./docker-compose-plugin-2.27.0-1.el7.x86_64.rpm 
    
  6. 查看安装版本 - 注意这里有新的架构设计
            当使用Docker时,必须要启动Docker Daemon的正常运行,它即要管理容器的运行时,又要负责提供对外部API的响应,而一旦Docker Daemon服务不正常,则已经运行在Docker主机上的容器也往 往 无法继续使用;
            所以在1.11.0+版本时,开发团队开始将维护容器运行的任务放到一个单独的组件containerd中来管理,并且支持OCI的runc规范,原先对客户端API的支持仍然放在Docker Daemon,通过解耦,大大减少对Docker Daemon的依赖;

]# docker version
Client: Docker Engine - Community
Version:           26.1.4
API version:       1.45
Go version:        go1.21.11
Git commit:        5650f9b
Built:             Wed Jun  5 11:32:04 2024
OS/Arch:           linux/amd64
Context:           default

Server: Docker Engine - Community
Engine:
Version:          26.1.4
API version:      1.45 (minimum version 1.24)
Go version:       go1.21.11
Git commit:       de5c9cf
Built:            Wed Jun  5 11:31:02 2024
OS/Arch:          linux/amd64
Experimental:     false
containerd:
Version:          1.6.33
GitCommit:        d2d58213f83a351ca8f528a95fbd145f5654e957
runc:
Version:          1.1.12
GitCommit:        v1.1.12-0-g51d5e94
docker-init:
Version:          0.19.0
GitCommit:        de40ad0

docker加速器

docker镜像加速器配置daemon.json不生效加速站点

  1. 环境配置文件:

    /etc/sysconfig/docker-network
    /etc/sysconfig/docker-storage
    /etc/sysconfig/docker
    /etc/docker/
    
  2. Unit File: /usr/lib/systemd/system/docker.service

  3. 配置文件: /etc/docker/daemon.json

  4. docker镜像加速: 获取镜像加速站点

    我这里直接用
    Docker镜像代理加速地址:https://dockerproxy.com
    支持:Docker Hub、GCRK8SGHCR
    国内站点好多找不到镜像,直接用加速地址,其它的可参考https://blog.csdn.net/Kiffy_Yam/article/details/151852138
    
    站点2:https://www.kelen.cc/dry/docker-hub-mirror
    
    # 评论区翻的 我用的这个:https://docker.gh-proxy.com/
    

    配置文件

    docker]# cat /etc/docker/daemon.json 
    {
      "insecure-registries": ["docker.gh-proxy.com"],
      "exec-opts": ["native.cgroupdriver=systemd"]
    }
    
    systemctl daemon-reload && systemctl restart docker
    
  5. 外部访问

    # 通过指定 tcp 2375端口接收外部的请求
    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
    
  6. 检查加速器是否生效

    # 查看镜像地址是否匹配,如匹配,说明配置成功
    ]# docker info
    Client: Docker Engine - Community
     Version:    26.1.4
    Server: 
     Containers: 0
      Running: 0
      Paused: 0
      Stopped: 0
     Images: 0
     Server Version: 26.1.4
     Storage Driver: overlay2
      Backing Filesystem: xfs
     Logging Driver: json-file
     Cgroup Driver: cgroupfs
     Swarm: inactive
     Runtimes: io.containerd.runc.v2 runc
     Default Runtime: runc
     containerd version: d2d58213f83a351ca8f528a95fbd145f5654e957
     Kernel Version: 3.10.0-1127.el7.x86_64
     Operating System: CentOS Linux 7 (Core)
     Name: localhost.localdomain
     ID: eded39a4-2d94-4394-af76-4a3c7bcc17b1
     Docker Root Dir: /var/lib/docker
     Registry Mirrors:
      https://kws77ppk.mirror.aliyuncs.com/
      http://mirrors.tencentyun.com/
      http://mirrors.css.tencentyun.com/
    

docker镜像

官方镜像镜像加速站点1镜像加速站点2镜像加速站点3 或者 百度一下

Docker 获取镜像相关命令

search

语法: docker search 名称

  • 搜索镜像: docker search

    • 参数: -s: 指定仅显示评价为指定的星级 默认为0,即所有 docker search -s 3 nginx
    • -s在1.12已废弃,可使用: docker search -f stars=100 ubuntu 收藏超过百次的
    # 完整示例
    docker search 名称      # 不过我这里镜像加速一直不成功搜索不到
    
    # 建议使用 https://hub.docker.com/ 
    # 使用通过查到的tag名在pull下来  比如查到的这个 nginx:stable-alpine
    # docker pull docker.gh-proxy.com/nginx:stable-alpine
    
  • 查看本地上存活的容器: docker ps -a

pull

语法: docker pull 指定网站前缀/tag名

  • 拉取镜像

    # 如果有梯子,需要自己从dockerhub上看一下tag名
    # 我这里下载 tomcat8.5.100做测试
    docker pull docker.gh-proxy.com/tomcat:8.5.100-jre8
    # docker pull 下载  指定网站前缀/tag名
    
  • 下载也可以指定源

    docker pull 镜像名称 -–registry-mirror=国内镜像源地址
    
image

语法: docker images | docker image -ls

  • 列出本地主机上已有的镜像: docker images | docker image -ls

  • 虚悬镜像: 由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为空的镜像。这类无标签镜像也被称为 虚悬镜像(danglingimage) 。 一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除:docker image prun

  • 删除镜像

    语法: docker image rm  <镜像1> [<镜像2>.....]
      可以用 ID、镜像名、摘要删除镜像 其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要。
    
    如果要删除本地的镜像,可以使用 docker image rmi / rm 命令
       切记: 要删除镜像必须确认此镜像⽬前没有被任何容器使⽤
       
    删除镜像: `docker [image] rmi  ID|或名称`
    - 如果有多个TAG的则只会删除tag, 否则就会直接删除这个镜像所有层
    - `docker rmi -f ID`   强制删除镜像 
    
    删除容器: `docker rm ID | 名称`
    
tag
  • 为镜像添加镜像标签: docker tag

    • docker tag ubuntu:latest test:latest
    # images跟tag的用法
    docker]# docker images
    REPOSITORY                   TAG             IMAGE ID       CREATED         SIZE
    docker.gh-proxy.com/tomcat   8.5.100-jre8    edf8233555ae   18 months ago   242MB
    
    docker]# docker tag edf8233555ae tomcat:8.5.100-jre8
    
    docker]# docker images
    REPOSITORY                   TAG             IMAGE ID       CREATED         SIZE
    docker.gh-proxy.com/tomcat   8.5.100-jre8    edf8233555ae   18 months ago   242MB
    tomcat                       8.5.100-jre8    edf8233555ae   18 months ago   242MB
    
inspect
  • 获取镜像的全部信息: docker inspect

    • 返回的是一段json格式的信息,如果只需要其中一项,则可以使用 -f: docker inspect -f {{"Architecture"}}
    docker]# docker inspect edf8
    [
        {
            "Id": "sha256:edf8233555aef3be2d58eaab5d25f9f95826267db75eb4752dfce673d306f480",
            "DockerVersion": "20.10.23",
            "Author": "",
            "Config": {
                "ExposedPorts": {
                    "8080/tcp": {}
                },
                "Tty": false,
                "OpenStdin": false,
                "StdinOnce": false,
                "Env": [
                    "JAVA_HOME=/opt/java/openjdk",
                    "JAVA_VERSION=jdk8u402-b06",
                    "CATALINA_HOME=/usr/local/tomcat",
                    "GPG_KEYS=05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 5C3C5F3E314C866292F359A8F3AD5C94A67F707E 765908099ACF92702C7D949BFA0C35EA8AA299F1 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23",
                    "TOMCAT_MAJOR=8",
                    "TOMCAT_VERSION=8.5.100",
                    "TOMCAT_SHA512=14d8dca911fe9c5b7e636e054ac2e70a532ddc358eda83ed3679e51df8baa7a397cabb8a5777b815014d46064cbc33e8d9ea75b9426dccdae54fb3913d9a54f0"
                ],
                "Cmd": [
                    "catalina.sh",
                    "run"
                ],
                "Image": "sha256:e1253d8f3cd0299ef11144fc3c2587bd145f84a24ac41c90e08136d959baa3ab",
                "WorkingDir": "/usr/local/tomcat",
            },
            "Architecture": "amd64",
            "Os": "linux",
            "Size": 242229815,
            "GraphDriver": {
                "Name": "overlay2"
            },
            "RootFS": {
                "Type": "layers",
                "Layers": [
                    "sha256:1",
                    "sha256:2",
                    "sha256:3",
                    "sha256:4",
                    "sha256:5",
                    "sha256:6",
                    "sha256:7",
                    "sha256:8",
                ]
            },
        }
    ]
    
    名词 解释
    ExposedPorts 运行时的端口
    Env 部分的环境变量,如jdk版本,tomcat版本,运行目录都有显示
    Cmd 多次提示:容器最后一定程序要运行在前台,否则会直接退出
    WorkingDir 工作目录
    Architecture、Os 架构跟系统, 目前架构还是蛮多的:amd,arm,龙芯
    RootFS 分层机制,可以看第2章节
history
  • 查看镜像的构建历史信息: docker history

    docker]# docker history edf8233555ae
    IMAGE     CREATED   CREATED BY                                       SIZE      COMMENT
    edf8233555ae   18 months ago   /bin/sh -c #(nop)  CMD ["catalina.sh" "run"]     0B
    <missing>      18 months ago   /bin/sh -c #(nop)  ENTRYPOINT []                 0B
    <missing>      18 months ago   /bin/sh -c #(nop)  EXPOSE 8080                   0B
    <missing>      18 months ago   /bin/sh -c set -eux;  nativeLines="$(catalin…   0B
    ...
    具体自行看一下,这里就是rootfs分层每层的构建历史
    

docker保存镜像

save

导出镜像, 语法: docker save -o 名称.tar.gz [镜像名称|id]

docker]# docker save --help
Usage:	docker save [OPTIONS] IMAGE [IMAGE...]
Options:
  -o, --output string   Write to a file, instead of STDOUT

# 完整示例
docker]# docker images
REPOSITORY                   TAG             IMAGE ID       CREATED         SIZE
docker.gh-proxy.com/nginx    stable-alpine   a97d82f709e2   5 months ago    48.2MB

docker]#  docker save -o nginx1.28.tar.gz a97d82f709e2

docker]# ls -lh
-rw-------  1 root root  48M 109 16:00 nginx1.28.tar.gz
load

导入镜像,语法: docker load -i nginx1.28.tar.gz

docker ]# docker load --help
Usage:	docker load [OPTIONS]
Options:
  -i, --input string   Read from tar archive file, instead of STDIN
  -q, --quiet          Suppress the load output

# 完整示例
docker ]#  docker images    <--刚刚保存好的镜像
REPOSITORY                   TAG             IMAGE ID       CREATED         SIZE
docker.gh-proxy.com/nginx    stable-alpine   a97d82f709e2   5 months ago    48.2MB

# 导入, 如果这个镜像存在, sha256一样, 那它就会覆盖不会改变 
docker ]# docker load -i nginx1.28.tar.gz 
Loaded image ID: sha256:a97d82f709e2e0ef35e48a697aec860e12cbf2a0ffbfd95d7701976e81d470ed

docker ]# docker images
REPOSITORY                   TAG             IMAGE ID       CREATED         SIZE
docker.gh-proxy.com/nginx    stable-alpine   a97d82f709e2   5 months ago    48.2MB

# 继续示例, 我们先将它给删了,然后再导入
docker ]# docker rmi a97d82f709e2
Untagged: docker.gh-proxy.com/nginx:stable-alpine
Untagged: docker.gh-proxy.com/nginx@sha256:618ae69c5193a9af9977b5a2740ebc84fedbd771628934bfdd6476c0be24db5d
.....

docker ]# docker images
REPOSITORY                   TAG            IMAGE ID       CREATED         SIZE
空的了。

docker ]# docker load -i nginx1.28.tar.gz 
7003d23cc217: Loading layer ......
Loaded image ID: sha256:a97d82f709e2e0ef35e48a697aec860e12cbf2a0ffbfd95d7701976e81d470ed
# 可以发现这里的sha256跟之前导入是一样的,如果不一样那就说明你原始保存就有问题了

docker ]# docker images    <-- 可以发现保存的镜像 名称跟tag都是none
REPOSITORY                   TAG            IMAGE ID       CREATED         SIZE
<none>                       <none>         a97d82f709e2   5 months ago    48.2MB

# 我们需要手动改一下tag, 这里tar.gz就很重要了,一定要见名知意否则到其它环境就不知道是啥。
docker ]# docker tag a97d82f709e2 nginx:1.28

docker ]# docker images
REPOSITORY                   TAG            IMAGE ID       CREATED         SIZE
nginx                        1.28           a97d82f709e2   5 months ago    48.2MB
import

跟load一样也是导入,推荐使用load,使用import会丢失元数据

# 语法: docker import [OPTIONS] file | URL | - [REPOSITORY] [:TAG]
#  完整示例
docker ]# cat nginx1.28.tar.gz | docker import - nginx1.28-2
sha256:f81d88295fb3ee5b6e33b15c5062189eb2a303204a2a95a30549e92a72b84bf8

# 注意查看sha256值,已经产生变化了,原因查看下章
docker ]# docker images
REPOSITORY                   TAG            IMAGE ID       CREATED          SIZE
nginx1.28-2                  latest         f81d88295fb3   2 seconds ago    49.6MB
load与import对比

本章来源ai, Docker 中 docker loaddocker import 命令均用于导入文件生成镜像,但核心功能、适用场景和实现机制有显著区别,具体对比如下:

  1. 核心区别对比表

    特性 docker import docker load
    输入来源 文件系统层压缩包(如普通 tar 包) Docker 镜像归档文件(需通过 docker save 生成)
    输出结果 生成一个新的空白历史镜像(单层结构) 恢复完整镜像(含所有层、标签、历史记录)
    元数据保留 ❌ 丢失所有元数据(层历史、CMD、ENV 等) ✅ 完整保留所有元数据(如分层结构、默认命令)
    构建缓存支持 ❌ 无法利用构建缓存(单层结构) ✅ 保留分层结构,可复用缓存提升构建效率
    典型用途 从文件系统快速创建镜像(如旧系统备份) 迁移/备份完整 Docker 镜像(含所有配置)
  2. docker import:从文件系统创建新镜像

    • 本质:将普通 tar 包(包含文件系统内容)直接转化为一个新的镜像,仅保留文件系统层,不包含 Docker 镜像特有的元数据。

    • 特点

      • 单层结构:tar 包内容作为镜像的唯一文件系统层,无分层历史。
      • 元数据丢失:导入后的镜像没有默认命令(需手动通过 docker run 指定启动进程)、环境变量等配置。
      • 轻量快速:适合从离线文件(如服务器备份、旧系统文件)快速构建基础镜像。
    • 示例

      docker import backup.tar  my-custom-image:v1 
      
  3. docker load:恢复完整镜像归档

    • 本质:从 docker save 生成的归档文件中恢复完整镜像,包括所有分层结构、标签、历史记录和元数据

    • 特点:

      • 完整保留:恢复的镜像与原始镜像完全一致,可直接运行(无需重新配置默认命令)。
      • 分层复用:保留镜像分层结构,支持 Docker 构建缓存,后续更新镜像时可复用已有层。
      • 镜像迁移:常用于跨环境迁移完整镜像(如开发环境 → 生产环境)。
    • 示例

      # 从 save 生成的归档文件加载镜像 
      docker load -i saved-image.tar   # saved-image.tar  由 `docker save` 导出 
      
  4. 使用场景选择

    • docker import

      当你只有文件系统内容(如 rootfs.tar ),需要快速创建一个基础镜像,且无需保留 Docker 特定配置时(如从虚拟机备份文件构建镜像)

    • docker load

      当你需要迁移或恢复完整的 Docker 镜像(含标签、启动命令、环境变量等)时,例如从其他机器导入已打包好的镜像归档

  5. 总结

    • docker import 是**“文件系统 → 新镜像”**的轻量转换工具,适合快速构建基础镜像,但丢失元数据。
    • docker load 是**“镜像归档 → 完整镜像”**的恢复工具,适合迁移完整镜像,保留所有配置和分层结构。
  6. 两者的核心差异在于是否保留 Docker 镜像特有的元数据和分层结构,需根据实际需求选择

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐