标签: docker

Docker:为不同的容器运行 Cronjob

我正在寻找有关为我的 php fpm 容器运行 cronjobs 的最佳实践。

现在运行:

  • NGINX 容器
  • PHP FPM 容器
  • MySQL 容器

我现在希望运行另一个名为“Cronjob Container”的容器,它在我的 PHP FPM 容器中执行脚本(我需要一些 PHP 依赖项)。

所以三种可能的解决方案:

1.) 运行自己的容器

我很想使用这个解决方案!

最好有一个运行 CRON 的容器,我可以(以某种方式)在我的 php fpm 容器上调用 docker exec ......或者有另一种方式。

2.) 在 PHP 容器内运行 CRON

这没问题,但不是最佳实践。我可以在运行 cron 的 php fpm 容器中启动第二个进程。这会起作用,但我不确定这是否是您应该与 docker 一起工作的人。

3.) 运行主机 Cron

这将是残酷的。我需要找到给定路径的 processID 和 containerID,然后运行 ​​docker exec。但这或多或少是我最后的方式......而且我讨厌在没有部署的情况下管理 cronjobs。

那么这里最好的方法是什么?

祝你今天过得愉快,

巴斯蒂安

cron best-practices docker

5
推荐指数
1
解决办法
7739
查看次数

从容器内部调用 lvcreate 挂起

我运行一个容器。它具有所有功能并从根目录挂载所有目录(除了/proc)。当我lvcreate从里面打电话时,我得到:

# lvcreate -v -L104857600B -n vol1 default
Finding volume group "default"
Archiving volume group "default" metadata (seqno 17).
Creating logical volume vol1
Creating volume group backup "/etc/lvm/backup/default" (seqno 18).
Activating logical volume "vol1".
activation/volume_list configuration setting not defined: Checking only host tags for default/vol1
Creating default-vol1
Loading default-vol1 table (252:4)
Resuming default-vol1 (252:4)
Run Code Online (Sandbox Code Playgroud)

并且命令挂起。我也在日志中得到了这个:

Sep 12 12:03:31 node3 systemd-udevd[12529]: Process '/sbin/dmsetup udevcomplete 23072978' failed with exit code 1
Run Code Online (Sandbox Code Playgroud)

如果我用ctrl-C我设置中断它,则创建逻辑卷。我也可以通过dmsetup udevcomplete_all …

lvm udev docker

5
推荐指数
1
解决办法
1633
查看次数

无法删除容器网络

自从我将计算机上的 Docker 升级到 beta27 以来,我一直无法使用默认网络运行 Windows 容器。我收到以下消息:

docker: Error response from daemon: container xxx encountered an error during Start failed in Win32: The system cannot find the path specified. (0x3): Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
Run Code Online (Sandbox Code Playgroud)

我已经卸载/删除了所有内容(Windows 版 Docker、Hyper-V、容器功能以及遗留在 C:\ProgramData\Docker 中的文件),然后重新安装了所有内容,但问题仍然存在。

我意识到nat适配器不再存在于 Hyper-V 中,但DockerNat适配器存在。

本文提供了一个脚本来重置网络组件,但我无法删除容器网络。

PS C:\WINDOWS\system32> Get-ContainerNetwork

Name Id                                   Subnets         Mode SourceMac DNSServers DNSSuffix
---- -- …
Run Code Online (Sandbox Code Playgroud)

windows docker

5
推荐指数
1
解决办法
3920
查看次数

传入的数据包不会命中 iptables INPUT 链

我在 docker 容器中运行 VPN 客户端。我正在尝试通过端口 8080 从主机连接到在 docker 容器中运行的 Web 服务器。当我尝试连接时,我通过 tcpdump 看到端口 8080 上的传入数据包,但 Web 服务器从未看到它。我为数据包的所有可能状态转换添加了 iptables '-j LOG' 规则,以尝试对其进行跟踪。我在以下位置看到数据包:

  • 表 'raw',链 PREROUTING
  • 表 'mangle',链 PREROUTING
  • table'nat',链 PREROUTING

然后……什么都没有。经过一小段延迟后,重新发送数据包,我看到新数据包通过 PREROUTING。mangle INPUT 或 mangle FORWARD 链上从未出现任何内容 - 据我所知这是不可能的 - 它必须击中其中之一。有没有办法让数据包通过 PREROUTING,但没有点击 INPUT 或 FORWARD?我的 iptables 如下:

root@87ff7ad8e4f9:/# iptables -t raw -L 
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
NFLOG      tcp  --  anywhere             anywhere             tcp spt:http-alt nflog-prefix  "raw pre-route Src incoming packet"
NFLOG      tcp  --  anywhere             anywhere             tcp dpt:http-alt …
Run Code Online (Sandbox Code Playgroud)

networking linux routing iptables docker

5
推荐指数
1
解决办法
1989
查看次数

Hyper-V 容器将允许运行 Linux 容器?

我在任何地方都找不到明确的答案(很多相互矛盾的信息,而且非常笼统)。使用新版本的 MS Windows Server 2016,可以在两种模式下运行容器:

  • 视窗容器
  • Hyper-V 容器

第一个(windows 容器)是一个经典的容器,它共享相同的 MS Windows Server 内核并且不是很安全。但是第二个(hyper-v 容器)使用管理程序来提供隔离和安全性。

几个月前 Windows 10 周年更新的正版发行版 Microsoft 已包含“适用于 Linux 的 Windows 子系统”。

是否可以使用 Hyper-V 容器技术运行 Linux(Ubuntu、Debian、CoreOS 等?)容器?

我到处搜索,但找不到适用于 Hyper-V 容器的 Linux 容器映像。我能找到的只有两个可用的是 Microsoft 提供的 Nano Server 和 Windows Server 2016。

