Skip to content

Docker安装

在线安装

添加安装源

bash
# 安装 yum-utils 包
$ yum install yum-utils device-mapper-persistent-data lvm2 -y

# 使用阿里云资源库来加快 Docker 镜像的下载速度
$ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新本地缓存
$ yum makecache fast
  • yum-util 提供 yum-config-manager 功能

  • device-mapper-persistent-data 和 lvm2 是 devicemapper 依赖的,部分说明见下面说明:

    Device Mapper 是 linux 的内核用来将块设备映射到虚拟块设备的 framework,它支持许多高级卷管理技术。docker 的 devicemapper 存储驱动程序利用此框架的自动精简配置(thin provisioning) 和快照功能来管理 docker 镜像和容器。本文将 Device Mapper 存储驱动称为 devicemapper,将它的内核框架称为 Device Mapper

    Device Mapper 不同于 AUFSext4NFS 等,因为它并不是一个文件系统(File System),而是 Linux 内核映射块设备的一种技术框架。提供的一种从逻辑设备(虚拟设备)到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略。

    当前比较流行的 Linux 下的逻辑卷管理器如 LVM2(Linux Volume Manager 2 version)、EVMS(Enterprise Volume Management System)、dmraid(Device Mapper Raid Tool)等都是基于该机制实现的。

    值得一提的是 Device Mapper 工作在块级别(block),并不工作在文件级别(file)。Device Mapper 自 Linux 2.6.9 后编入 Linux 内核,所有基于 Linux 内核 2.6.9 以后的发行版都内置 Device Mapper,但你需要进行一些额外的配置才能在 docker 中使用它。比如在 RHEL 和 CentOS 系统中,docker 默认使用的存储驱动是 overlay。

    devicemapper 存储驱动使用专用于 docker 的块设备,它运行在块级别上而不是文件级别。使用块设备比直接使用文件系统性能更好,通过向 Docker 的宿主机添加物理存储可以扩展块设备的存储空间。

    更详细的请自行百度

从高到低列出 Docker 的版本

bash
# 从高到低列出 Docker-ce 的版本
$ yum list docker-ce --showduplicates | sort -r
# Docker 版本号:第二列字符串,从第一个英文冒号(:)开始,直到第一个连字符(-)
# docker-ce.x86_64   3:20.10.6-3.el7           docker-ce-stable 
# docker-ce.x86_64   3:19.03.9-3.el7           docker-ce-stable 
# docker-ce.x86_64   3:18.09.9-3.el7           docker-ce-stable
# docker-ce.x86_64   18.03.1.ce-1.el7.centos   docker-ce-stable
# docker-ce.x86_64   17.12.1.ce-1.el7.centos   docker-ce-stable

# 从高到低列出 Docker-ce-cli 的版本
$ yum list docker-ce-cli --showduplicates | sort -r

安装docker

bash
# 安装指定版本号:例如 19.03.0 
$ yum install -y docker-ce-19.03.0 docker-ce-cli-19.03.0 containerd.io

# 安装最新版本
$ yum install -y docker-ce docker-ce-cli containerd.io

执行到此步,系统已经成功安装 docker 但并未启动。并且创建了 docker 组,但没有向该组添加用户。

离线安装

tgz包

CentOS等Linux操作系统基本是一样的,根据CPU架构[ARM、AMD|X86]选择对应的tgz包即可

下载地址:https://download.docker.com/linux/static/stable/

