我有一个运行 Nginx 的 docker 容器,它链接到另一个 docker 容器。第二个容器的主机名和 IP 地址在启动时作为环境变量加载到 Nginx 容器中,但在此之前不知道(它是动态的)。我希望我nginx.conf
使用这些值 - 例如
upstream gunicorn {
server $APP_HOST_NAME:$APP_HOST_PORT;
}
Run Code Online (Sandbox Code Playgroud)
如何在启动时将环境变量添加到 Nginx 配置中?
编辑 1
这是整个文件,在下面的建议答案之后:
env APP_WEB_1_PORT_5000_TCP_ADDR;
# Nginx host configuration for django_app
# Django app is served by Gunicorn, running under port 5000 (via Foreman)
upstream gunicorn {
server $ENV{"APP_WEB_1_PORT_5000_TCP_ADDR"}:5000;
}
server {
listen 80;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location /static/ {
alias /app/static/;
}
location /media/ {
alias /app/media/;
}
location / {
proxy_pass http://gunicorn;
} …
Run Code Online (Sandbox Code Playgroud) Docker 容器从哪里获取时间信息?我已经从基本的 ubuntu:trusty 映像创建了一些容器,当我运行它并请求“日期”时,我得到了 UTC 时间。
有一段时间我通过在我的 Dockerfile 中执行以下操作来解决这个问题:
RUN sudo echo "America/Los_Angeles" > /etc/timezone
Run Code Online (Sandbox Code Playgroud)
但是,由于某种原因停止工作。在网上搜索我看到以下建议:
docker run -v /etc/timezone:/etc/timezone [image-name]
Run Code Online (Sandbox Code Playgroud)
不过,这两种方法都正确设置了时区!
$ cat /etc/timezone
America/Los_Angeles
$ date
Tue Apr 14 23:46:51 UTC 2015
Run Code Online (Sandbox Code Playgroud)
有谁知道是什么给的?
假设我想标记一个 Docker 镜像,然后打错字。如何在不删除图像本身的情况下删除标签?手册页和 Docker 文档都没有提到删除标签。
docker tag 0e5574283393 my-imaj
docker tag 0e5574283393 my-image
# docker untag my-imaj # There is no "docker untag"!
Run Code Online (Sandbox Code Playgroud) 我想检查其他人创建的 docker 镜像,同时指定了入口点和 cmd,例如:
ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]
Run Code Online (Sandbox Code Playgroud)
我目前这样做:
docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login
Run Code Online (Sandbox Code Playgroud)
有没有办法将 CMD 覆盖为空(所以我不必使用“--login”)?
将应用程序部署到服务器上时,应用程序与其自身捆绑的内容与它期望从平台(操作系统和已安装的包)提供的内容之间通常存在分离。其中一点是平台可以独立于应用程序进行更新。例如,当需要将安全更新紧急应用于平台提供的包而不重建整个应用程序时,这很有用。
传统上,安全更新只是通过执行包管理器命令来在操作系统上安装更新版本的包(例如 RHEL 上的“yum update”)来应用的。但是随着容器技术的出现,比如 Docker,其中容器镜像本质上同时捆绑了应用程序和平台,保持容器系统最新的规范方法是什么?主机和容器都有自己的、独立的、需要更新的包集,在主机上更新不会更新容器内的任何包。随着 RHEL 7 的发布,其中 Docker 容器特别突出,听到 Redhat 推荐的处理容器安全更新的方法是很有趣的。
关于几个选项的想法:
所以这些方法似乎都不令人满意。
我有一个容器的问题,即使它完美地构建它也不能正确启动。原因是我添加到 Dockerfile 的一种解决方法(用于自我配置的 /etc/hosts 路由)
RUN mkdir -p -- /lib-override /etc-override && cp /lib/libnss_files.so.2 /lib-override
ADD hosts.template /etc-override/hosts
RUN perl -pi -e 's:/etc/hosts:/etc-override/hosts:g' /lib-override/libnss_files.so.2
ENV LD_LIBRARY_PATH /lib-override
Run Code Online (Sandbox Code Playgroud)
显然那里有一些错误,但我想知道如何获得有关 docker 在运行时正在做什么的更多信息。例如,这有效:
$ docker run image ls
usr bin ...
Run Code Online (Sandbox Code Playgroud)
但这不会:
$ docker run image ls -l
$
Run Code Online (Sandbox Code Playgroud)
日志中没有任何内容,我也无法调用交互式 shell。我可以使用 strace 来查看发生了什么,但我希望有更好的方法。
有什么办法可以将 docker 设置得更详细吗?
编辑:感谢 Andrew D。我现在知道上面的代码有什么问题(我留下了它以便可以理解他的答案)。现在的问题仍然是我如何调试这样的东西或了解为什么ls -l失败,为什么ls没有。
编辑: -D=true 可能会提供更多输出,但在我的情况下不是......
我的理解是,在其他操作系统上运行 docker 的主要限制是使之成为可能的 Linux 网络容器。(当然适用于 Mac)。
最近,Microsoft 宣布了在 Windows 10 上本地运行的Ubuntu linux用户模式的测试版。这可以在 Windows 上运行以 ELF 格式编译的二进制文件(与需要编译的 cygwin 不同。)
我的问题是:您能否在新的 Windows 10 (Ubuntu) bash 用户空间上本地运行 Docker?
系统启动时自动启动docker容器的好方法是什么?
在 Ubuntu 14.04 上有没有首选的方法来做到这一点?
我supervisord
过去曾用于自动启动网络应用程序。但这对 Docker 来说并不是一件正确的事情。
我刚刚开始学习 Docker,有些东西让我很困惑。正如我在 Docker 的网站上所读到的,容器不同于虚拟机。据我所知,容器只是一个沙箱,在其中运行整个隔离的文件系统。
我还读到容器没有安装来宾操作系统。相反,它依赖于底层操作系统内核。
所有这些都很好。我感到困惑的是,有一些以操作系统命名的 Docker 镜像。我们看到像 Ubuntu、Debian、Fedora、CentOS 等镜像。
我的观点是:这些图像是什么,真的吗?基于 Debian 映像创建容器与创建虚拟机并安装 Debian 有何不同?
我认为容器没有安装来宾操作系统,但是当我们创建映像时,我们将它们基于某个以一个操作系统命名的映像。
此外,在我看到的示例中,我们docker run ubuntu echo "hello world"
似乎正在使用 Ubuntu 启动 VM 并使其运行命令echo "hello world"
。
以同样的方式,当我们这样做时docker run -it ubuntu /bin/bash
,似乎我们正在使用 Ubuntu 启动虚拟机并使用命令行访问它。
无论如何,这些以操作系统命名的图像是关于什么的?使用其中一个映像运行容器并使用相应的来宾操作系统启动 VM 有什么不同?
我们只是与主机操作系统共享内核的想法(因此我们可以访问底层机器硬件资源,而无需虚拟化硬件),但仍然按顺序使用容器上每个不同系统的文件和二进制文件支持我们想要运行的任何应用程序?
Mac OS X 可以在 Docker 中运行吗?如果是这样,有什么建议吗?
它会无头运行,还是有可能远程连接到 GUI?