我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。

理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。


当前回答

docker exec命令在运行中的容器中运行命令在多种情况下都有帮助。


Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

Options:
  -d, --detach               Detached mode: run command in the background
      --detach-keys string   Override the key sequence for detaching a
                             container
  -e, --env list             Set environment variables
  -i, --interactive          Keep STDIN open even if not attached
      --privileged           Give extended privileges to the command
  -t, --tty                  Allocate a pseudo-TTY
  -u, --user string          Username or UID (format:
                             [:])
  -w, --workdir string       Working directory inside the container

例如:

1)在bash中访问正在运行的容器文件系统:

docker exec -it containerId bash 

2)在bash中以root身份访问正在运行的容器文件系统,以获得所需的权限:

docker exec -it -u root containerId bash  

这对于能够在容器中作为根执行一些处理特别有用。

3)在bash中访问特定工作目录下运行的容器文件系统:

docker exec -it -w /var/lib containerId bash 

其他回答

这里有一些不同的方法……

A)使用docker exec(最简单)

Docker 1.3或更新版本支持exec命令,其行为类似于nsenter。该命令可以在已经运行的容器中运行新进程(容器必须已经运行PID 1进程)。你可以运行/bin/bash来查看容器状态:

docker exec -t -i mycontainer /bin/bash

参见Docker命令行文档

B)使用快照

你可以这样评估容器文件系统:

# find ID of your running container:
docker ps

# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot

# explore this filesystem using bash (for example)
docker run -t -i mysnapshot /bin/bash

通过这种方式,您可以在精确的时间时刻评估运行容器的文件系统。容器仍在运行,不包括未来的更改。

您可以稍后使用以下命令删除快照(运行容器的文件系统不受影响!):

docker rmi mysnapshot

C)使用ssh

如果你需要持续访问,你可以在容器中安装sshd并运行sshd守护进程:

 docker run -d -p 22 mysnapshot /usr/sbin/sshd -D
 
 # you need to find out which port to connect:
 docker ps

这样,你就可以使用ssh(连接并执行你想要的)运行你的应用程序。

D)使用nsenter

使用nsenter,参见为什么你不需要在Docker容器中运行SSHd

简短的版本是:使用nsenter,您可以将shell转换为 现有的容器,即使该容器不运行SSH或任何类型 特殊用途守护进程

容器的文件系统在docker的data文件夹中,通常在/var/lib/docker。要启动并检查正在运行的容器文件系统,请执行以下操作:

hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash

现在,当前的工作目录是容器的根目录。

在新版本的Docker上,你可以运行Docker exec [container_name],它在你的容器中运行一个shell

因此,要获得容器中所有文件的列表,只需运行docker exec [container_name] ls

docker exec命令在运行中的容器中运行命令在多种情况下都有帮助。


Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

Options:
  -d, --detach               Detached mode: run command in the background
      --detach-keys string   Override the key sequence for detaching a
                             container
  -e, --env list             Set environment variables
  -i, --interactive          Keep STDIN open even if not attached
      --privileged           Give extended privileges to the command
  -t, --tty                  Allocate a pseudo-TTY
  -u, --user string          Username or UID (format:
                             [:])
  -w, --workdir string       Working directory inside the container

例如:

1)在bash中访问正在运行的容器文件系统:

docker exec -it containerId bash 

2)在bash中以root身份访问正在运行的容器文件系统,以获得所需的权限:

docker exec -it -u root containerId bash  

这对于能够在容器中作为根执行一些处理特别有用。

3)在bash中访问特定工作目录下运行的容器文件系统:

docker exec -it -w /var/lib containerId bash 

更新:探索!

这个命令应该让你探索一个正在运行的docker容器:

docker exec -it name-of-container bash

在docker-compose中等价的是:

docker-compose exec web bash

(web是本例中的服务名称,默认情况下为tty。)

一旦你进去了:

ls -lsa

或任何其他bash命令,如:

cd ..

这个命令可以让你浏览docker映像:

docker run --rm -it --entrypoint=/bin/bash name-of-image

进入后:

ls -lsa

或任何其他bash命令,如:

cd ..

它代表互动…和遥控。


这个命令可以让你检查一个正在运行的docker容器或镜像:

Docker检查容器名称或映像

您可能想要这样做,并找出其中是否有bash或sh。在json返回中寻找entrypoint或cmd。

注意:这个答案依赖于常见的工具,但如果没有bash shell或常见的工具,如ls,你可以先在一个层中添加一个,如果你可以访问Dockerfile: 例如alpine:

RUN apk add --no-cache bash

否则,如果你无法访问Dockerfile,那么只需从新创建的容器中复制文件,并通过以下方式查看它们:

docker create <image>  # returns container ID the container is never started.
docker cp <container ID>:<source_path> <destination_path>
docker rm <container ID>
cd <destination_path> && ls -lsah

参见docker exec文档

参见docker-compose exec文档

参见docker inspect文档

参见docker创建文档