首页 文章

我如何进入Docker容器?

提问于
浏览
669

我开始使用Docker了 . 我正在使用WordPress基本图像和docker-compose .

我正在尝试ssh到其中一个容器中来检查在初始构建期间创建的文件/目录 . 我试图运行 docker-compose run containername ls -la ,但是没有't do anything. Even if it did, I' d而是有一个控制台,我可以遍历目录结构,而不是运行单个命令 . 使用Docker执行此操作的正确方法是什么?

21 回答

  • 3

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

    docker exec -it d8c25fde2769 cmd
    

    其中 d8c25fde2769 是容器ID .

  • 0

    Notice :这个答案促进了我写的工具 .

    我已经创建了一个容器化的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

  • 1049

    It is simple

    列出所有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
    
  • 4

    使用:

    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)
    
  • 10

    在某些情况下,您的图像可以基于阿尔卑斯山 . 在这种情况下,它将抛出:

    OCI运行时exec失败:exec失败:container_linux.go:348:启动容器进程导致“exec:\”bash \“:$ PATH中找不到可执行文件”:unknown

    因为 /bin/bash 不存在 . 而不是这个你应该使用:

    docker exec -it 9f7d99aa6625 ash
    

    要么

    docker exec -it 9f7d99aa6625 sh
    
  • 63

    要检查文件,请运行 docker run -it <image> /bin/bash 以获取交互式终端 . 图像列表可以通过 docker images 获得 . 与 docker exec 相反,此解决方案也适用于图像未启动(或运行后立即退出)的情况 .

  • 16

    如果您正在寻找像我一样的Docker Compose特定答案,它提供了一种简单的方法,而无需查找生成的容器ID .

    docker-compose exec 根据 docker-compose.yml 文件获取服务名称 .

    因此,要为您的“网络”服务获取Bash shell,您可以执行以下操作:

    $ docker-compose exec web bash
    
  • 14

    如果您使用 Kitematic 安装了Docker,则可以使用GUI . 从Docker图标打开 Kitematic ,在 Kitematic 窗口中选择您的容器,然后单击 exec 图标 .

    您也可以在此GUI中查看容器日志和许多容器信息(在设置选项卡中) .

    Select Kitematic from menu

    Click on exec

  • 12

    docker exec 绝对是一个解决方案 . 处理您提出的问题的简单方法是 mounting the directory inside Docker to the local system's directory .

    这样您就可以立即查看本地路径中的更改 .

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

    使用此命令:

    docker exec -it containerid /bin/bash
    
  • 5

    如果容器已经退出(可能由于某些错误),您可以这样做

    $ 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时将删除容器 .

  • 5

    如果您在Windows上使用Docker并希望获得对容器的shell访问权限,请使用以下命令:

    winpty docker exec -it <container_id> sh
    

    最有可能的是,您已经安装了Git Bash . If you don't, make sure to install it.

  • 4

    让我们说,由于您自己的原因,您确实想要使用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
    

    以下是一些相关资源:

  • 4

    如果您使用Docker Compose,那么这将带您进入Docker容器 .

    docker-compose run container_name /bin/bash
    

    在容器内部,它将带您到Dockerfile中定义的WORKDIR . 您可以通过更改工作目录

    WORKDIR directory_path # E.g  /usr/src -> container's path
    
  • 3

    另一种选择是使用nsenter .

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

    就我而言,由于某些原因,我需要检查每个容器中涉及的所有网络信息 . 所以以下命令必须在容器中有效...

    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 .

    • 现在您可以执行 ip netns exec xxxx ip addr show 来探索容器中的网络世界 .

    PS . xxxx 始终是通过第一个命令获得的相同值 . 当然,任何其他命令都是有效的,即 ip netns exec xxxx netstat -antp|grep 8080 .

  • 0

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

    docker exec 命令可能就是你要找的;这将允许您在现有容器中运行任意命令 . 例如:

    docker exec -it <mycontainer> bash
    

    当然,您运行的任何命令都必须存在于容器文件系统中 .

    在上面的命令中, <mycontainer> 是目标容器的名称或ID . 它没有't matter whether or not you'重新使用 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
    $
    
  • -3

    对于docker-compose up(Docker4Drupal)

    docker-compose exec php bash
    

    我在Linux笔记本电脑上使用Docker for Drupal . 运行容器后,我使用' docker-compose exec php bash '连接容器,这样我就可以运行drush突击队了 . 这对我来说可以 .

  • 0

    使用以下命令SSH到Docker容器中:

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

    GOINSIDE SOLUTION

    安装 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容器名称也将完成命令 .

  • 0

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

    docker exec -t -i container_name /bin/bash
    

相关问题