Docker与Docker Compose的安装以及Portainer容器管理工具

Docker官网

概述

Docker 是一个用于开发、发布和运行应用程序的开放平台。Docker 能够将应用程序与基础架构分离,以便可以快速交付软件。使用 Docker,可以像管理应用程序一样管理基础设施。通过利用 Docker 快速交付、测试和部署代码的方法,可以显着减少编写代码和在生产环境中运行之间的延迟。

Docker 平台

Docker 提供了在称为容器的松散隔离环境中打包和运行应用程序的能力。隔离和安全性允许您在给定主机上同时运行多个容器。容器是轻量级的,包含运行应用程序所需的一切,因此您无需依赖主机上当前安装的内容。您可以在工作时轻松共享容器,并确保与您共享的每个人都获得以相同方式工作的同一个容器。

Docker 提供工具和平台来管理容器的生命周期:

  • 使用容器开发您的应用程序及其支持组件。
  • 容器成为分发和测试应用程序的单元。
  • 准备就绪后,将应用程序部署到生产环境中,作为容器或编排的服务。无论您的生产环境是本地数据中心、云提供商还是两者的混合,这都是一样的。

一、Docker安装

1、在 Ubuntu 上安装 Docker Desktop

DEB 包

1)、先决条件

要成功安装 Docker Desktop,您必须:

  • 满足系统要求
  • 拥有 Ubuntu Jammy Jellyfish 22.04 (LTS) 或 Ubuntu Impish Indri 21.10 的 64 位版本。x86_64(或amd64)架构支持 Docker Desktop 。
  • 对于非 Gnome 桌面环境,必须安装 gnome-terminal
 sudo apt install gnome-terminal
  • 卸载 Docker Desktop for Linux 的技术预览版或 beta 版。运行以下命令:
 sudo apt remove docker-desktop

要彻底清理,请删除位于 $HOME/.docker/desktop 的配置和数据文件​​​​​、位于 /usr/local/bin/com.docker.cli 的符号链接,并运行以下命令清除剩余的 systemd 服务文件:

 rm -r $HOME/.docker/desktop
 sudo rm /usr/local/bin/com.docker.cli
 sudo apt purge docker-desktop

注:如果您已安装 Docker Desktop for Linux 技术预览版或 beta 版,您需要删除由这些软件包生成的所有文件,例如

~/.config/systemd/user/docker-desktop.service
~/.local/share/systemd/user/docker-desktop.service

2)、安装 Docker Desktop

在 Ubuntu 上安装 Docker Desktop 的推荐方法:

  1. 设置Docker 的包版本库

  2. 下载最新的DEB 包

  3. 使用 apt 安装软件包,如下所示:

    扫描二维码关注公众号,回复: 16213043 查看本文章
sudo apt-get update
sudo apt-get install ./docker-desktop-<version>-<arch>.deb

注:在安装过程结束时,由于 apt 安装下载的包而显示错误。您可以忽略此错误消息。

N: Download is performed unsandboxed as root, as file '/home/user/Downloads/docker-desktop.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)

通过deb包中所包含的安装脚本在安装后完成了几步配置:

安装脚本:

  • 设置 Docker Desktop 二进制文件的功能以映射特权端口并设置资源限制。
  • 将 Kubernetes 的 DNS 名称添加到 /etc/hosts.
  • 创建从 /usr/bin/docker 到 /usr/local/bin/com.docker.cli 的链接。

在 Ubuntu 上安装 Docker Engine(设置Docker 的包版本库

要在 Ubuntu 上开始使用 Docker Engine,请确保 满足先决条件,然后 安装 Docker

先决条件:

操作系统要求

要安装 Docker Engine,您需要以下 Ubuntu 版本之一的 64 位版本:

  • Ubuntu Jammy 22.04 (LTS)
  • Ubuntu Impish 21.10
  • Ubuntu Focal 20.04 (LTS)
  • Ubuntu Bionic 18.04 (LTS)

Docker 引擎支持 x86_64 (or amd64),armhf, arm64和 s390x 架构。

卸载旧版本

dockerdocker.iodocker-engine是旧版本的 Docker,如果安装了这些,请卸载:

$ sudo apt-get remove docker docker-engine docker.io containerd runc

如果提示 apt-get 没有安装这些软件包,那也没关系。

/var/lib/docker/的内容,包括图像、容器、卷和网络,都被保留。如果您不需要保存现有数据,并且想从全新安装开始,请参阅 本页底部的卸载 Docker Engine部分。

安装方法:

您可以根据需要用不同的方式安装 Docker Engine:

  • 大多数用户 设置 Docker 的版本库并从中安装,以便于安装和升级任务。这是推荐的方法。

  • 一些用户下载 DEB 包并 手动安装,完全手动管理升级。这在无法访问 Internet 的air-gapped系统上安装 Docker 的情况下很有用。

  • 在测试和开发环境中,一些用户选择使用自动化 便捷脚本来安装 Docker。

1)、使用版本库安装:

在新主机上首次安装 Docker Engine 之前,您需要设置 Docker 版本库。之后,您可以从版本库安装和更新 Docker。

设置版本库

1、允许apt通过 HTTPS 使用存储库更新apt包索引并安装包:

$ sudo apt-get update

$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

2、添加 Docker 的官方 GPG 密钥:

$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

3、使用以下命令设置版本库:

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 Docker Engine

  1. 更新apt包索引,安装最新版本的 Docker Engine、containerd 和 Docker Compose,或者进入下一步安装特定版本:

    $ sudo apt-get update
    $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

    运行 apt-get update 时收到 GPG 错误?

    您的默认 umask 可能设置不正确,导致无法检测到 repo 的公钥文件。运行以下命令,然后再次尝试更新您的存储库:

    sudo chmod a+r /etc/apt/keyrings/docker.gpg
  2. 要安装特定版本的 Docker Engine,请在 repo 中列出可用版本,然后选择并安装:

    a、列出您的版本库中可用的版本:

    $ apt-cache madison docker-ce
    
    docker-ce | 5:20.10.16~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
    docker-ce | 5:20.10.15~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
    docker-ce | 5:20.10.14~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
    docker-ce | 5:20.10.13~3-0~ubuntu-jammy | https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

    b、使用第二列中的版本字符串安装特定版本,例如 5:20.10.16~3-0~ubuntu-jammy 。

    $ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker-compose-plugin
  3. 通过运行 hello-world 镜像来验证 Docker Engine是否已正确安装。

    $ sudo service docker start
    $ sudo docker run hello-world

    此命令下载测试镜像并在容器中运行它。当容器运行时,它会打印一条消息并退出。

Docker Engine已安装并正在运行。该docker组已创建,但未向其中添加任何用户。您需要使用sudo来运行 Docker 命令。继续Linux 后安装以允许非root用户运行 Docker 命令和其他可选配置步骤。

升级 Docker Engine

要升级 Docker Engine,首先运行 sudo apt-get update,然后按照 安装说明,选择您要安装的新版本。

2)、从包安装

如果无法使用 Docker 的版本库来安装 Docker Engine,可以下载 .deb版本的文件并手动安装。每次升级 Docker 时都需要下载一个新文件。

  1. 转到  Index of linux/ubuntu/dists/,选择您的 Ubuntu 版本,然后浏览到pool/stable/、选择amd64、 armhfarm64s390x,然后下载您要安装的 .deb版本的Docker Engine文件。

  2. 安装 Docker Engine,将下面的路径更改为您下载 Docker 包的路径。

    $ sudo dpkg -i /path/to/package.deb

    Docker 守护进程自动启动。

  3. 通过运行hello-world 镜像来验证 Docker Engine是否已正确安装。

    $ sudo docker run hello-world

    此命令下载测试镜像并在容器中运行它。当容器运行时,它会打印一条消息并退出。

