我开始和Docker合作了。我正在使用WordPress的基本图像和docker合成。
我正在尝试ssh到其中一个容器中,以检查在初始构建期间创建的文件/目录。我试着运行docker compose运行containername ls-la,但没有任何效果。即使是这样,我也希望有一个控制台,在那里我可以遍历目录结构,而不是运行一个命令。使用Docker的正确方法是什么?
我开始和Docker合作了。我正在使用WordPress的基本图像和docker合成。
我正在尝试ssh到其中一个容器中,以检查在初始构建期间创建的文件/目录。我试着运行docker compose运行containername ls-la,但没有任何效果。即使是这样,我也希望有一个控制台,在那里我可以遍历目录结构,而不是运行一个命令。使用Docker的正确方法是什么?
当前回答
2022年解决方案
考虑另一种选择
你为什么需要它?
有一堆基于发行版基本映像的现代docker映像(它们也没有/bin/bash/bin/sh),因此无法将exec-it{container name}bash嵌入其中。
如何在任何容器中剥壳
使用开启器:
需要在环境开启器wordpress中添加别名可以在任何地方运行docker run--rm-it-v/var/run/docker.sock:/var/run/dooker.sock artekaxboy/opener wordpress
您可以使用要连接的任何容器的名称、id或图像名称,而不是wordpress
它的工作原理
Opener是一组打包成docker图像的python脚本。它通过任何唯一属性(名称、id、端口、图像)查找目标容器,并尝试使用bash连接到目标。如果找不到bash,则开启器尝试使用sh进行连接。最后,如果找不找到sh,则任何一个开启器都会将busybox安装到目标容器中,并使用busybox shell连接到目标,在断开连接时,开启器会删除busybox。
其他回答
docker-attach将允许您连接到docker容器,但这实际上与ssh不同。例如,如果您的容器正在运行web服务器,docker附件可能会将您连接到web服务器进程的stdout。它不一定会给你一个外壳。
docker exec命令可能就是您所要的;这将允许您在现有容器中运行任意命令。例如:
docker exec -it <mycontainer> bash
当然,您正在运行的任何命令都必须存在于容器文件系统中。
在上面的命令中,<mycontainer>是目标容器的名称或ID。你是否使用docker compose并不重要;只需运行docker ps并使用ID(显示在第一列中的十六进制字符串)或名称(显示在最后一列中)。例如,给定:
$ docker ps
d2d4a89aaee9 larsks/mini-httpd "mini_httpd -d /cont 7 days ago Up 7 days web
我可以跑:
$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:3/64 scope link
valid_lft forever preferred_lft forever
我可以通过跑步来完成同样的事情:
$ docker exec -it d2d4a89aaee9 ip addr
类似地,我可以在容器中启动一个shell;
$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
要检查文件,请运行docker run-it<image>/bin/sh以获得交互式终端。图像列表可以通过docker图像获得。与docker exec相反,这种解决方案也适用于图像未启动(或运行后立即退出)的情况。
要猛击正在运行的容器,请键入以下命令:
docker exec -t -i container_name /bin/bash
or
docker exec -ti container_name /bin/bash
or
docker exec -ti container_name sh
很简单!
列出所有Docker图像:
sudo docker images
在我的系统上,它显示了以下输出:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
bash latest 922b9cc3ea5e 9 hours ago
14.03 MB
ubuntu latest 7feff7652c69 5 weeks ago 81.15 MB
我的电脑上有两个Docker映像。假设我想运行第一个。
sudo docker run -i -t ubuntu:latest /bin/bash
这将为您提供容器的终端控制。现在,您可以在容器内执行所有类型的shell操作。像这样ls将输出文件系统根目录中的所有文件夹。
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
根据目标,至少有2个选项。
选项1:创建一个新的bash进程并加入其中(更简单)
示例开始:docker exec-it<containername>/bin/bash退出:键入退出专业版:适用于所有容器(不取决于CMD/Entrypoint)Contra:创建具有自己会话和环境变量的新进程
选项2:连接到已经运行的bash(更好)
示例开始:docker attach--detach keys ctrl-d<containername>退出:使用ctrl和d键Pro:加入容器中完全相同的运行bash。您具有相同的会话和相同的环境变量。Contra:仅当CMD/Entrypoint是一个交互式bash,如CMD[“/bin/bash”]或CMD[“/bin/bash”,“--init file”,“myfile.sh”],并且容器已使用docker run-itd<image>(-i=interactive,-t=tty和-d=deamon[opt])等交互式选项启动时才有效
我们发现选项2更有用。例如,我们将apache2前景更改为普通背景apache2,然后启动bash。