标签: docker

我应该将应用程序拆分为多个链接的 Docker 容器还是将它们合并为一个?

背景

我目前正在构建一个我想部署到 Docker 容器的应用程序。

容器将在我的服务器上运行。我希望能够在同一台服务器上运行其他应用程序,而不会增加运行的 Docker 映像的数量。

截至目前,不同的零件/容器是:

  • Nginx(反向代理,静态资源)
  • 节点(应用程序前端)
  • 节点(应用后端/API)
  • 蒙戈(数据库)

想法

我的一般想法是每个不同的部分都应该作为一个容器运行。我担心的是,如果我要在同一台机器上运行另一个应用程序,我最终会用大量无法处理的链接图像来膨胀它。

这可以通过为每个应用程序制作一个图像来解决。这样上述服务将成为一个图像的一部分。这首先与 Docker 的整体安全性或目的冲突吗?

澄清

在一个 Docker 镜像中拥有多个服务是否与 Docker 的目的冲突?

当从一个镜像运行服务时,容器的整体安全优势会被消除吗?

virtualization containers docker

7
推荐指数
1
解决办法
3491
查看次数

如何使用 socks5 代理制作 docker-compose 拉取图像?

我正在尝试通过 socks5 代理拉取图像。我已经在端口上启动了socks5代理,8888如下所示:

ssh -NC -D 8888 parham@***.***.**
Run Code Online (Sandbox Code Playgroud)

但是,当我这样运行时docker-compose,很明显它没有使用环境变量:

$ ALL_PROXY=socks5://127.0.0.1:8888 docker-compose up
Run Code Online (Sandbox Code Playgroud)

如何让 Docker 通过这个代理拉取镜像?

proxy socks docker

7
推荐指数
2
解决办法
1万
查看次数

在构建服务器上使用缓存构建 Docker 映像?

我们有一个 Jenkins CI 服务器,它从 Git 获取我们的代码,构建它,制作一个 Docker 镜像,然后将它发送到一些生产服务器。

我们的项目主要是用 Python 编写的,所以“构建”涉及运行

pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

效果很好,只是有点慢。它必须通过网络获取包,另外还必须为其中一些构建 C 库(而且“lxml”并不小!)。

在开发中,我已经成功地pip-accel用来加速这个过程。它具有相同的接口,pip但它同时缓存 Python 下载和构建的 C 代码,所以

pip-accel install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

很快。

我想为我们的生产版本这样做,但我遇到了一些障碍。

显然,pip-accel需要一个目录来存储缓存。因为我们的 CI 服务器是运行构建的地方,所以这是放置它的合乎逻辑的地方。但是该pip install命令在一个新的 Docker 容器中运行,因此它不能只访问该服务器上的公共目录。

Docker“卷”似乎是为与容器共享目录而设计的,但我们的构建发生在内部(令人惊讶)docker build,并且只docker run允许您附加卷。您不能使用docker build.

有什么我想念的吗?如何在我docker build所在的容器之外运行并与我的主机共享缓存文件夹?

deployment python build-server pip docker

7
推荐指数
1
解决办法
1314
查看次数

从 Docker 容器发送邮件的简单方法?

我有一个在 Docker 容器内运行的备份脚本,我希望它在磁盘使用率低时向我发送电子邮件。

这是脚本:

#!/bin/bash
CURRENT=$(df /data | grep / | awk '{ print $5}' | sed 's/%//g')
THRESHOLD=90

echo "$CURRENT"

if [ "$CURRENT" -gt "$THRESHOLD" ] ; then
    echo "Low Disk Space Alert: ${CURRENT}% used"
  mail -s 'Disk Space Alert' olalonde@gmail.com << EOF
Backup server remaining free space is critically low. Used: $CURRENT%
EOF
fi
Run Code Online (Sandbox Code Playgroud)

问题是我无法让邮件在容器内工作。这是我的 Docker 文件:

FROM ubuntu:latest
MAINTAINER olalonde@gmail.com
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
  apt-get install -y postfix && \
  apt-get install -y mailutils …