Docker Engine已安装并正在运行。该docker组已创建,但未向其中添加任何用户。您需要使用sudo来运行 Docker 命令。继续执行 Linux 的安装后步骤以允许非root用户运行 Docker 命令和其他可选配置步骤。

升级 Docker Engine

要升级 Docker Engine,请下载更新的包文件并重复 安装过程,指向新文件。

3)、使用便捷脚本安装

Docker 在get.docker.com上提供了一个方便的脚本, 可以快速、非交互地将 Docker 安装到开发环境中。不建议将便捷脚本用于生产环境,但可以用作示例来创建适合您需求的供应脚本。另请参阅使用版本库 安装步骤以了解使用包版本库安装的安装步骤。该脚本的源代码是开源的,可以 docker-install在 GitHub 上的存储库中找到

在本地运行脚本之前,请务必检查从 Internet 下载的脚本。在安装之前,请让自己熟悉便捷脚本的潜在风险和限制:

  • 该脚本需要rootsudo特权才能运行。
  • 该脚本会尝试检测您的 Linux 发行版和版本并为您配置包管理系统,并且不允许您自定义大多数安装参数。
  • 该脚本会在不要求确认的情况下安装依赖项和建议。这可能会安装大量软件包,具体取决于主机的当前配置。
  • 默认情况下,该脚本安装 Docker、containerd 和 runc 的最新稳定版本。使用此脚本配置机器时,可能会导致 Docker 的主要版本升级意外。在部署到生产系统之前,始终在测试环境中测试(主要)升级。
  • 该脚本并非旨在升级现有的 Docker 安装。使用脚本更新现有安装时,可能无法将依赖项更新到预期版本,从而导致使用过时的版本。

提示:运行前预览脚本步骤

您可以使用DRY_RUN=1选项运行脚本以了解脚本在安装期间将执行的步骤:

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ DRY_RUN=1 sh ./get-docker.sh

此示例从get.docker.com下载脚本 并运行它以在 Linux 上安装最新的稳定版本的 Docker:

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
Executing docker install script, commit: 7cae5f8b0decc17d6571f9f52eb840fbc13b2737
<...>

安装预发行版

Docker 还在test.docker.com 上提供了一个便捷的脚本,用于在 Linux 上安装 Docker 的预发行版。此脚本等同于 中的脚本get.docker.com,但将您的包管理器配置为启用来自我们的包版本库的“测试”通道,其中包括 Docker 的稳定版和预发布版(测试版、发布候选版)。使用此脚本可以提前访问新版本,并在发布稳定之前在测试环境中对其进行评估。

要从“测试”频道在 Linux 上安装最新版本的 Docker,请运行:

$ curl -fsSL https://test.docker.com -o test-docker.sh
$ sudo sh test-docker.sh
<...>

使用便捷脚本后升级 Docker

如果您使用便捷脚本安装 Docker,则应直接使用包管理器升级 Docker。重新运行便捷脚本没有任何好处,如果它尝试重新添加已经添加到主机的版本库,可能会导致问题。

卸载 Docker Engine

  1. 卸载 Docker Engine、CLI、Containerd 和 Docker Compose 软件包:

    $ sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
  2. 主机上的镜像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷:

    $ sudo rm -rf /var/lib/docker
    $ sudo rm -rf /var/lib/containerd

您必须手动删除任何已编辑的配置文件。

Linux 安装后的步骤

本节包含配置 Linux 主机以更好地使用 Docker 的可选过程。

以非 root 用户身份管理 Docker

Docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字归root用户所有,其他用户只能使用sudo。Docker 守护程序始终以root用户身份运行。

如果您不想在docker命令前加上sudo,请创建一个名为docker的Unix组并将用户添加到其中。当 Docker 守护进程启动时,它会创建一个可供docker组成员访问的 Unix 套接字。

警告

docker组授予相当于root 用户等效的权限。有关这如何影响系统安全性的详细信息,请参阅 Docker Daemon Attack Surface

注意

要在没有 root 权限的情况下运行 Docker,请参阅 以非 root 用户身份运行 Docker 守护程序(非root模式)

要创建docker组并添加您的用户:

  1. 创建docker组。

    $ sudo groupadd docker
  2. 将您的用户添加到docker组中。

    $ sudo usermod -aG docker $USER
  3. 注销并重新登录,以便重新评估您的组成员身份。

    如果在虚拟机上进行测试,可能需要重新启动虚拟机才能使更改生效。

    在桌面Linux环境(如X Windows)上,完全注销会话,然后重新登录

    在 Linux 上,您还可以运行以下命令来激活对组的更改:

    $ newgrp docker
  4. 验证您可以在没有sudo的情况下运行docker命令。

    $ docker run hello-world

    此命令下载测试镜像并在容器中运行它。当容器运行时,它会打印一条消息并退出。

    如果在将用户添加到Docker组之前使用sudo运行Docker CLI命令,您可能会看到以下错误,这表明您的~/.docker/目录是由于命令没有sudo权限导致的。

    WARNING: Error loading config file: /home/user/.docker/config.json -
    stat /home/user/.docker/config.json: permission denied
    

    要解决此问题,请删除~/.docker/目录(它会自动重新创建,但会丢失任何自定义设置),或使用以下命令更改其所有权和权限:

    $ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
    $ sudo chmod g+rwx "$HOME/.docker" -R

将 Docker 配置为开机启动

大多数当前的 Linux 发行版(RHEL、CentOS、Fedora、Debian、Ubuntu 16.04 和更高版本)用于systemd管理系统启动时启动的服务。在 Debian 和 Ubuntu 上,Docker 服务默认配置为在启动时启动。要在启动时为 Docker 和 Containerd自动启动其他发行版,请使用以下命令:

$ sudo systemctl enable docker.service
$ sudo systemctl enable containerd.service

要禁用此行为,请改用disable

$ sudo systemctl disable docker.service
$ sudo systemctl disable containerd.service

如果您需要添加 HTTP 代理、为 Docker 运行时文件设置不同的目录或分区,或进行其他自定义,请参阅 自定义 systemd Docker 守护程序选项

使用不同的存储引擎

有关不同版本引擎的信息,请参阅 版本驱动程序。默认版本引擎和支持的版本引擎列表取决于主机的 Linux 发行版和可用的内核驱动程序。

配置默认日志驱动程序

Docker 提供了通过一系列日志驱动程序从主机上运行的所有容器收集和查看日志数据的能力。默认日志记录驱动程序json文件将日志数据写入主机文件系统上的 JSON 格式文件。随着时间的推移,这些日志文件的大小会扩大,从而可能导致磁盘资源耗尽。

为了缓解这些问题,要么配置json文件日志驱动程序以启用日志轮换,使用 替代的日志驱动程序 ,例如默认执行日志轮换的“本地”日志驱动程序 ,或者使用将日志发送到远程日志聚合器的日志驱动程序。

配置 Docker 守护进程监听连接的

默认情况下,Docker 守护程序侦听 UNIX 套接字上的连接以接受来自本地客户端的请求。通过将 Docker 配置为侦听 IP 地址和端口以及 UNIX 套接字,可以允许 Docker 接受来自远程主机的请求。有关此配置选项的更多详细信息,请查看Docker CLI 参考文章的“将 Docker 绑定到另一个主机/端口或 unix 套接字”部分。

保护您的连接

在将 Docker 配置为接受来自远程主机的连接之前,了解将 docker 开放到网络的安全含义至关重要。如果不采取措施保护连接,远程非 root 用户就有可能在主机上获得 root 访问权限。有关如何使用 TLS 证书来保护此连接的更多信息,请查看这篇关于 如何保护 Docker 守护进程套接字的文章。

配置 Docker 以接受远程连接可以通过docker.service 使用 systemd 的 Linux 发行版的 systemd 单元文件来完成,例如 RedHat、CentOS、Ubuntu 和 SLES 的最新版本,使用Linux 发行版推荐的daemon.json而不使用 systemd 的 文件。