安装步骤

  • 步骤一: 选择CPU为ARM架构的tgz包进行下载:https://download.docker.com/linux/static/stable/aarch64

  • 步骤二: 解压tgz包(完成后是一个docker文件夹):

    bash
    $ tar -zxvf docker-23.0.1.tgz
  • 步骤三: 将docker目录拷贝到/user/bin下(会提示是否覆盖/usr/bin/runc,覆盖即可):

    bash
    $ mv docker/* /usr/bin && rm -rf docker
  • 步骤四: systemd管理docker

    red

    bash
    $ cat > /usr/lib/systemd/system/docker.service << EOF
    [Unit]
    Description=Docker Application Container Engine
    Documentation=https://docs.docker.com
    After=network-online.target firewalld.service
    Wants=network-online.target
    
    [Service]
    Type=notify
    ExecStart=/usr/bin/dockerd
    ExecReload=/bin/kill -s HUP $MAINPID
    LimitNOFILE=infinity
    LimitNPROC=infinity
    LimitCORE=infinity
    TimeoutStartSec=0
    Delegate=yes
    KillMode=process
    Restart=on-failure
    StartLimitBurst=3
    StartLimitInterval=60s
    
    [Install]
    WantedBy=multi-user.target
    EOF

    deb

    bash
    $ cat > /etc/systemd/system/docker.service << EOF
    [Unit]
    Description=Docker Application Container Engine
    Documentation=https://docs.docker.com
    After=network-online.target firewalld.service
    Wants=network-online.target
    
    [Service]
    Type=notify
    ExecStart=/usr/bin/dockerd
    ExecReload=/bin/kill -s HUP $MAINPID
    LimitNOFILE=infinity
    LimitNPROC=infinity
    LimitCORE=infinity
    TimeoutStartSec=0
    Delegate=yes
    KillMode=process
    Restart=on-failure
    StartLimitBurst=3
    StartLimitInterval=60s
    
    [Install]
    WantedBy=multi-user.target
    EOF
  • 步骤五: 创建配置文件

    bash
    $ mkdir /etc/docker
    $ cat > /etc/docker/daemon.json << EOF
    {
      "insecure-registries": ["http://registry.founder.com"], 
      "data-root":"/data/docker"
    }
    EOF
  • 步骤六: 启动并设置开机启动

    bash
    $ systemctl daemon-reload
    $ systemctl start docker
    $ systemctl enable docker

卸载步骤

bash
$ systemctl stop docker.service
$ rm -rf /usr/lib/systemd/system/{containerd.service,docker.socket,docker.service}
$ rm -rf /etc/docker/daemon.json
$ rm -rf /usr/bin/{containerd,containerd-shim-runc-v2,ctr,docker,docker-init,docker-proxy,dockerd}
$ systemctl daemon-reload

Docker配置调整

调整数据存储路径

  • 步骤一:

    停止 Docker 服务

    bash
    $ systemctl stop docker
  • 步骤二:

    备份数据存储目录

    备份当前的 Docker 数据存储目录 /var/lib/docker,或者直接把/var/lib/docker 移动到新建的目录,一定要先停止docker在操作

    bash
    $ mv /var/lib/docker /var/lib/docker.bak
  • 步骤三:

    创建新的 Docker 数据存储目录,例如 /data/docker

    bash
    $ mkdir /data/docker
  • 步骤四:

    修改 Docker 配置文件 /etc/docker/daemon.json,如果该文件不存在,则创建它:

    graph与data-root:

    graph是docker 19.xx前的产物,在docker 19.xx之后弃用,使用data-root进行设置

    可以在/etc/docker/daemon.json中配置,也可以在docker.service中修改,效果一样

    修改完成后daemon-reload一下然后restart docker

    bash
    $ vi /etc/docker/daemon.json
    # 将以下内容复制粘贴到文件中或根据需要修改,并将其中的 /data/docker 替换为实际的数据存储路径:
    {
      "data-root": "/data/docker"
    }
  • 步骤五:

    启动 Docker 服务

    bash
    $ systemctl start docker
  • 步骤六:

    测试验证,确认 Docker 数据存储路径是否已经修改成功.

    bash
    $ docker info | grep 'Docker Root Dir'

docker-compose

bash
$ mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ docker-compose -v

问题处理

library initialization failed

bash
library initialization failed - unable to allocate file descriptor table - out of memory

处理

bash
$ cat > /etc/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
#LimitNOFILE=infinity
#LimitNPROC=infinity
#LimitCORE=infinity
LimitCORE=65535
LimitNOFILE=65535
LimitNPROC=65535
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF

然后

bash
$ systemctl daemon-reload
$ systemctl restart docker