Run Code Online (Sandbox Code Playgroud)

email ubuntu docker

7
推荐指数
2
解决办法
2万
查看次数

测量覆盖网络性能的正确方法

我目前正在检查不同 Docker 覆盖网络的性能(尤其是 UDP 吞吐量)。为此,我在与 Docker 覆盖网络连接的两台主机之间创建点对点连接,然后iperf在 Docker 容器内运行以检查吞吐量。我注意到每次我iperf作为客户端运行向iperf作为服务器运行的另一个容器发送数据时,客户端主机的CPU使用率达到100%。我通过运行在此处找到的以下命令获得了该结果:

top -bn1 | grep "Cpu(s)" | \
       sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
       awk '{print 100 - $1"%"}'
Run Code Online (Sandbox Code Playgroud)

因此,对我而言,吞吐量测试的限制因素似乎是主机的 CPU 容量,因为它以 100% 的速度运行并且无法产生更多流量来使网络连接饱和。我想知道这是否是一个iperf特定问题,所以我想使用不同的工具运行相同的测试,但不确定哪种替代方案最好。主机正在运行 Ubuntu。例如,我发现qperf,uperf和netpipe。

此外,更一般地说,我开始想知道吞吐量性能的瓶颈通常是什么。它不总是与CPU容量或链路带宽有关吗?哪些因素与覆盖网络没有直接关系。

这是否意味着应用程序(或覆盖网络)的吞吐量仅取决于它需要多少 CPU 周期来传输一定数量的数据以及它如何压缩它以适应它通过网络(如果这将是瓶颈)。

iperf linux-networking cpu-usage stress-testing docker

7
推荐指数
1
解决办法
655
查看次数

无法在 Ubuntu 14.04 上启动 docker:作业无法启动

我正在尝试使用官方网站 ( Docker Docs )上的说明在带有 Ubuntu 14.04 的 Vagrantbox 上安装 Docker 。安装似乎有效,但之后我无法使用sudo service docker start它启动 docker 服务,它给了我以下错误消息:

start: Job failed to start

如果我尝试,docker ps -a则会收到以下错误消息:

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

内核:Linux vagrant-ubuntu-trusty-64 3.13.0-85-generic #129-Ubuntu SMP Thu Mar 17 20:50:15 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

来自 /var/log/upstart/docker.log 的相关行

Waiting for /var/run/docker.sock Invalid value "" for flag --mtu: strconv.ParseInt: parsing "": invalid syntax

ubuntu vagrant docker

7
推荐指数
1
解决办法
7571
查看次数

ECS 中的 Docker 卷权限

我正在将现有应用程序从在裸 EC2 实例上运行迁移到使用 ECS 的容器化设置。我有两种情况需要在容器之间共享数据。一个是存储一些静态和媒体文件的 EFS 共享,另一个是日志目录,以便我可以使用 sidecar 容器中的 Cloudwatch Logs 代理将日志推送到 Cloudwatch。

网络服务器需要能够将数据写入这两个位置,但到目前为止我还无法实现。日志目录是本地卷,归root:root. 我按照这些说明设置的 EFS 共享归1000:xfs(无用户名)所有。在这两种情况下,我的网络用户 ( www-data) 都不能写入这些位置。

如何告诉 ECS 在具有给定所有者和/或组的容器内安装卷?

amazon-web-services docker amazon-ecs

6
推荐指数
1
解决办法
2860
查看次数

为什么当文件存在时 docker-compose 会发出“没有这样的文件或目录”?

我正在测试我的服务器的裸机恢复,它基本上用我的服务启动了一组 docker 容器。我从备份中恢复/etc/docker,在那里我保留了所有配置和持久卷。

然后我尝试启动其中一个容器:

root@srv-backup:/etc/docker# docker-compose --verbose -f /etc/docker/docker-compose.d/20-registry.yaml up
compose.config.config.find: Using configuration files: /etc/docker/docker-compose.d/20-registry.yaml
ERROR: compose.cli.main.main: .IOError: [Errno 2] No such file or directory: '/etc/docker/docker-compose.d/20-registry.yaml'
Run Code Online (Sandbox Code Playgroud)