systemd vs daemon.json

将 Docker 配置为同时使用systemd单元文件和daemon.json文件来侦听连接 会导致阻止 Docker 启动的冲突。

systemd使用单元文件配置远程访问

  1. 使用sudo systemctl edit docker.service命令在文本编辑器中打开覆盖docker.service文件。

  2. 添加或修改以下行,替换为您自己的值。

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
  3. 保存文件。

  4. 重新加载systemctl配置。

    $ sudo systemctl daemon-reload
  5. 重启 Docker。

    $ sudo systemctl restart docker.service
  6. 通过检查netstat的输出以确认dockerd正在侦听配置的端口,检查是否已经配置完成

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd

配置远程访问daemon.json

  1. 在/etc/docker/daemon.json中设置主机阵列连接到UNIX套接字和IP地址,如下所示:

    {
      "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
    }
  2. 重启 Docker。

  3. 通过检查netstat的输出以确认dockerd正在侦听配置的端口,检查是否已经更改

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd

在 Docker 守护进程上启用 IPv6 

要在 Docker 守护程序上启用 IPv6,请参阅 启用 IPv6 支持

疑难解答

内核兼容性

如果您的内核版本低于 3.10 版或缺少某些模块,则 Docker 无法正常运行。要检查内核兼容性,您可以下载并运行check-config.sh 脚本。

$ curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh
$ bash ./check-config.sh

该脚本仅适用于 Linux,不适用于 macOS。

Cannot connect to the Docker daemon

如果您看到如下所示的错误,则您的 Docker 客户端可能已配置为连接到不同主机上的 Docker 守护程序,并且该主机可能无法访问。

Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?

要查看您的客户端配置为连接到哪个主机,请检查DOCKER_HOST您环境中变量的值。

$ env | grep DOCKER_HOST

如果此命令返回一个值,则 Docker 客户端设置为连接到在该主机上运行的 Docker 守护程序。如果未设置,则将 Docker 客户端设置为连接到在本地主机上运行的 Docker 守护程序。如果设置错误,请使用以下命令取消设置:

$ unset DOCKER_HOST

您可能需要在文件中编辑您的环境,例如 ~/.bashrc 或  ~/.profile 以防止DOCKER_HOST错误地设置变量。

如果DOCKER_HOST按预期设置,请验证 Docker 守护程序是否正在远程主机上运行,​​并且防火墙或网络中断不会阻止您连接。

IP转发问题

如果您使用 219 或更高版本手动配置网络systemd-networksystemd Docker 容器可能无法访问您的网络。从systemd版本 220 开始,给定网络 ( net.ipv4.conf.<interface>.forwarding ) 的转发设置默认为off。此设置可防止 IP 转发。它还与Docker在容器中启用net.ipv4.conf.all.forwarding设置的行为相冲突

要在 RHEL、CentOS 或 Fedora 上解决此问题,请在 Docker 主机上编辑 /usr/lib/systemd/network/ 中的<interface>.network文件(例如:/usr/lib/systemd/network/80-container-host0.network)并在[Network]部分中添加以下块。

[Network]
...
IPForward=kernel
# OR
IPForward=true

此配置允许按预期从容器进行 IP 转发。

DNS resolver found in resolv.conf and containers can't use it

使用 GUI 的 Linux 系统通常运行一个网络管理器,它使用一个 dnsmasq在环回地址上运行的实例,例如127.0.0.1或 127.0.1.1来缓存 DNS 请求,并将此条目添加到 /etc/resolv.conf. 该dnsmasq服务加快了 DNS 查找速度,还提供了 DHCP 服务。此配置在具有自己的网络命名空间的 Docker 容器中不起作用,因为 Docker 容器将环回地址解析为本地127.0.0.1 并且不太可能在其自己的环回地址上运行 DNS 服务器。

如果 Docker 检测到没有引用的 DNS 服务器/etc/resolv.conf是功能齐全的 DNS 服务器,则会出现以下警告,并且 Docker 使用 Google 提供的公共 DNS 服务器8.8.8.8进行8.8.4.4DNS 解析。

WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers
can't use it. Using default external servers : [8.8.8.8 8.8.4.4]

如果您看到此警告,请首先检查您是否使用dnsmasq

$ ps aux |grep dnsmasq

如果您的容器需要解析网络内部的主机,那么公共服务器就不够用了。你有两个选择:

  • 您可以指定 Docker 使用的 DNS 服务器,或者
  • 您可以在 NetworkManager中禁用dnsmasq。如果您这样做,NetworkManager 会将您真正的 DNS 名称服务器添加到/etc/resolv.conf,但您会失去dnsmasq.

您只需要使用其中一种方法。

为 Docker 指定 DNS 服务器

配置文件的默认位置是/etc/docker/daemon.json。 可以使用--config file守护程序标志更改配置文件的位置。下面的文档假定配置文件位于/etc/docker/daemon.json.

  1. 创建或编辑 Docker daemon 配置文件,默认为 /etc/docker/daemon.json文件,它控制Docker守护程序配置。

    $ sudo nano /etc/docker/daemon.json
  2. 添加具有一个或多个IP地址作为值的dns密钥。如果文件有现有内容,则只需添加或编辑dns行

    {
      "dns": ["8.8.8.8", "8.8.4.4"]
    }

    如果您的内部 DNS 服务器无法解析公共 IP 地址,请至少包含一个可以解析的 DNS 服务器,以便您可以连接到 Docker Hub,以便您的容器可以解析 Internet 域名。

    保存并关闭文件。

  3. 重新启动 Docker 守护程序。

    $ sudo service docker restart
  4. 验证 Docker 是否可以通过尝试拉取镜像来解析外部 IP 地址:

    $ docker pull hello-world
  5. 如有必要,验证 Docker 容器是否可以通过 ping 解析内部主机名。

    $ docker run --rm -it alpine ping -c4 <my_internal_host>
    
    PING google.com (192.168.1.2): 56 data bytes
    64 bytes from 192.168.1.2: seq=0 ttl=41 time=7.597 ms
    64 bytes from 192.168.1.2: seq=1 ttl=41 time=7.635 ms
    64 bytes from 192.168.1.2: seq=2 ttl=41 time=7.660 ms
    64 bytes from 192.168.1.2: seq=3 ttl=41 time=7.677 ms

禁用dnsmasq

Ubuntu

如果您不想更改 Docker 守护程序的配置以使用特定 IP 地址,请按照这些说明在 NetworkManager 中禁用dnsmasq

  1. 编辑/etc/NetworkManager/NetworkManager.conf文件。

  2. 通过在dns=dnsmasq行的开头添加 # 字符,注释掉该行。

    # dns=dnsmasq
    

    保存并关闭文件。

  3. 重新启动 NetworkManager 和 Docker。或者,您可以重新启动系统。

    $ sudo systemctl restart network-manager
    $ sudo systemctl restart docker

RHEL、CentOS 或 Fedora

在 RHEL、CentOS 或 Fedora 上禁用dnsmasq

  1. 禁用dnsmasq服务:

    $ sudo systemctl stop dnsmasq
    $ sudo systemctl disable dnsmasq
  2. 使用Red Hat 文档手动配置 DNS 服务器 。

允许通过防火墙访问远程 API 

如果您在运行Docker的同一台主机上运行防火墙,并且希望从另一台主机访问Docker Remote API,并且启用了远程访问,则需要将防火墙配置为允许Docker端口上的传入连接,如果启用了TLS加密传输,则默认为2376,否则为2375。

