如何进入docker集装箱?

我正在开始与Docker合作。 我正在使用WordPress的基本形象和docker构成。 我试图ssh到一个容器来检查在初始构build过程中创build的文件/目录。 我试图运行docker-compose run containername ls -la但是没有做任何事情。 即使这样做,我宁愿有一个控制台,我可以遍历目录结构,而不是运行一个命令。 什么是正确的方式与Docker做到这一点?

docker attach会让你连接到你的Docker容器,但是这跟ssh不是一回事。 例如,如果您的容器正在运行Web服务器,则docker attach可能会将您连接到Web服务器进程的stdout 。 它不一定会给你一个壳。

docker exec命令可能是你在找什么; 这将允许您在现有容器内运行任意命令。 例如:

 docker exec -it <mycontainer> bash 

当然,无论你运行的是什么命令,都必须存在于容器文件系统中。

在上述命令中, <mycontainer>是目标容器的名称或ID。 无论你是否使用docker compose都没关系; 只需运行docker ps并使用ID(第一列中显示的hexstring)或名称(显示在最后一列中)。 例如,给定:

 $ 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 exec -t -i container_name /bin/bash 

比方说,由于你自己的原因,你真的想要使用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客户端来运行graphics应用程序(如果它们安装在容器中):

 ssh -X username@IPADDRESS xeyes ## run an X11 demo app in the client 

这里有一些相关的资源:

  • openssh-server不能在Docker容器中启动
  • 如何获得背景模式下的运行容器bash或ssh?
  • 你可以在Docker容器中运行GUI应用程序吗?
  • 其他有用的方法为graphics访问find与search:dockerx11
  • 如果你在你的Docker容器中运行SSHD,你做错了!

注意 :这个答案提供了一个我写的工具。

我创build了一个容器化的SSH服务器,可以“粘”到任何正在运行的容器。 这样你可以创build每个容器的作品。 唯一的要求是容器有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服务(用你select的SSH客户端)时,将在名为“my-container”的容器中启动一个Bash会话。

有关更多指针和文档,请参阅: https : //github.com/jeroenpeeters/docker-ssh

使用以下命令SSH进入Docker容器:

 sudo docker exec -i -t (container ID) bash 

以下简单的命令应该带你进入Docker容器。 将<container-id>replace为真实的docker容器ID。

 sudo docker exec -it <container-id> /bin/bash 

docker exec肯定会是一个解决scheme。 处理所问问题的简单方法是将Docker中的目录挂载到本地系统的目录中

这样您就可以即时查看本地path中的更改。

 docker run -v /Users/<path>:/<container path> 
 docker attach <container name/id here> 

另一种方式,尽pipe是使用附加的危险,但如果你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) 

如果你在Windows上使用Docker并想获得对容器的shell访问权限,可以使用下面的命令:

 winpty docker exec -it <container_id> sh 

最有可能的是,你已经安装了Git Bash 。 如果你不这样做,一定要安装它。

检查文件运行docker run -it <image> /bin/bash得到交互式terminal。 docker images可以获取docker images 。 与docker exec相反,这种解决scheme也适用于图像不启动的情况(或者在运行之后立即退出)。

另一个select是使用nsenter 。

 PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>) nsenter --target $PID --mount --uts --ipc --net --pid 

要连接到Windows容器中的cmd,请使用

docker exec -it d8c25fde2769 cmd

请执行下列操作

 docker exec -it containername/id 

对于docker-up(Docker4Drupal)

docker-compose exec php bash