然而,该文件在那里:

root@srv-backup:/# ll /etc/docker/docker-compose.d/20-registry.yaml
-rwxrwxr-x+ 1 root root 842 Jan 24 15:19 /etc/docker/docker-compose.d/20-registry.yaml*

root@srv-backup:/# cat /etc/docker/docker-compose.d/20-registry.yaml
services:
  registry:
    container_name: registry
    image: registry
    labels:
      - traefik.http.routers.registry.rule=Host(`registry.example.com`)
      - traefik.http.routers.registry.entryPoints=https
      - traefik.http.routers.registry.tls=true
      - traefik.http.routers.registry.tls.certresolver=le
      - traefik.http.middlewares.lan.ipwhitelist.sourcerange=192.168.10.0/24, 192.168.20.0/24
      - traefik.http.routers.registry.middlewares=lan
      - traefik.enable=true
    restart: unless-stopped
    volumes:
      - /etc/docker/container-data/registry:/var/lib/registry
version: '3'

root@srv-backup:/# file /etc/docker/container-data/registry
/etc/docker/container-data/registry: directory
Run Code Online (Sandbox Code Playgroud)

我用相对路径和完整路径尝试了各种咒语 - …

docker docker-compose

6
推荐指数
1
解决办法
2万
查看次数

在 docker 容器中运行 Unifi Controller 时无法采用新设备

我正在尝试在 docker 容器中托管 Unifi 控制器,但除非将网络模式设置为“主机”,否则我无法采用新设备(接入点)。我遵循了几个指南并打开了此处列出的所有端口。可以管理已连接的设备并查找新设备,但采用它们会导致永无休止的“采用”状态。

第一个配置基于jacobalberty/unifi:

version: "3.7"

services:
  controller:
    image: jacobalberty/unifi:arm32v7
    restart: unless-stopped
    init: true
    volumes:
      - ./data:/unifi
    environment:
      TZ: "Europe/Stockholm"
    ports:
      - "3478:3478/udp"
      - "5514:5514/udp"
      - "8080:8080"
      - "8443:8443"
      - "8843:8843"
      - "8880:8880"
      - "6789:6789"
      - "27117:27117"
      - "5656-5699:5656-5699/udp"
      - "1900:1900"
      - "10001:10001/udp"
#    network_mode: "host"
Run Code Online (Sandbox Code Playgroud)

另一个是linuxserver.io示例的直接副本:

version: "2.1"
services:
  unifi-controller:
    image: linuxserver/unifi-controller
    container_name: unifi-controller
    environment:
      - PUID=1000
      - PGID=1000
      - MEM_LIMIT=1024M #optional
    volumes:
      - ./data:/config
    ports:
      - 3478:3478/udp
      - 10001:10001/udp
      - …
Run Code Online (Sandbox Code Playgroud)

docker unifi

6
推荐指数
1
解决办法
1万
查看次数

包 docker-ce 需要 containerd.io &gt;= 1.4.1,但是没有一个提供程序可以安装

今天早上我在红帽(Linux 4.18.0-240.1.1.el8_3.x86_64)上的更新/升级都遇到了这个问题,不知道该怎么做。听起来像 yum 完全卡住了因为这个。

$ sudo yum update
Updating Subscription Management repositories.
Last metadata expiration check: 2:40:27 ago on Wed 16 Dec 2020 07:53:10 AM CST.
Error: 
 Problem: package docker-ce-3:20.10.1-3.el7.x86_64 requires containerd.io >= 1.4.1, but none of the providers can be installed
  - cannot install the best update candidate for package docker-ce-3:19.03.14-3.el7.x86_64
  - package containerd.io-1.4.3-3.1.el7.x86_64 is filtered out by modular filtering
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
Run Code Online (Sandbox Code Playgroud)

redhat yum docker containerd

6
推荐指数
1
解决办法
4115
查看次数