两个常见的防火墙守护进程是 UFW(简单防火墙)(通常用于 Ubuntu 系统)和firewalld(通常用于基于 RPM 的系统)。请参阅您的操作系统和防火墙的文档,但以下信息可能会帮助您入门。这些选项相当宽松,您可能希望使用不同的配置来锁定系统。

  • UFW:在您的配置中设置DEFAULT_FORWARD_POLICY="ACCEPT"。

  • firewalld:在策略中添加与以下类似的规则(一个用于传入请求,一个用于传出请求)。确保接口名称和链名称正确。

    <direct>
      [ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -i zt0 -j ACCEPT </rule> ]
      [ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -o zt0 -j ACCEPT </rule> ]
    </direct>

Your kernel does not support cgroup swap limit capabilities

在Ubuntu或Debian主机上,当使用镜像时,您可能会看到类似以下消息

WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.

基于RPM的系统不会出现此警告,默认情况下会启用这些功能。

如果不需要这些功能,可以忽略警告。您可以按照以下说明在Ubuntu或Debian上启用这些功能。即使Docker没有运行,内存和交换记帐也会导致大约1%的可用内存开销和10%的总体性能下降。

  1. 以具有sudo权限的用户身份登录Ubuntu或Debian主机。

  2. 编辑/etc/default/grub文件。添加或编辑GRUB_CMDLINE_LINUX行以添加以下两个键值对:

    GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
    

    保存并关闭文件。

  3. 更新 GRUB。

    $ sudo update-grub

    如果您的 GRUB 配置文件的语法不正确,则会发生错误。在这种情况下,重复步骤 2 和 3。

    更改在系统重新启动时生效。

3)、启动 Docker Desktop

要启动 Docker Desktop for Linux,请在 Applications菜单上搜索Docker Desktop并将其打开。这将启动鲸鱼菜单图标并打开 Docker Dashboard,报告 Docker Desktop 的状态。

或者,打开终端并运行:

systemctl --user start docker-desktop

当 Docker Desktop 启动时,它会创建一个Docker CLI 可以用作目标的专用上下文,并将其设置为当前使用的上下文。这是为了避免与可能在 Linux 主机上运行并使用默认上下文的本地 Docker 引擎发生冲突。关闭时,Docker Desktop 会将当前上下文重置为前一个上下文。

Docker Desktop 安装程序更新主机上的 Docker Compose 和 Docker CLI 二进制文件。它安装了 Docker Compose V2,并让用户可以选择从“设置”面板将其链接为 docker-compose。Docker Desktop安装了新的Docker CLI二进制文件,该文件在 /usr/local/bin 中包含云集成功能,并在 /usr/local/bin/com.docker.cli 中创建到旧Docker CLI的符号链接。

成功安装 Docker Desktop 后,您可以通过运行以下命令检查这些二进制文件的版本:

 docker compose version
 docker --version
 docker version

要启用 Docker Desktop 在登录时启动,请从 Docker 菜单中选择 设置>常规>登录时启动 Docker Desktop

或者,打开终端并运行:

systemctl --user enable docker-desktop

要停止 Docker Desktop,请单击鲸鱼菜单托盘图标以打开 Docker 菜单并选择退出 Docker Desktop

或者,打开终端并运行:

systemctl --user stop docker-desktop

4)、升级 Docker Desktop

发布 Docker Desktop 的新版本后,Docker UI 会显示通知。每次要升级并运行 Docker Desktop 时,都需要下载新包:

sudo apt-get install ./docker-desktop-<version>-<arch>.deb

2、在 Windows 上安装 Docker Desktop

  • 下载适用于 Windows 的 Docker Desktop
  • 1)、系统要求

  • 您的 Windows 机器必须满足以下要求才能成功安装 Docker Desktop。
  • WSL后端、Hyper-V 后端和 Windows 容器
  1. 在 Windows 上必须启用 WSL 2 或者启用 Hyper-V 和Windows 容器功能。有关详细说明,请参阅 Microsoft 文档
  2. 在 Windows 上成功运行 WSL 2 或者 Client Hyper-V 需要以下硬件先决条件:

  • 使用 Docker Desktop 创建的容器和映像在安装它的机器上的所有用户帐户之间共享。这是因为所有 Windows 帐户都使用同一个 VM 来构建和运行容器。请注意,使用 Docker Desktop WSL 2 后台时,无法在用户帐户之间共享容器和图像。
  • 2)、在 Windows 上安装 Docker Desktop 

    交互式安装

  1. 双击Docker Desktop Installer.exe运行安装程序。

    如果您尚未下载安装程序 ( Docker Desktop Installer.exe),您可以从 Docker Hub获取它。它通常会下载到您的Downloads文件夹中,或者您可以从 Web 浏览器底部的最近下载栏中运行它。

  2. 出现提示时,确保根据您选择的后端选择或不选择配置页面上的使用 WSL 2 而不是 Hyper-V选项。

    如果您的系统仅支持这两个选项之一,您将无法选择使用哪个后端。

  3. 按照安装向导上的说明授权安装程序并继续安装。

  4. 安装成功后,单击关闭以完成安装过程。

  5. 如果您的管理员帐户与您的用户帐户不同,则必须将用户添加到docker-users组。以管理员身份运行计算机管理并导航到本地用户和组>docker-users。右键单击以将用户添加到组。注销并重新登录以使更改生效。

  • 从命令行安装

    下载Docker Desktop Installer.exe后,在终端中运行以下命令安装 Docker Desktop:

  • "Docker Desktop Installer.exe" install

    如果使用的是 PowerShell,应该运行:

  • Start-Process 'Docker Desktop Installer.exe' -Wait install

    如果使用 Windows 命令提示符:

  • start /w "" "Docker Desktop Installer.exe" install
  • install 命令接受以下标志:

  • --quiet: 运行安装程序时禁止信息输出
  • --accept-license:现在接受Docker 订阅服务协议,而不是要求在应用程序首次运行时接受它
  • --no-windows-containers: 禁用 Windows 容器集成
  • --allowed-org=<org name>:要求用户在运行应用程序时登录并成为指定 Docker Hub 组织的一部分
  • --backend=<backend name>:选择用于 Docker 桌面的默认后端hyper-vwindowswsl-2(默认)

如果您的管理员帐户与您的用户帐户不同,则必须将用户添加到docker-users组:

net localgroup docker-users <user> /add
  • 3)、启动 Docker Desktop

    安装后 Docker Desktop 不会自动启动。启动 Docker 桌面:

    • 1、搜索 Docker,然后在搜索结果中选择Docker Desktop 。

  • 2、选择接受继续。接受条款后,Docker Desktop 将启动。

  • 3、登录并开始

    快速入门指南

    安装Docker Desktop后,将启动快速入门指南。它包括一个简单的练习,构建一个示例Docker镜像,将其作为容器运行,将镜像推送到Docker Hub并保存。

    要按需运行快速入门指南,请选择,然后选择快速入门指南。

  • 有关更详细的指南,请参阅 Get started.

    登录 Docker 桌面

    建议使用Docker Desktop 右上角的登录/创建 ID选项进行身份验证。

    登录后,可以直接从 Docker Desktop 访问 Docker Hub 存储库。

    与匿名用户相比,经过身份验证的用户获得更高的拉取率限制。例如,如果您通过了身份验证,则每 6 小时您会获得 200 次拉取,而匿名用户的每个 IP 地址每 6 小时会获得 100 次拉取。有关详细信息,请参阅下载速率限制

    在管理员访问受限的大型企业中,管理员可以创建一个 registry.json 文件,并使用设备管理软件将其部署到开发人员的机器上,作为 Docker Desktop 安装过程的一部分。强制开发人员通过 Docker Desktop 进行身份验证还允许管理员使用图像访问管理等功能设置护栏,该功能允许团队成员只能访问 Docker Hub 上的受信任内容,并且只能从指定类别的图像中提取。有关详细信息,请参阅配置 registry.json 以强制登录

  • 两因素身份验证

    Docker Desktop 使您能够使用双重身份验证登录 Docker Hub。双重身份验证在访问 Docker Hub 帐户时提供了额外的安全层。

    在通过 Docker Desktop 登录 Docker Hub 帐户之前,您必须在 Docker Hub 中启用双重身份验证。有关说明,请参阅为 Docker Hub 启用双重身份验证

    启用双因素身份验证后:

  • 转到 Docker 桌面菜单,然后选择登录/创建 Docker ID

  • 输入您的 Docker ID 和密码,然后单击登录

  • 成功登录后,Docker Desktop 会提示您输入验证码。输入手机中的六位数代码,然后单击验证

  • Linux 用户的凭据管理

    Docker Desktop 依赖于pass(通行证)将凭据存储在 gpg2 加密文件中。在从 Docker 仪表板或 Docker 菜单登录 Docker Hub 之前,您必须初始化pass。如果您尚未初始化pass Docker Desktop则会显示警告。

  • 您可以使用 gpg 密钥初始化传递。要生成 gpg 密钥,请运行:

$ gpg --generate-key
...
GnuPG needs to construct a user ID to identify your key.

Real name: Molly
Email address: [email protected]
You selected this USER-ID:
    "Molly <[email protected]>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
...
pub   rsa3072 2022-03-31 [SC] [expires: 2024-03-30]
      7865BA9185AFA2C26C5B505669FC4F36530097C2
uid                      Molly <[email protected]>
sub   rsa3072 2022-03-31 [E] [expires: 2024-03-30]

要初始化pass,请运行:

fbbqt@ubuntu:~$ pass init 7865BA9185AFA2C26C5B505669FC4F36530097C2
mkdir: created directory '/home/fbbqt/.password-store/'
Password store initialized for 7865BA9185AFA2C26C5B505669FC4F36530097C2

初始化pass后,您可以登录Docker Dashboard 并拉取您的私有镜像。当 Docker CLI 或 Docker Desktop 使用凭据时,可能会弹出用户提示输入您在 gpg 密钥生成期间设置的密码。

$ docker pull fbbqt/privateimage
Using default tag: latest
latest: Pulling from fbbqt/privateimage
3b9cc81c3203: Pull complete 
Digest: sha256:3c6b73ce467f04d4897d7a7439782721fd28ec9bf62ea2ad9e81a5fb7fb3ff96
Status: Downloaded newer image for fbbqt/privateimage:latest
docker.io/fbbqt/privateimage:latest

概述

Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,可以使用 YAML 文件来配置应用程序的服务。然后,使用一个命令,可以从配置中创建并启动所有服务。要了解有关 Compose 的所有功能的更多信息,请参阅功能列表

Compose 适用于所有环境:生产、工作台、开发、测试以及 CI 工作流程。您可以在常见用例中了解有关每个案例的更多信息。

使用 Compose 基本上是一个三步过程:

  1. 使用Dockerfile定义应用程序的环境,以便可以在任何地方复制。

  2. 在docker-compose.yml中定义组成应用程序的服务,这样它们可以在一个隔离的环境中一起运行。

  3. 运行docker compose up,Docker compose 命令启动并运行您的整个应用程序。您也可以使用compose standalone(docker-compose二进制)运行docker-cose up。

一个 docker-compose.yml 文件看起来像这样:

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    depends_on:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

有关 Compose 文件的详细信息,请参阅 Compose 文件参考

Compose 具有用于管理应用程序整个生命周期的命令:

  • 启动、停止和重建服务
  • 查看运行服务的状态
  • 流式传输正在运行的服务的日志输出
  • 在服务上运行一次性命令

安装:

如果有 Docker Desktop,则已经安装了完整的 Docker,包括 Compose。

可以通过单击Docker 菜单中的About Docker Desktop来查看。

1、在 Linux 上安装

1)、安装 Compose 

要安装 Compose:

使用存储库安装

注:这些说明假设您已经安装了 Docker Engine 和 Docker CLI,现在想要安装 Compose 插件。
对于 Compose Standalone,请参阅安装 Compose Standalone

如果您已经设置了 Docker 版本库,请跳至第 2 步。

  1. 设置版本库。在以下位置查找特定于发行版的说明:

    Ubuntu | CentOS | Debian | Fedora | RHEL | SLES.

  2. 更新包索引,并安装最新版本的 Docker Compose:

    • Ubuntu, Debian:

        $ sudo apt-get update
        $ sudo apt-get install docker-compose-plugin
      
    • 基于 RPM 的发行版:

        $ sudo yum update
        $ sudo yum install docker-compose-plugin
      
  3. 通过检查版本来验证 Docker Compose 是否已正确安装。

    $ docker compose version
    Docker Compose version vN.N.N
    

其中vN.N.N是代表最新版本的占位符文本。

更新Compose

要更新 Compose,请运行以下命令:

  • Ubuntu, Debian:

      $ sudo apt-get update
      $ sudo apt-get install docker-compose-plugin
    
  • 基于 RPM 的发行版:

      $ sudo yum update
      $ sudo yum install docker-compose-plugin

 2)、手动安装插件

注:此选项要求您手动管理升级。我们建议设置 Docker 的存储库以便于维护。

  1. 要下载并安装 Compose CLI 插件,请运行:

    $ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
    $ mkdir -p $DOCKER_CONFIG/cli-plugins
    $ curl -SL https://github.com/docker/compose/releases/download/v2.12.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
    

    此命令下载最新版本的 Docker Compose(从 Compose 发布版本)并在$HOME目录下为活动用户安装 Compose。

    安装:

    • Docker Compose适用于系统上的所有用户,请替换~/.docker/cli-plugins与 /usr/local/lib/docker/cli-plugins
    • 不同版本的Compose,请将v2.12.0替换为您要使用的Compose。
  2. 将可执行权限应用于二进制文件:

     $ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
    

    或者,如果您选择为所有用户安装 Compose:

     $ sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
    
  3. 测试安装

     $ docker compose version

2、其他安装场景

  • 安装 Compose Standalone

  • 在 Linux 上

  • Compose standalone 

    请注意,Compose standalone使用破折号合成语法,而不是当前的标准语法(空格compose)。

    例如:使用compose standalone时,键入docker-compose up,而不是docker componse up

  1. 下载和安装 Compose standalone, 运行:
      $ curl -SL https://github.com/docker/compose/releases/download/v2.12.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
    
  2. 将可执行权限应用于安装目标路径中的独立二进制文件。
  3. 使用 docker-compose测试并执行compose命令。

笔记

如果命令docker-compose在安装后失败,请检查路径。您还可以创建指向/usr/bin或路径中任何其他目录的符号链接。例如:

$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

在 Windows 服务器上

如果您直接在 Microsoft Windows Server 上运行 Docker 守护程序和客户端并且想要安装 Docker Compose,请按照这些说明进行操作。

  1. 以管理员身份运行 PowerShell。当询问您是否要允许此应用程序对您的设备进行更改时,单击是以继续安装

  2. GitHub 现在需要 TLS1.2。在 PowerShell 中,运行以下命令

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
  3. 运行以下命令下载最新版本的 Compose (v2.12.0):

      Start-BitsTransfer -Source "https://github.com/docker/compose/releases/download/v2.12.0/docker-compose-Windows-x86_64.exe" -Destination $Env:ProgramFiles\Docker\docker-compose.exe
    

    笔记

    在 Windows Server 2019 上,您可以将 Compose 可执行文件添加到$Env:ProgramFiles\Docker。 由于该目录已在系统中注册PATH,您可以在后续步骤中运行docker-compose --version命令,无需额外配置。

    要安装不同版本的Compose,请将v2.12.0替换为您要使用的Compose。

  4. 测试安装

    $ docker compose version
  • 3、卸载 Docker Compose

  • 卸载Docker Compose取决于您用于安装Docker Compose的方法。在此页面上,您可以找到卸载Docker Compose的具体说明。

