我如何进入Docker容器的shell?

本文翻译自:How do I get into a Docker container's shell?

I'm getting started working with Docker. 我开始使用Docker了。 I'm using the WordPress base image and docker-compose. 我正在使用WordPress基本图像和docker-compose。

I'm trying to ssh into one of the containers to inspect the files/directories that were created during the initial build. 我正在尝试ssh到其中一个容器中来检查在初始构建期间创建的文件/目录。 I tried to run docker-compose run containername ls -la , but that didn't do anything. 我试图运行docker-compose run containername ls -la ,但是没有做任何事情。 Even if it did, I'd rather have a console where I can traverse the directory structure, rather than run a single command. 即使它确实如此,我宁愿有一个控制台,我可以遍历目录结构,而不是运行单个命令。 What is the right way to do this with Docker? 使用Docker执行此操作的正确方法是什么?


#1楼

参考:https://stackoom.com/question/22bGv/我如何进入Docker容器的shell


#2楼

docker attach will let you connect to your Docker container, but this isn't really the same thing as ssh . docker attach会让你连接到你的Docker容器,但这与ssh不是一回事。 If your container is running a webserver, for example, docker attach will probably connect you to the stdout of the web server process. 例如,如果您的容器正在运行Web服务器,则docker attach可能会将您连接到Web服务器进程的stdout It won't necessarily give you a shell. 它不一定会给你一个shell。

The docker exec command is probably what you are looking for; docker exec命令可能就是你要找的东西; this will let you run arbitrary commands inside an existing container. 这将允许您在现有容器中运行任意命令。 For example: 例如:

docker exec -it <mycontainer> bash

Of course, whatever command you are running must exist in the container filesystem. 当然,您运行的任何命令都必须存在于容器文件系统中。

In the above command <mycontainer> is the name or ID of the target container. 在上面的命令中, <mycontainer>是目标容器的名称或ID。 It doesn't matter whether or not you're using docker compose ; 你是否使用docker compose并不重要; just run docker ps and use either the ID (a hexadecimal string displayed in the first column) or the name (displayed in the final column). 只需运行docker ps并使用ID(第一列中显示的十六进制字符串)或名称(显示在最后一列中)。 Eg, given: 例如,给出:

$ docker ps
d2d4a89aaee9        larsks/mini-httpd   "mini_httpd -d /cont   7 days ago          Up 7 days                               web                 

I can run: 我可以跑:

$ 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

I could accomplish the same thing by running: 我可以通过运行来完成同样的事情:

$ docker exec -it d2d4a89aaee9 ip addr

Similarly, I could start a shell in the container; 同样,我可以在容器中启动一个shell;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$

#3楼

Another option is to use nsenter . 另一种选择是使用nsenter

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

#4楼

docker exec will definitely be a solution. docker exec绝对是一个解决方案。 An easy way to work with the question you asked is by mounting the directory inside Docker to the local system's directory . 处理您提出的问题的一种简单方法是将Docker中的目录挂载到本地系统的目录中

So that you can view the changes in local path instantly. 这样您就可以立即查看本地路径中的更改。

docker run -v /Users/<path>:/<container path> 

#5楼

Notice : this answer promotes a tool I've written. 注意 :这个答案促进了我写的工具。

I've created a containerized SSH server that you can 'stick' to any running container. 我已经创建了一个容器化的SSH服务器,您可以“粘贴”任何正在运行的容器。 This way you can create compositions with every container. 这样您就可以为每个容器创建合成。 The only requirement is that the container has Bash. 唯一的要求是容器有Bash。

The following example would start an SSH server attached to a container with name 'my-container'. 以下示例将启动连接到名为“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

When you connect to this SSH service (with your SSH client of choice) a Bash session will be started in the container with name 'my-container'. 当您连接到此SSH服务(使用您选择的SSH客户端)时,将在名为“my-container”的容器中启动Bash会话。

For more pointers and documentation see: https://github.com/jeroenpeeters/docker-ssh 有关更多指示和文档,请参阅: https//github.com/jeroenpeeters/docker-ssh


#6楼

要打入正在运行的容器,请键入:

docker exec -t -i container_name /bin/bash
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值