将应用程序部署到服务器上时,应用程序与其自身捆绑的内容与它期望从平台(操作系统和已安装的包)提供的内容之间通常存在分离。其中一点是平台可以独立于应用程序进行更新。例如,当需要将安全更新紧急应用于平台提供的包而不重建整个应用程序时,这很有用。
传统上,安全更新只是通过执行包管理器命令来在操作系统上安装更新版本的包(例如 RHEL 上的“yum update”)来应用的。但是随着容器技术的出现,比如 Docker,其中容器镜像本质上同时捆绑了应用程序和平台,保持容器系统最新的规范方法是什么?主机和容器都有自己的、独立的、需要更新的包集,在主机上更新不会更新容器内的任何包。随着 RHEL 7 的发布,其中 Docker 容器特别突出,听到 Redhat 推荐的处理容器安全更新的方法是很有趣的。
关于几个选项的想法:
所以这些方法似乎都不令人满意。
建议使用哪种方法来更新在 Amazon ECS 中运行的服务的容器?
该AWS文档说:“如果你已经更新了应用程序的泊坞图像,你可以创建一个新的任务定义与图像,并将其部署到您的服务,一次一个任务。” 这几乎是当前文档中当前可用的所有内容(2015 年 4 月 13 日)。
我是否理解正确,在 Amazon ECS 中更新我的应用程序容器的唯一方法是创建一个新任务,然后停止旧任务并启动新任务?
我已经成功地在 Core OS 和 Fleectl 中使用了“最新”标签。这样做的好处是不需要为新的更新更改 Docker 镜像的标签,因为重新加载服务将看到新的更改并更新容器(使用相同的标签“最新”)。
您使用哪种方法在 Amazon ECS 中使用更新的 docker 镜像更新您的服务?
该docker-compose run参考文献指出它可以--rm选择
运行后移除容器。
我想让它成为run我在docker-compose.yml.
所以,问题是:
docker-compose.yml吗?(INB4“使用 bash 别名,卢克!”:当然,我可以docker-compose.yml通过设置一些 bash 别名来强制执行此操作,alias docker-compose-run='docker-compose run --rm'但我感兴趣的是如何通过docker-compose.yml而不是通过某种外部方式来强制执行此操作。)
例如,在 AWS 中,当我启动一个新的 EC2 实例时,它会加载一个新的 VM,然后使用容器映像填充 VM。这就是启动新 EC2 实例需要 60-90 秒才能启动的原因。
出于好奇,让 AWS 按原样运行主机有什么缺点,当用户想要“启动 EC2 实例”时,AWS 只会启动一个具有受限权限的容器,并且只允许用户访问那个容器?
好处是计算实例会很快启动。我仍在学习云技术,所以我只是想知道缺点是什么。
也许在不使用 VM 的情况下分配 CPU 资源会更困难?结果,用户会互相争夺可用的CPU吗?或者也许有一些安全问题?很想了解这个。
我正在尝试将文件添加到从官方tomcat镜像构建的 Docker镜像中。该图像似乎没有 root 权限,因为tomcat如果我运行 bash ,我以用户身份登录:
docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$
Run Code Online (Sandbox Code Playgroud)
如果我指示 aDockerfile将文件复制到该容器,则该文件具有权限644并且所有者为root. 据我了解,这似乎是合理的,因为 Dockerfile 中的所有命令都以 root 身份运行。但是,如果我尝试将该文件的所有权更改为 ,则会tomcat:tomcat出现Operation not permitted错误。
为什么我不能更改复制到该图像的文件的权限?
如何复制:
mkdir docker-addfilepermission
cd docker-addfilepermission
touch test.txt
echo 'FROM tomcat
COPY test.txt /usr/local/tomcat/webapps/
RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfile
docker build .
Run Code Online (Sandbox Code Playgroud)
的输出docker build .:
Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon
Step 0 …Run Code Online (Sandbox Code Playgroud) 我正在尝试在容器内使用循环设备来挂载一些图像文件:
> sudo losetup /dev/loop0 test.img
losetup: /dev/loop0: failed to set up loop device: No such file or directory
Run Code Online (Sandbox Code Playgroud)
/dev/loop0 确实不存在,并且
> sudo mknod /dev/loop0 b 7 0
mknod: ‘/dev/loop0’: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
我怎样才能使这项工作?容器是否需要一些它可能没有的 cgroup 权限?
我用这样的主管运行 docker 容器:
文件
CMD ["/run.sh"]
Run Code Online (Sandbox Code Playgroud)
运行文件
#!/usr/bin/env bash
exec supervisord -n
Run Code Online (Sandbox Code Playgroud)
主管-serf.conf
[group:job]
programs=serf,producer
[program:serf]
command=/start-serf-agent.sh
numprocs=1
autostart=true
autorestart=unexpected
stopasgroup=true
killasgroup=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
Run Code Online (Sandbox Code Playgroud)
start-serf-agent.sh
#!/bin/bash
exec serf agent --join=serf:7946 -tag role=producer
Run Code Online (Sandbox Code Playgroud)
supervisor-service.conf
[program:producer]
command=/start.sh
numprocs=1
stopasgroup=true
killasgroup=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
Run Code Online (Sandbox Code Playgroud)
启动文件
#!/bin/bash
exec /producer --project=${NAME}
Run Code Online (Sandbox Code Playgroud)
制作人停止后,我得到了:
producer_1 | 2016/02/29 21:59:50 [INFO] serf: EventMemberLeave: 7c4fbc80af97 172.19.0.2
producer_1 | 2016/02/29 21:59:51 INF 1 stopping
producer_1 | 2016/02/29 21:59:51 INF 1 exiting router
producer_1 | 2016-02-29 21:59:51,281 INFO exited: …Run Code Online (Sandbox Code Playgroud) 试图保持在红帽的青睐范围内并仍然计划系统寿命是很棘手的......
一年多来,我一直是Linux Containers (LXC)的支持者。我的初始安装基于从在线教程中收集的信息,例如this one和this one。这个中心的周围lxc-create,lxc-start|stop并且lxc-destroy命令和修改现有OpenVZ的模板。
这运行良好,并在生产中愉快地运行。但是,我提出了一些额外的系统,并决定查看 Red Hat 当前有关 EL6 容器的文档。看到他们在这方面的官方立场,我感到很惊讶。
在RHEL 6 是否提供使用 Linux 容器所需的 LXC 工具?,Red Hat 将 LXC 描述为技术预览并建议使用 libvirt 来管理创建和管理容器。
然而,Oracle在其 Unbreakable Linux 中提倡一种完全不同的容器化技术。
libvirt 方法中似乎缺少一些功能,但是我最初使用 lxc-* 命令的方法有点像手动过程……我不太清楚在 EL6 上管理容器的方法或“可接受”方法.
运行以下 docker 文件时"chmod: changing permissions of '/scripts/entrypoint.sh': Operation not permitted"出现错误。
FROM sonarqube:7.7-community
ADD plugins/* /plugins/
ADD scripts/* /scripts/
ADD conf/* /conf/
ADD bin/* /bin/
RUN chmod -R a+X /scripts/myScript.sh
ENTRYPOINT ["/scripts/myScript.sh"]
Run Code Online (Sandbox Code Playgroud)
但是当我添加USER root它时它正在工作。但我不想用 root 运行它。我可以在没有 root 的情况下运行它吗?
假设我们有一个安装了 lxc 的服务器,以及一个用作基础 img 的 lxc 容器/var/lib/lxc/ubuntu_base。为简单起见,让我们忘记复制基础 img 后的配置更改。
有些人建议使用子卷和快照来制作新容器,但可以轻松地执行 cp --reflink 并获得类似的结果。
那么管理多个容器的正确方法(或哪种更好)是什么?
这种方式看起来最好,但是像 lxc-destroy 这样的命令将不起作用,因为它无法删除目录。
btrfs subvolume snapshot /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
Run Code Online (Sandbox Code Playgroud)
我不确定这个或快照之间是否有任何性能差异
cp --reflink=always /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
Run Code Online (Sandbox Code Playgroud)
编辑:
我在 reflink 选项中看到的一件事是,如果其他容器正在运行,则无法删除基本容器,因为/proc和/dev已安装且从未更改,因此引用始终相同。但是关闭所有复制的容器似乎有帮助。
containers ×10
docker ×6
linux ×3
lxc ×2
redhat ×2
amazon-ecs ×1
btrfs ×1
centos ×1
cgroup ×1
cloud ×1
libvirt ×1
loop-device ×1
process ×1
security ×1
snapshot ×1
supervisord ×1
update ×1