我开始使用Docker了。我正在使用WordPress基本图像和docker-compose。
我正在尝试ssh到其中一个容器中来检查在初始构建期间创建的文件/目录。我试图运行docker-compose run containername ls -la
,但那没有做任何事情。即使它确实如此,我宁愿有一个控制台,我可以遍历目录结构,而不是运行单个命令。使用Docker执行此操作的正确方法是什么?
docker attach
会让你连接到你的Docker容器,但这与ssh
不是一回事。例如,如果您的容器正在运行Web服务器,则docker attach
可能会将您连接到Web服务器进程的stdout。它不一定会给你一个shell。
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 --rm -it --entrypoint /bin/ash image_name
要么
$ docker run --rm -it --entrypoint /bin/sh image_name
要么
$ docker run --rm -it --entrypoint /bin/bash image_name
创建一个新容器并获取一个shell。由于您指定了-rm,因此在退出shell时将删除容器。
安装goinside
命令行工具:
sudo npm install -g goinside
并进入具有适当终端尺寸的docker容器内:
goinside docker_container_name
我们把这个片段放在~/.profile
中:
goinside(){
docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside
这不仅使每个人都能够进入一个正在运行的容器中:
goinside containername
它也解决了长寿problem about fixed Docker container terminal sizes。如果你面对它,这是非常烦人的。
此外,如果您关注the link,您也可以完成Docker容器名称的命令完成。
很简单!
列出所有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
使用此命令:
docker exec -it containerid /bin/bash
docker exec
绝对是一个解决方案。处理您提出的问题的一种简单方法是将Docker中的目录挂载到本地系统的目录中。
这样您就可以立即查看本地路径中的更改。
docker run -v /Users/<path>:/<container path>
使用:
docker attach <container name/id here>
另一种方式,虽然有危险,但是使用attach
,但是如果你按Ctrl + C退出会话,你也将停止容器。如果你只是想看看发生了什么,请使用docker logs -f
。
:~$ docker attach --help
Usage: docker attach [OPTIONS] CONTAINER
Attach to a running container
Options:
--detach-keys string Override the key sequence for detaching a container
--help Print usage
--no-stdin Do not attach STDIN
--sig-proxy Proxy all received signals to the process (default true)
要检查文件,请运行docker run -it <image> /bin/bash
以获取交互式终端。图像列表可以通过docker images
获得。与docker exec
相反,此解决方案也适用于图像未启动(或运行后立即退出)的情况。
$ docker exec -it <Container-Id> /bin/bash
或者取决于外壳,它可以
$ docker exec -it <Container-Id> /bin/sh
您可以通过docker ps
命令获取container-Id
-i
=互动
qazxsw poi =分配一个伪TTY
就我而言,由于某些原因,我需要检查每个容器中所有涉及网络的信息。所以以下命令必须在容器中有效...
-t
我检查了所有这些答案,没有人对我有帮助。我在其他网站上搜索过信息。我不会在这里添加超级链接,因为它不是用英文写的。所以我只是为那些与我有相同要求的人提供一个摘要解决方案。
假设您有一个名为light-test的正在运行的容器。请按照以下步骤操作。
ip
route
netstat
ps
...
。这个命令会像docker inspect light-test -f {{.NetworkSettings.SandboxKey}}
一样得到回复。/var/run/docker/netns/xxxx
。目录可能不存在,先做ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx
。mkdir /var/run/netns
来探索容器中的网络世界。PS。 ip netns exec xxxx ip addr show
始终是从第一个命令收到的相同值。当然,任何其他命令都是有效的,即xxxx
。
要打入正在运行的容器,请键入:
docker exec -t -i container_name /bin/bash
您可以通过传递选项-ti与docker容器中的终端进行交互
ip netns exec xxxx netstat -antp|grep 8080
-t代表终端-i代表交互式
我已经创建了一个终端功能,可以更方便地访问容器的终端。也许它对你们有用:
结果是,而不是输入:
docker run --rm -ti <image-name>
eg: docker run --rm -ti ubuntu
你会写:
docker exec -it [container_id] /bin/bash
将以下内容放在〜/ .bash_profile(或其他适合您的方法)中,然后打开一个新的终端窗口并享受快捷方式:
dbash [container_id]
另一种选择是使用#usage: dbash [container_id]
dbash() {
docker exec -it "$1" /bin/bash
}
。
nsenter
如果您使用Docker Compose,那么这将带您进入Docker容器。
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
在容器内部,它将带您到Dockerfile中定义的WORKDIR。您可以通过更改工作目录
docker-compose run container_name /bin/bash
对于docker-compose up(Docker4Drupal)
WORKDIR directory_path # E.g /usr/src -> container's path
我在Linux笔记本电脑上使用docker-compose exec php bash
。运行容器后,我使用'Docker for Drupal'连接容器,这样我就可以运行drush突击队了。这对我来说可以。
让我们说,由于你自己的原因,你真的想要使用SSH。它需要几个步骤,但它可以完成。以下是您将在容器内运行以进行设置的命令...
apt-get update
apt-get install openssh-server
mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd
useradd --create-home --shell /bin/bash --groups sudo username ## includes 'sudo'
passwd username ## Enter a password
apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk '/inet addr/{print substr($2,6)}' ## Display IP address (optional)
现在,您甚至可以使用X11转发到SSH客户端来运行图形应用程序(如果它们安装在容器中):
ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client
以下是一些相关资源:
注意:这个答案促进了我写的工具。
我已经创建了一个容器化的SSH服务器,您可以“粘贴”任何正在运行的容器。这样您就可以为每个容器创建合成。唯一的要求是容器有Bash。
以下示例将启动连接到名为“my-container”的容器的SSH服务器。
docker run -d -p 2222:22 \
-v /var/run/docker.sock:/var/run/docker.sock \
-e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
jeroenpeeters/docker-ssh
ssh localhost -p 2222
当您连接到此SSH服务(使用您选择的SSH客户端)时,将在名为“my-container”的容器中启动Bash会话。
有关更多指针和文档,请参阅:https://github.com/jeroenpeeters/docker-ssh
如果您正在寻找像我一样的Docker Compose特定答案,它提供了一种简单的方法,而无需查找生成的容器ID。
docker-compose exec
根据您的docker-compose.yml
文件获取服务名称。
因此,要为您的“网络”服务获取Bash shell,您可以执行以下操作:
$ docker-compose exec web bash
如果您在Windows上使用Docker并希望获得对容器的shell访问权限,请使用以下命令:
winpty docker exec -it <container_id> sh
最有可能的是,你已经安装了Git Bash。如果不这样做,请确保安装它。
使用以下命令SSH到Docker容器中:
sudo docker exec -i -t (container ID) bash
在某些情况下,您的图像可以基于阿尔卑斯山。在这种情况下,它将抛出:
OCI运行时exec失败:exec失败:container_linux.go:348:启动容器进程导致“exec:\”bash \“:$ PATH中找不到可执行文件”:未知
因为/bin/bash
不存在。而不是这个你应该使用:
docker exec -it 9f7d99aa6625 ash
要么
docker exec -it 9f7d99aa6625 sh
要连接到Windows容器中的cmd,请使用
docker exec -it d8c25fde2769 cmd
其中d8c25fde2769是容器ID。