卸载 Docker Desktop

如果您想卸载 Compose 并且您已经安装了 Docker Desktop,请参阅卸载 Docker Desktop ,按照下面的相应链接获取有关如何删除 Docker Desktop 的说明。

笔记

除非您在该特定环境中安装了其他 Docker 实例,否则您将通过卸载Desktop来完全删除 Docker。

卸载 Docker Compose CLI 插件

要删除 Compose CLI 插件,请运行:

Ubuntu、Debian:

sudo apt-get remove docker-compose-plugin

基于 RPM 的发行版:

sudo yum remove docker-compose-plugin

手动安装的卸载

如果您曾经curl安装 Compose CLI 插件,要卸载它,请运行:

rm $DOCKER_CONFIG/cli-plugins/docker-compose

为所有用户删除

或者,如果您为所有用户安装了 Compose,请运行:

rm /usr/local/lib/docker/cli-plugins/docker-compose

收到权限被拒绝错误?

如果您使用上述任何一种方法收到“权限被拒绝”错误,则您没有删除docker-compose的权限。要强制删除,请将sudo添加到上述任一命令之前,然后再次运行它。

检查 Compose CLI 插件的位置

要检查 Compose 的安装位置,请使用:

docker info --format ''

4、在 Compose 中使用profiles(配置文件)

配置文件允许通过选择性地启用服务来针对各种用途和环境调整 Compose 应用程序模型。这是通过将每个服务分配给零个或多个配置文件来实现的。如果未分配,则始终启动服务,但如果已分配,则仅在激活配置文件时才启动。

这允许在一个docker-compose.yml文件中定义额外的服务,这些服务只能在特定的场景中启动,例如调试或开发任务。

将配置文件分配给服务

服务通过属性与配置文件相关联,该 profiles属性采用一组配置文件名称:

version: "3.9"
services:
  frontend:
    image: frontend
    profiles: ["frontend"]

  phpmyadmin:
    image: phpmyadmin
    depends_on:
      - db
    profiles:
      - debug

  backend:
    image: backend

  db:
    image: mysql

在这里,服务frontendphpmyadmin被分配给配置文件 frontend,并且 debug 仅在启用它们各自的配置文件时才启动。

没有 profiles 属性的服务将始终启用,即在这种情况下运行 docker compose up 只会启动 backend 和 db

有效的配置文件名称遵循[a-zA-Z0-9][a-zA-Z0-9_.-]+.

笔记

应用程序的核心服务不应分配配置文件,因此它们将始终启用并自动启动

启用配置文件

要启用配置文件,请提供--profile 命令行选项或使用COMPOSE_PROFILES环境变量

$ docker compose --profile debug up
$ COMPOSE_PROFILES=debug docker compose up

上述命令都将在debug启用配置文件的情况下启动您的应用程序。使用上面的文件,docker-compose.yml这将启动服务backend和 .dbphpmyadmin

可以通过为环境变量传递多个 --profile 标志或逗号分隔列表来指定多个配置文件:COMPOSE_PROFILES

$ docker compose --profile frontend --profile debug up
$ COMPOSE_PROFILES=frontend,debug docker compose up

自动启用配置文件和依赖解析

当一个已分配的服务profiles在命令行上明确定位时,它的配置文件将自动启用,因此您无需手动启用它们。这可用于一次性服务和调试工具。例如,考虑以下配置:

version: "3.9"
services:
  backend:
    image: backend

  db:
    image: mysql

  db-migrations:
    image: backend
    command: myapp migrate
    depends_on:
      - db
    profiles:
      - tools
# will only start backend and db
$ docker compose up -d

# this will run db-migrations (and - if necessary - start db)
# by implicitly enabling profile `tools`
$ docker compose run db-migrations

但请记住,这docker compose只会自动启用命令行上的服务配置文件,而不是任何依赖项。这意味着目标服务的所有服务都 depends_on 必须有一个共同的配置文件,始终启用(通过省略profiles)或显式启用匹配的配置文件:

但请记住,docker-compose只会自动启用命令行上的服务配置文件,而不会启用任何依赖项。这意味着目标服务depends_on的所有服务都必须有一个公共配置文件、始终启用(通过省略profiles(配置文件))或显式启用匹配配置文件:

version: "3.9"
services:
  web:
    image: web

  mock-backend:
    image: backend
    profiles: ["dev"]
    depends_on:
      - db

  db:
    image: mysql
    profiles: ["dev"]

  phpmyadmin:
    image: phpmyadmin
    profiles: ["debug"]
    depends_on:
      - db
# will only start "web"
$ docker compose up -d

# this will start mock-backend (and - if necessary - db)
# by implicitly enabling profile `dev`
$ docker compose up -d mock-backend

# this will fail because profile "dev" is disabled
$ docker compose up phpmyadmin

尽管目标phpmyadmin将自动启用其配置文件(即调试),但它不会自动启用db(即dev)所需的配置文件。要解决此问题,您必须将调试配置文件添加到db服务:

db:
  image: mysql
  profiles: ["debug", "dev"]

或显式启用db的配置文件

# profile "debug" is enabled automatically by targeting phpmyadmin
$ docker compose --profile dev up phpmyadmin
$ COMPOSE_PROFILES=dev docker compose up phpmyadmin

在生产中使用 Compose

当在开发中使用 Compose 定义您的应用程序时,可以使用此定义在不同的环境中运行您的应用程序,例如 CI、工作台和生产。

部署应用程序的最简单方法是在单个服务器上运行它,类似于运行开发环境的方式。如果想扩展应用程序,可以在 Swarm 集群上运行 Compose 应用程序。

修改Compose 文件以进行生产

可能需要对应用程序配置进行更改,以便为生产做好准备。这些变化可能包括:

  • 删除应用程序代码的任何卷绑定,以便代码保留在容器内并且不能从外部更改
  • 绑定到主机上的不同端口
  • 以不同方式设置环境变量,例如减少日志记录的详细程度,或指定外部服务(例如电子邮件服务器)的设置
  • 指定重启策略,例如restart: always避免停机
  • 添加额外的服务,例如日志聚合器

出于这个原因,请考虑定义一个额外的 Compose 文件,比如 production.yml,它指定适合生产的配置。此配置文件只需要包含您希望对原始 Compose 文件进行的更改。附加的 Compose 文件可以应用于原始文件docker-compose.yml以创建新配置。

一旦你有了第二个配置文件,告诉 Compose 将与 -f选项一起使用:

docker compose -f docker-compose.yml -f production.yml up -d

部署更改

更改应用程序代码时,请记住重建镜像并重新创建应用程序的容器。要重新部署名为web的服务,请使用:

docker compose build web
docker compose up --no-deps -d web

这首先为web重新构建镜像,然后停止、销毁和重新创建web服务。--no deps标志阻止Compose重新创建web依赖的任何服务。

在单个服务器上运行 Compose 

通过适当设置Docker_host、Docker_TLS_VERIFY和Docker_CERT_PATH环境变量,可以使用Compose将应用程序部署到远程Docker主机。另请参阅编写 CLI 环境变量

设置环境变量后,所有正常 docker compose 命令都无需进一步配置即可工作。

5、在 Compose 中控制启动和关闭顺序

你可以使用 depends_on选项控制服务启动和关闭的顺序。Compose始终按依赖关系顺序启动和停止容器,其中依赖关系由depends_on、links、volumes_from 和 network_mode:“service:…”确定。

然而,对于启动,Compose不会等到容器“就绪”(无论这对您的特定应用程序意味着什么),只会等到它运行。这是有充分理由的。

等待数据库(例如)就绪的问题实际上只是分布式系统中一个更大问题的子集。在生产中,你的数据库可能随时不可用或移动主机。你的应用程序需要对这些类型的故障具有弹性。

要处理此问题,请将应用程序设计为在失败后尝试重新建立与数据库的连接。如果应用程序重试连接,它最终可以连接到数据库。

