我有两个 Docker 镜像,每个镜像都有很多层。我想将第一个镜像中的所有文件与第二个镜像中的所有文件进行比较,看看有什么变化。
我尝试使用
docker image save <image no> > MyImage.tar
但当我解压它时,我得到了 100 多个目录,每个目录都包含
VERSION json layer.tar
所以这没用
我有两个 Docker 镜像,每个镜像都有很多层。我想将第一个镜像中的所有文件与第二个镜像中的所有文件进行比较,看看有什么变化。
我尝试使用
docker image save <image no> > MyImage.tar
但当我解压它时,我得到了 100 多个目录,每个目录都包含
VERSION json layer.tar
所以这没用
我正在研究在一个实际部署到生产中的大型项目中使用 Docker。我以前从未使用过 Docker,但据我所知,它包含一个名为“容器引擎”的新布局,它使您有机会部署许多彼此独立的应用程序并使用主机的资源。
就我工作的情况而言,部署我们应用程序的机器可以具有不同的操作系统和架构,例如 Windows、Linux、arm、Debian 等……但它们没有任何正在运行的虚拟机,只有操作系统和我们部署的应用程序。
这些机器可以在同一系统上运行 4-5 个应用程序,每个应用程序都有不同的依赖关系。我们已经遇到了一些问题:例如文件描述符,其中一个应用程序从另一个应用程序获取日志写入,从而生成错误日志并崩溃。
这些应用程序通过 TCP/IP 套接字与机器的其他部分进行通信,并使用 gRPC、QPID 和 SFTP 与环境的其他元素(外部服务器、自己的库等)进行通信。我不知道使用这些协议是否会使我们系统中 docker 的实现变得复杂。
与我的同事交谈后,他们告诉我这不值得,因为它不会带来任何优化或好处,但我不这么认为。
我一直在阅读,通过使用容器,我们可以获得操作系统独立性,使应用程序使用docker镜像在不同的操作系统上运行,实现库独立性,从而实现应用程序之间的隔离。
在我们的Dockerfile
我们有:
FROM ghcr.io/puppeteer/puppeteer:latest AS pdf
WORKDIR /puppeteer
USER root
# Prerequisites
RUN apt-get update && apt-get install nginx -y
# Update
RUN npm update
RUN npm update -g
RUN npm install -g npm
# Dependencies
RUN npm install puppeteer
# Run
COPY ./pdf.js .
RUN chmod u+x pdf.js
RUN service nginx start && ./pdf.js
这会等待 Nginx 启动,然后运行 Node.js 脚本(该脚本会抓取 Nginx Web 服务器上的一些页面)。
中的命令正确吗# Update
?为了使其正确且完整地更新,命令的顺序是否重要?
Node.js/NPM 似乎已更新,但在运行时会在控制台中抛出以下警告(需要一些时间):
#43 3.167 npm WARN EBADENGINE Unsupported engine {
#43 3.169 npm WARN EBADENGINE package: '[email protected]',
#43 3.170 npm WARN EBADENGINE required: { node: '^18.17.1 || >=20.10.0' },
#43 3.172 npm WARN EBADENGINE current: { node: 'v20.9.0', npm: '10.1.0' }
#43 3.174 npm WARN EBADENGINE }
我们如何修复有关不支持的引擎/不匹配版本的警告?IE 如何从 Node 更新v20.9.0
到v20.10.0
(或最新)?
Docker 特别推荐你应该使用apt-get update
他们的最佳实践。我们是否也应该像上面那样更新 Node.js/NPM?更新可能会导致我们安装的Google Puppeteer出现任何问题吗?puppeteer:latest
IE,因为这些更高版本未经Google测试。
我正在同一应用程序的不同版本之间运行速度测试。我希望能够为每个应用程序分配一组固定的 cpu。例如,我想在两个 cpu 上运行应用程序,而不是更多。另外,我希望这两个 cpu 独占该进程,这样其他进程就不能“窃取” cputime 并降低测试分数。
有没有办法在 Linux 上做到这一点?我听说过 cgroup、容器和 docker。这些会有帮助吗?另外,哪种方法最简单(不一定是最用户友好的),哪种方法给我最大的控制权?
我也有点担心超线程。如果我给这个测试进程分配一个逻辑cpu,而测试时另一个进程是超线程的,这样不是会让测试结果变得更差吗?然后我还需要按物理 cpu 来分离 cpu。
我使用以下命令在 root 下的 podman 中启动了官方 nginx 映像:
sudo podman run --name nginx \
... \
-v /var/log/nginx:/var/log/nginx \
docker.io/library/nginx:latest
日志记录工作正常,但是当尝试使用从互联网获取的所有配置在主机上进行 logrotate 时,它会失败,例如:
/var/log/nginx/*.log {
hourly
missingok
rotate 24
compress
delaycompress
notifempty
su root root
create 0644
sharedscripts
postrotate
podman exec nginx /bin/bash reset_log.sh
endscript
}
reset_log.sh 脚本包含启动新日志的众所周知的命令,如果登录到容器并手动运行,它会按预期工作:
kill -USR1 `cat /var/run/nginx.pid`
但所有这些东西并没有按预期一起工作,日志记录继续记录到 access.log.1 文件或根本不记录日志。尝试了没有“su root root”、没有“create ..”的变体 - 没有成功。
更新:似乎存在权限问题,需要更多调查。手动强制命令 logrotate -f -v /etc/logrotate.conf 按预期工作。主机上未安装 selinux 或 apparmor (arch linux)
systemd[1]: Starting Rotate log files...
conmon[4388]: conmon 32834b35446220b4e6d4 <nwarn>: runtime stderr: setns `mnt`: Operation not permitted
fail startup
conmon[4388]: conmon 32834b35446220b4e6d4 <error>: Failed to create container: exit status 1
logrotate[4377]: Error: crun: setns `mnt`: Operation not permitted: OCI permission denied
logrotate[4374]: error: error running shared postrotate script for '/var/log/nginx/*.log '
systemd[1]: logrotate.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: logrotate.service: Failed with result 'exit-code'.
systemd[1]: Failed to start Rotate log files.
在我的kubernetes(v1.28.7)中,docker使用containerd作为底层容器管理引擎。
(我想我可以称之为容器运行时接口 - CRI?)。
这就是我的假设(查看最后一行并一直滚动到右侧):
lab@worker01:~$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2024-03-27 14:22:36 UTC; 1h 11min ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 946 (dockerd)
Tasks: 7
Memory: 87.3M
CPU: 1.080s
CGroup: /system.slice/docker.service
└─946 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd <--- HERE!!! containerd instead of docker.
问题: 如果 containerd 是我的 CRI,为什么是唯一的方法,例如。列出图像或显示正在运行的容器是“crictl”?
sudo crictl image ls
IMAGE TAG IMAGE ID SIZE
docker.io/calico/cni v3.26.0 5d6f5c26c6554 93.3MB
docker.io/calico/node v3.26.0 44f52c09decec 87.6MB
docker.io/library/busybox latest ba5dc23f65d4c 2.16MB
docker.io/library/nginx latest 92b11f67642b6 70.5MB
docker.io/library/redis latest 170a1e90f8436 51.4MB
k8s.gcr.io/metrics-server/metrics-server v0.6.2 25561daa66605 28.1MB
registry.k8s.io/coredns/coredns v1.10.1 ead0a4a53df89 16.2MB
registry.k8s.io/kube-proxy v1.28.7 123aa721f941b 28.1MB
registry.k8s.io/pause 3.8 4873874c08efc 311kB
registry.k8s.io/pause 3.9 e6f1816883972 322kB
为什么docker OR ctr显示没有图像:
sudo ctr images ls
REF TYPE DIGEST SIZE PLATFORMS LABELS
sudo docker images ls
REPOSITORY TAG IMAGE ID CREATED SIZE
使用来自输出的容器化 Elasticsearch 的 IP 地址,docker inspect
我成功地在另一个容器内运行的 Jupyter 笔记本中调用了Elasticsearch函数。两者均由docker compose up
.
但就我而言,IP 地址在新的运行时会发生变化(例如 docker compose up/down)。
ip可以设置吗?例如,通过向构建上下文中使用的elasticsearchdocker-compose.yml
添加一些内容?Dockerfile
docker inspect *composed-container-name-here*
"NetworkSettings": {
"Bridge": "",
...
"Ports": {
"9200/tcp": null,
"9300/tcp": null
},
...
"IPAddress": "",
"Networks": {
"*composed-container-name-here*_default": {
"IPAMConfig": null,
...
"Gateway": "172.X.X.1",
"IPAddress": "172.X.X.3",
}
我尝试划分子网,docker-compose.yml
但它返回了Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets
。
运行 docker“引擎”是否需要sudo
在开发过程中不断地运行?你就是这么做的吗?你sudo -i
在操作docker的时候吗?或者你在 sudo 上设置计时器吗?有没有一种安全的方法可以更方便地操作它,例如启用密钥/通行证管理器?
背景
按照 Docker 网站的提示安装“桌面”(甚至“引擎”URL 端点也链接到桌面,尽管也是引擎),我遇到了一些情况,让我考虑仅在我的 Linux 上使用该引擎:
sudo
修复,尽管这是有风险的。sudo
。docker context ls
- 可以通过为同一 Docker 端点创建根用户上下文来解决。这让我更加意识到了 docker文档和论坛中描述的差异。
$ xhost
access control enabled, only authorized clients can connect
xterm
作品:
$ docker run --rm -it --network host \
--volume ~/.Xauthority:/root/.Xauthority:ro \
--env DISPLAY \
alpine:3.19 sh -euxc 'apk add xterm; exec xterm'
chromium
打开一个窗口,似乎接收到按键,但窗口是空的(输出):
$ docker run --rm -it --network host \
--volume ~/.Xauthority:/root/.Xauthority:ro \
--env DISPLAY \
alpine:3.19 sh -euxc 'apk add chromium; exec chromium --no-sandbox'
如果我允许本地连接,xhost
它就可以工作:
$ xhost +local:
$ xhost
access control enabled, only authorized clients can connect
LOCAL:
$ docker run --rm -it --network host \
--volume ~/.Xauthority:/root/.Xauthority:ro \
--env DISPLAY \
alpine:3.19 sh -euxc 'apk add chromium; exec chromium --no-sandbox'
$ xhost -local:
人们可以在这里推测它启动了无权访问的非根进程/root/.Xauthority
,这就是它失败的原因。那么在哪个用户下呢?这样我就可以提供.Xauthority
给所有感兴趣的各方。我该如何调试这个?我该如何让它发挥作用?
我制作了一个 fastAPI docker 容器,它运行良好,除非有 1 个命令...
我需要它在发生某些事件时重新启动另一个 docker 容器。
我有一个服务器[主机],正在运行docker,docker正在运行containerA(fastAPI)和containerB...
我怎样才能使containerA运行一个命令,使主机执行此命令:
docker重启containerB
注意,主机操作系统是linux。
我尝试使用python的 subprocess.run() ,但是它当然不起作用,containerA没有安装docker,所以它当然没有docker命令。
我读过文章说安装 unix 套接字可以工作,我尝试安装 '/var/run/docker.sock:/var/run/docker.sock' 但它不起作用。
如果您知道如何使其发挥作用,我将不胜感激。
谢谢。