一个请求会进入多个docker容器吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个请求会进入多个docker容器吗相关的知识,希望对你有一定的参考价值。

参考技术A docker类式于为沙盒中运行的线程,可以看做是一个简易的linux系统,容器的ID与名称都是唯一的,可以通过ID的前3位进行访问这个容器,Docker 使用一个叫做 UnionFS 的层级文件系统进行镜像操作。容器对镜像文件的所有操作均是在虚拟出的“改动层”上进行的,与docker相关的本地资源都放在/var/lib/docker/目录下。Docker的理念是一个容器只运行一个服务,从宿主机进入容器是通过exec命令进去的,但是如果要从远程进入,除了给容器安装相应的ssh服务,目前没有更好的办法。

如何打开多个终端进入Docker容器

Docker容器运行后,如何进入容器进行操作呢?起初我是用SSH。如果只启动一个容器,用SSH还能应付,只需要将容器的22端口映射到本机的一个端口即可。当我启动了五个容器后,每个容器默认是没有配置SSH Server的,安装配置SSHD,映射容器SSH端口,实在是麻烦。 我发现很多Docker镜像都是没有安装SSHD服务的,难道有其他方法进入Docker容器?
有很多种方法,包括使用 docker attach 命令或 nsenter 工具等。
使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。
nsenter 可以访问另一个进程的名字空间。
为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。
PID=$(docker inspect –format “ .State.Pid ” <container>) //将<container>换成你的容器id
通过这个 PID,就可以连接到这个容器:
$ nsenter –target $PID –mount –uts –ipc –net –pid
更简单的,建议大家下载 .bashrc_docker,并将内容放到 .bashrc 中。
$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
$ echo “[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker” >> ~/.bashrc; source ~/.bashrc
这个文件中定义了很多方便使用 Docker 的命令,例如 docker-pid 可以获取某个容器的 PID;而 docker-enter 可以进入容器或直接在容器内执行命令。
$ echo $(docker-pid <container>)
$ docker-enter <container>
附.bashrc_docker文件内容:
# Some useful commands to use docker.
# Author: yeasy@github
# Created:2014-09-25
alias docker-pid=”sudo docker inspect –format ‘.State.Pid’”
alias docker-ip=”sudo docker inspect –format ‘ .NetworkSettings.IPAddress ’”
#the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enter
function docker-enter()
if [ -e $(dirname "$0")/nsenter ]; then
# with boot2docker, nsenter is not in the PATH but it is in the same folder
NSENTER=$(dirname “$0″)/nsenter
else
NSENTER=nsenter
fi
[ -z "$NSENTER" ] && echo “WARN Cannot find nsenter” && return
if [ -z "$1" ]; then
echo “Usage: `basename “$0″` CONTAINER [COMMAND [ARG]…]”
echo “”
echo “Enters the Docker CONTAINER and executes the specified COMMAND.”
echo “If COMMAND is not specified, runs an interactive shell in CONTAINER.”
else
PID=$(sudo docker inspect –format “.State.Pid” “$1″)
if [ -z "$PID" ]; then
echo “WARN Cannot find the given container”
return
fi
shift
OPTS=”–target $PID –mount –uts –ipc –net –pid”
if [ -z "$1" ]; then
# No command given.
# Use su to clear all host environment variables except for TERM,
# initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
# and start a login shell.
#sudo $NSENTER “$OPTS” su – root
sudo $NSENTER –target $PID –mount –uts –ipc –net –pid su – root
else
# Use env to clear all host environment variables.
sudo $NSENTER –target $PID –mount –uts –ipc –net –pid env -i $@
fi
fi
参考技术A

打开多个终端进入Docker容器有很多种方法,包括使用 docker attach 命令或 nsenter 工具等。

使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。

nsenter 可以访问另一个进程的名字空间。

为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。

PID=$(docker inspect –format “ .State.Pid ” <container>) //将<container>换成你的容器id

通过这个 PID,就可以连接到这个容器:

$ nsenter –target $PID –mount –uts –ipc –net –pid

更简单的,建议大家下载 .bashrc_docker,并将内容放到 .bashrc 中。

$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;

$ echo “[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker” >> ~/.bashrc; source ~/.bashrc

这个文件中定义了很多方便使用 Docker 的命令,例如 docker-pid 可以获取某个容器的 PID;而 docker-enter 可以进入容器或直接在容器内执行命令。

$ echo $(docker-pid <container>)

$ docker-enter <container>

附.bashrc_docker文件内容:

# Some useful commands to use docker.

# Author: yeasy@github

# Created:2014-09-25

alias docker-pid=”sudo docker inspect –format ‘.State.Pid’”

alias docker-ip=”sudo docker inspect –format ‘ .NetworkSettings.IPAddress ’”

#the implementation refs from https://github.com/jpetazzo/nsenter/blob/master/docker-enter

function docker-enter()

if [ -e $(dirname "$0")/nsenter ]; then

# with boot2docker, nsenter is not in the PATH but it is in the same folder

NSENTER=$(dirname “$0″)/nsenter

else

NSENTER=nsenter

fi

[ -z "$NSENTER" ] && echo “WARN Cannot find nsenter” && return

if [ -z "$1" ]; then

echo “Usage: `basename “$0″` CONTAINER [COMMAND [ARG]…]”

echo “”

echo “Enters the Docker CONTAINER and executes the specified COMMAND.”

echo “If COMMAND is not specified, runs an interactive shell in CONTAINER.”

else

PID=$(sudo docker inspect –format “.State.Pid” “$1″)

if [ -z "$PID" ]; then

echo “WARN Cannot find the given container”

return

fi

shift

OPTS=”–target $PID –mount –uts –ipc –net –pid”

if [ -z "$1" ]; then

# No command given.

# Use su to clear all host environment variables except for TERM,

# initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,

# and start a login shell.

#sudo $NSENTER “$OPTS” su – root

sudo $NSENTER –target $PID –mount –uts –ipc –net –pid su – root

else

# Use env to clear all host environment variables.

sudo $NSENTER –target $PID –mount –uts –ipc –net –pid env -i $@

fi

fi

参考技术B 用 docker ps 找到你要进入的container的 id,然后用 docker exec 执行一个 bash

如:docker exec -it 40c330755e61 /bin/bash
这样你就进到这个container 里面了,这个bash退出也不会影响之前 docker run 启动的 bash
如果需要其他参数可以参考docker 手册 man docker-exec ,man docker-run 等等

以上是关于一个请求会进入多个docker容器吗的主要内容,如果未能解决你的问题,请参考以下文章

Docker部署Rstudio Server【三】:docker容器管理初步

06-Docker-容器数据卷

【容器】关于docker容器中的init进程

docker link

我想要一个容器处理多个请求吗?

docker桥接模式