最好的解决方案是在应用程序代码中执行此检查,无论是在启动时还是在任何原因导致连接丢失时。但是,如果您不需要这种级别的恢复力,可以使用包装脚本解决问题:

  • 使用诸如wait-for-it、 dockerizeWait4X、 sh-compatible wait-forRelayAndContainers模板之类的工具。这些是小型wrapper脚本,您可以将它们包含在应用程序的映像中,以轮询给定的主机和端口,直到它接受 TCP 连接。

    例如,使用 wait-for-it.sh 或 wait-for 换成你服务的命令:

    version: "2"
    services:
      web:
        build: .
        ports:
          - "80:8000"
        depends_on:
          - "db"
        command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
      db:
        image: postgres
    

    提示

    第一种解决方案存在局限性。例如,它不会验证特定服务何时真正就绪。如果向命令中添加更多参数,请使用 bash shift 命令进行,如下示例所示。

  • 或者,编写自己的wrapper 脚本来执行更具体的应用程序健康检查。例如,您可能希望等待Postgres准备好接受命令:

    #!/bin/sh
    # wait-for-postgres.sh
    
    set -e
      
    host="$1"
    shift
      
    until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c '\q'; do
      >&2 echo "Postgres is unavailable - sleeping"
      sleep 1
    done
      
    >&2 echo "Postgres is up - executing command"
    exec "$@"
    

    在前一示例中也可以使用作wrapper 脚本,设置:

    command: ["./wait-for-postgres.sh", "db", "python", "app.py"]

三、Portainer

Portainer 由一个可以在任何集群上运行的容器组成。它可以部署为 Linux 容器或 Windows 原生容器。在任何云、数据中心或设备中的 Kubernetes、Docker、Swarm 和 Nomad 上几分钟内部署、配置、故障排除和保护容器。

Portainer Community Edition(社区版)是一个用于容器化应用程序的轻量级服务交付平台,可用于管理 Docker、Swarm、Kubernetes 和 ACI 环境。它被设计为易于部署和使用。该应用程序允许通过“智能”GUI 和/或广泛的 API 管理所有编排器资源(容器、图像、卷、网络等)。

Portainer TutorialsPortainer使用视频教程)

Docker Standalone 安装方式

Docker Swarm 安装方式

注:以下是使用docker standalone(独立)安装,docker swarm安装方式未作介绍

Docker新建Portainer容器启动五分钟后,还没有创建管理员账号,portainer容器就会自动退出、关闭。

1、在 Linux 上使用 Docker 安装 Portainer

介绍

Portainer 由 Portainer ServerPortainer Agent两个对象组成 。这两个对象在 Docker 引擎上作为轻量级 Docker 容器运行。本文档将帮助您在 Linux 环境中安装 Portainer Server 容器。要将新的 Linux 环境添加到现有的 Portainer 服务器安装,请参阅 Portainer 代理安装说明
开始之前需要:
  • 最新版本的 Docker 已安装并运行
  • 在将托管 Portainer 服务器实例的机器上进行 sudo 访问
  • 默认情况下,Portainer Server 将通过 port 公开 UI, 9443并通过 port 公开 TCP 隧道服务器 8000。后者是可选的,仅当计划将边缘计算功能与边缘代理一起使用时才需要。
  • Portainer 的许可证密钥。
安装说明还对您的环境做出以下假设:
  • 环境符合 我们的要求。虽然 Portainer 可以与其他配置一起使用,但它可能需要更改配置或功能有限。
  • 正在通过 Unix 套接字访问 Docker。或者,也可以通过 TCP 连接。
  • SELinux 在运行 Docker 的机器上被禁用。如果需要 SELinux,则需要  --privileged 在部署 Portainer 时将标志传递给 Docker。
  • Docker 以 root 身份运行。使用非root身份 Docker 的 Portainer 有一些限制,需要额外的配置。

部署

首先,创建 Portainer Server 将用于存储其数据库的卷:

docker volume create portainer_data

然后,下载并安装 Portainer Server 容器:

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
默认情况下,Portainer 会生成并使用自签名 SSL 证书来保护 port 9443或者,您可以在安装期间或在安装完成后 通过 Portainer UI提供自己的 SSL 证书。
如果  9000出于遗留原因需要打开 HTTP 端口,请将以下内容添加到  docker run命令中:
-p 9000:9000

Portainer 服务器现已安装完毕。可以通过运行检查 docker ps 容器Portainer Server是否已启动 :

root@server:~# docker ps
CONTAINER ID   IMAGE                          COMMAND                  CREATED       STATUS      PORTS                                                                                  NAMES             
de5b28eb2fa9   portainer/portainer-ee:latest  "/portainer"             2 hours ago   Up 0 days   0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp   portainer

同样的我们还可以将这个服务的启动加到docker-componse当中进行启动:

使用portainer_data 卷时,必须先创建才能使用

# 创建卷portainer_data(卷名自己定)
$ docker volume create portainer_data
portainer_data
# 查询portainer_data卷的详细信息
$ docker volume inspect portainer_data
[
    {
        "CreatedAt": "2022-11-09T15:39:45+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/portainer_data/_data",  # 创建portainer_data卷默认所在位置
        "Name": "portainer_data",
        "Options": {},
        "Scope": "local"
    }
]
version: "3.9"    # compose版本
services:  # 加入服务
  portainer:     # 单个服务标识(名字)
    container_name: portainer      # 启动后的容器名称 相当于 --name 指定的名称
    image: portainer/portainer-ce:latest   # 社区版镜像
    ports:
      - 8000:8000    # 端口映射,前者是宿主机端口,后者是容器端口
      - 9443:9443
    volumes:         # 指定对应的数据卷  前者是宿主机目录,后者是容器目录
      - /var/run/docker.sock:/var/run/docker.sock    # 数据文件挂载
      - /var/lib/docker/volumes/portainer_data:/data     # Portainer Server用于存储其数据库的卷
    restart: always
      

登录

现在安装已完成,可以通过打开 Web 浏览器并转到以下位置登录 Portainer 服务器实例(直接访问远程虚拟机的9443端口,注册一个账号,链接到本地虚拟机的服务,就可以看到所提供的web可视化页面了。):
https://localhost:9443
如果需要,请替换 localhost为相关的 IP 地址或 FQDN,如果之前更改过端口,请调整端口。
将看到 Portainer Server 的初始设置页面。

创建第一个用户:

第一个用户将是管理员。用户名默认为 admin,但可以根据需要更改它。密码长度必须至少为 12 个字符并满足所列密码要求。

2、在 Windows 上使用 Docker 容器安装 Portainer服务

介绍

Portainer 由 Portainer ServerPortainer Agent两个对象组成  。这两个对象在 Docker 引擎上作为轻量级 Docker 容器运行。本文档将帮助您使用 Windows Containers 在您的 Windows 服务器上安装 Portainer Server 容器。要将新的 WCS 环境添加到现有的 Portainer 服务器安装,请参阅 Portainer 代理安装说明
开始之前需要:
  • 将托管 Portainer 服务器实例的计算机上的管理员访问权限
  • 默认情况下,Portainer Server 将通过 port 公开 UI, 9443并通过 port 公开 TCP 隧道服务器 8000。后者是可选的,仅当计划将边缘计算功能与边缘代理一起使用时才需要。
安装说明还对您的环境做出以下假设:
  • 环境符合 我们的要求。虽然 Portainer 可以与其他配置一起使用,但它可能需要更改配置或功能有限。

准备