现在使用 Windows Server 2016 的技术预览版 5 (TP5),一般可用性 (GA) 将在几天前在 Ignite 会议上宣布的任何一天发布。

有人有消息吗?能验证吗?

hyper-v containers docker windows-server-2016

5
推荐指数
1
解决办法
1828
查看次数

访问连接到 VPN 的 Docker 容器中的服务

我设置了一个 Linux 服务器(现在是 VirtualBox VM)

在该服务器中,我运行了一个Docker container包含两件事的文件:

  • 在特定端口上具有 Web 界面的应用程序
  • 打开 VPN 客户端

我可以访问该应用程序(从我的主机,因为 Linux 是 VM 来宾)并且一切正常,直到我连接 VPN。

VPN 工作 - 流量通过它,但我无法再连接到我的应用程序 (ERR_CONNECTION_TIMED_OUT)。

所以我的目标是:

  • 在 Docker 容器中有一个服务器,所有流量都通过 VPN
  • 能够在我的本地网络中访问该服务器/容器(就像我现在没有连接 VPN 时所做的那样)

我怎样才能实现它?

这是我的 .ovpn 文件的样子

client
auth-user-pass
ping 5
dev tun
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
verb 3
route-metric 1
proto udp
ping-exit 30
cipher AES-256-CBC

// cetrificate here

remote <remote-host-ip>
Run Code Online (Sandbox Code Playgroud)

networking vpn openvpn docker

5
推荐指数
1
解决办法
1332
查看次数

配置php-fpm访问docker中的环境变量

我在 docker 容器中运行 php7-fpm。但是,我的 php 脚本无法访问我的 docker-compose 文件中设置的环境变量。getenv('MY_ENV_VAR')返回FALSE。

我已更改/etc/php/7.0/fpm/pool.d/www.conf为包含clear_env = no并重新启动,service php7.0-fpm restart但我的环境变量 start 不存在。

我也试过编辑 /etc/php/7.0/fpm/php.ini 包含行variables_order = "EGPCS".

当我在 bash shell 上执行到我的容器时,我可以看到我的变量存在。只是它们在我的 php 脚本中无法访问。

我错过了什么?

environment-variables php-fpm docker docker-compose

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

如何解封 Vault 服务器,在 docker 容器中运行

我有一个成功启动 consul 的 docker compose 设置(在此处配置)。Vault 似乎启动正常,除了设置 TTL 时出现一些错误(此处记录)。

再往后, consul 在尝试访问 时似乎打嗝/v1/agent/check/fail/vault:127.0.0.1:8200:vault-sealed-check?note=Vault+Sealed。显然'vault:127.0.0.1:8200:vault-sealed-check' status is now critical。

consul1    |     2016/11/05 20:50:04 [DEBUG] agent: Check 'vault:127.0.0.1:8200:vault-sealed-check' status is now critical
consul1    |     2016/11/05 20:50:04 [DEBUG] agent: Service 'vault:127.0.0.1:8200' in sync
consul1    |     2016/11/05 20:50:04 [DEBUG] agent: Service 'consul' in sync
consul1    |     2016/11/05 20:50:04 [DEBUG] agent: Check 'vault:127.0.0.1:8200:vault-sealed-check' in sync
consul1    |     2016/11/05 20:50:04 [DEBUG] agent: Node info in sync
consul1    |     2016/11/05 …
Run Code Online (Sandbox Code Playgroud)

configuration docker consul

5
推荐指数
1
解决办法
7544
查看次数

Postgresql:如何确定数据库 docker 容器是否正在运行?

在 docker 映像的入口点 shell 脚本上,我想确定 postgresql 容器是否可以侦听连接。对于 mysql,我使用了以下代码段:

while ! mysqladmin ping -h"$MOODLE_DB_HOST" -P $MOODLE_DB_PORT --silent; do
  echo "Connecting to ${MOODLE_DB_HOST} Failed"
  sleep 1
done
Run Code Online (Sandbox Code Playgroud)

如何使用 postgresql 实现类似的功能?

postgresql bash docker

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

在多个 docker 容器中运行 Ansible 命令

我需要针对多个正在运行的容器运行一个命令。例如,假设我的应用程序需要在收到代码更新后针对数据库运行数据结构更新。为此,我们要运行docker build <project_dir> -t latest,然后docker stop; docker rm; docker run。在这个阶段,我们可以假设我们已经更新了容器的核心代码,但我们仍然需要使用应用程序自己的工具运行该数据库更新。

本质上,我需要某种方法来获取正在运行的容器列表,按某些条件进行过滤,然后将这些容器 ID 注册到 Ansible。然后对于每个容器,我们运行命令。

像这样:

- name: Get list of running containers
  docker:
      image: my-image:latest
      state: running
      register: container_ids
Run Code Online (Sandbox Code Playgroud)

此任务将存储使用my-image:latestto的正在运行的容器列表container_ids。然后我们执行命令:

- name: Exec the database update
  cmd: "docker exec -it {{ item }} my-app-db-update.sh"
  with: container_ids
Run Code Online (Sandbox Code Playgroud)

由于我们真的不想将活动容器用于此类操作,因此更好的选择是启动一个新的一次性容器来处理相同的数据:

- name: Run the database update
  cmd: "docker run --rm --volumes-from {{ item }} --link:mydb:db my-app sh -c 'my-app-db-update.sh'"
  with: container_ids
Run Code Online (Sandbox Code Playgroud)

以上只是伪代码——它实际上不会运行。如何完成存储满足特定条件的正在运行的 docker 容器列表的任务,以便我可以使用docker …

update containers ansible docker ansible-playbook

5
推荐指数
1
解决办法
6652
查看次数