要在 Windows 服务器/桌面环境中运行 Portainer 服务器,需要在防火墙中创建例外所需的环境。这些可以通过运行以下命令通过 PowerShell 轻松添加:
netsh advfirewall firewall add rule name="cluster_management" dir=in action=allow protocol=TCP localport=2377
netsh advfirewall firewall add rule name="node_communication_tcp" dir=in action=allow protocol=TCP localport=7946
netsh advfirewall firewall add rule name="node_communication_udp" dir=in action=allow protocol=UDP localport=7946
netsh advfirewall firewall add rule name="overlay_network" dir=in action=allow protocol=UDP localport=4789
netsh advfirewall firewall add rule name="swarm_dns_tcp" dir=in action=allow protocol=TCP localport=53
netsh advfirewall firewall add rule name="swarm_dns_udp" dir=in action=allow protocol=UDP localport=53

您还需要安装Windows Container Host Service并安装Docker:

Enable-WindowsOptionalFeature -Online -FeatureName containers -All
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider

完成后,将需要重新启动 Windows 服务器。重启完成后,就可以安装 Portainer 了。

部署

首先,创建 Portainer Server 将用于存储其数据库的卷。使用 PowerShell:
docker volume create portainer_data

然后,下载并安装 Portainer Server 容器:

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart always -v \\.\pipe\docker_engine:\\.\pipe\docker_engine -v portainer_data:C:\data portainer/portainer-ce:latest
默认情况下,Portainer 会生成并使用自签名 SSL 证书来保护 port 9443或者,可以在安装期间或在安装完成后 通过 Portainer UI提供自己的 SSL 证书。
如果  9000出于遗留原因需要打开 HTTP 端口,请将以下内容添加到  docker run 命令中:
-p 9000:9000

登录

现在安装已完成,可以通过打开 Web 浏览器并转到以下位置登录 Portainer 服务器实例:

https://localhost:9443

如果需要,请替换  localhost 为相关的 IP 地址或 FQDN,如果之前更改过端口,请调整端口。
将看到 Portainer Server 的初始设置页面。

创建第一个用户:

第一个用户将是管理员。用户名默认为 admin,但可以根据需要更改它。密码长度必须至少为 12 个字符并满足所列密码要求。

3、在 WSL / Docker 桌面上使用 Docker 安装 Portainer

介绍

Portainer 由 Portainer ServerPortainer Agent两个对象组成  。这两个元素在 Docker 引擎上作为轻量级 Docker 容器运行。本文档将帮助您在使用 WSL 和 Docker Desktop 的 Windows 环境中安装 Portainer Server 容器。要将新的 WSL/Docker 桌面环境添加到现有的 Portainer 服务器安装,请参阅 Portainer 代理安装说明
开始之前需要:
  • 最新版本的 Docker Desktop 已安装并正在运行。
  • 将托管 Portainer 服务器实例的计算机上的管理员访问权限。
  • 安装了适用于 Linux 的 Windows 子系统 (WSL) 并选择了 Linux 发行版。对于新安装,我们推荐 WSL2。
  • 默认情况下,Portainer Server 将通过 port 公开 UI, 9443并通过 port 公开 TCP 隧道服务器 8000。后者是可选的,仅当您计划将边缘计算功能与边缘代理一起使用时才需要。
安装说明还对您的环境做出以下假设:
  • 环境符合 要求。虽然 Portainer 可以与其他配置一起使用,但它可能需要更改配置或功能有限。
  • 正在通过 Unix 套接字访问 Docker。或者,也可以通过 TCP 连接。
  • SELinux 在 WSL 使用的 Linux 发行版中被禁用。如果您需要 SELinux,则需要 --privileged在部署 Portainer 时将标志传递给 Docker。
  • Docker 以 root 身份运行。使用非root身份 Docker 的 Portainer 有一些限制,需要额外的配置。

部署

首先,创建 Portainer Server 将用于存储其数据库的卷:
docker volume create portainer_data

然后,下载并安装 Portainer Server 容器:

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
默认情况下,Portainer 会生成并使用自签名 SSL 证书来保护 port 9443或者,可以在安装期间或在安装完成后 通过 Portainer UI提供自己的 SSL 证书。
如果 9000出于遗留原因需要打开 HTTP 端口,请将以下内容添加到 docker run命令中:
-p 9000:9000

Portainer 服务器现已安装完毕。可以通过运行检查 docker ps 容器Portainer Server是否已启动:

root@server:~# docker ps
CONTAINER ID   IMAGE                                              COMMAND                  CREATED        STATUS        PORTS                                                                                  NAMES
f4ab79732007   portainer/portainer-ee:latest                      "/portainer"             0 days ago    Up 2 hours   0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 0.0.0.0:9443->9000/tcp, :::9443->9443/tcp   portainer

登录

现在安装已完成,可以通过打开 Web 浏览器并转到以下位置登录 Portainer 服务器实例:

https://localhost:9443

如果需要,请替换  localhost 为相关的 IP 地址或 FQDN,如果您之前更改过端口,请调整端口。
您将看到 Portainer Server 的初始设置页面。

创建第一个用户:

第一个用户将是管理员。用户名默认为 admin,但可以根据需要更改它。密码长度必须至少为 12 个字符并满足所列密码要求。

4、Portainer忘记密码

1、使用以下命令查看所有容器对应的信息

docker ps -a

2、找到Portainer对应信息,停止Portainer容器

docker stop 355a8c4d2cce(容器ID)

3、使用以下命令找到Portainer容器挂载信息,找到下图红框所示信息

docker inspect 507566f7086e(容器ID)

4、执行命令重置密码

docker run --rm -v /路径:/data portainer/helper-reset-password 

此处命令:

docker run --rm -v /var/lib/docker/volumes/portainer_data:/data portainer/helper-reset-password

现在admin登录的密码就为:5,4T/6Ys29WS@C1J8o-[{r#l*pIBhKx7 

5、启动容器,输入用户名密码即可登录

docker start 355a8c4d2cce(容器ID)

6、修改Portainer的登录密码

登录之后找到Users下的admin并点击,进行密码修改

5、Portainer使用自己的证书

默认情况下,Portainer的web界面和API通过使用安装生成的自签名证书的HTTPS打开。可以在安装后通过 via the Portainer UI 或安装期间使用你自己的SSL证书进行替换。

使用自己外部颁发的证书时,请确保在提供的--sslcert文件中包含完整的证书链(包括任何中间证书)。否则,可能会面临证书验证问题。证书链可以从证书颁发者或What's My Chain Cert网站获得。

在Docker Standalone上使用你自己的SSL证书

  • Portainer 需要 PEM 格式的证书。

在安装过程中使用--sslcert--sslkey标志。

  • 如果使用的是由自己的CA签名的证书,需要提供带有--sslcacert标志的CA证书。

将证书(包括链条)和密钥上传到运行Portainer的服务器,然后启动Portainer引用它们。以下命令假定您的证书存储在/path/to/your/certs中,文件名为portainer.crt和portainer.key。并将目录绑定到Portainer容器中的/certs:

社区版:

docker run -d -p 9443:9443 -p 8000:8000 \
    --name portainer --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \
    -v /path/to/your/certs:/certs \
    portainer/portainer-ce:latest \
    --sslcert /certs/portainer.crt \
    --sslkey /certs/portainer.key

或者,Certbot可以用于生成证书和密钥。因为Docker存在符号链接问题,如果使用Certbot,则需要将“live”和“archive”目录作为卷,并使用全链条证书。例如:

社区版

docker run -d -p 9443:9443 -p 8000:8000 \
    --name portainer --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \
    -v /etc/letsencrypt/live/yourdomain:/certs/live/yourdomain:ro \
    -v /etc/letsencrypt/archive/yourdomain:/certs/archive/yourdomain:ro \
    portainer/portainer-ce:latest \
    --sslcert /certs/live/yourdomain/fullchain.pem \
    --sslkey /certs/live/yourdomain/privkey.pem

完成后,就可以访问 https://$ip-docker-host:9443.

猜你喜欢

转载自blog.csdn.net/fbbqt/article/details/127408356