docker如何启动并连入一个已有的容器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker如何启动并连入一个已有的容器相关的知识,希望对你有一定的参考价值。
参考技术A 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 中。Docker:如何启动现有容器并转发端口?
【中文标题】Docker:如何启动现有容器并转发端口?【英文标题】:Docker: How to start an existing container and forward the ports? 【发布时间】:2018-12-30 07:08:12 【问题描述】:我是 docker 新手,我正在尝试启动 Rancher 的永久安装。要创建 docker 容器,我运行以下命令:
docker run -d --name rancher-server -p 8080:8080 rancher/server
注意,我想将容器的8080端口转发到我主机的8080,因为80被我主机上的nginx占用了。
现在,当我停止上述容器并尝试使用 docker start <Container ID>
再次启动它时,我收到以下错误:
Error response from daemon: driver failed programming external connectivity on endpoint rancher-server (c18940f957ed1f737fd5453ea29755adea762d758643a64984d5e3ce8bd3fdbe): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use
Error: failed to start containers: c93794a8c0ad
我知道这是因为 nginx 使用了 80 端口,所以我的问题是如何启动我现有的容器并告诉它转发其端口?
运行docker start -d -p 8080:8080 c93794a8c0ad
给我以下错误:unknown shorthand flag: 'd' in -d
那么如何启动一个带有转发端口的容器呢?谢谢!
【问题讨论】:
【参考方案1】:要更改端口映射,您需要删除并重新创建容器。所以docker rm
你现有的容器然后docker run
它与新的端口设置。
【讨论】:
感谢您的回答!我不想更改映射,我想使用相同的映射运行我的容器,但是当我尝试使用docker start <ContainerID>
启动它时,我收到了问题中描述的错误。有什么想法吗?
该错误消息告诉我您之前使用docker run -p 80:8080
启动了它。 docker ps
肯定会告诉你的。
当我运行 docker ps
时没有运行容器,因为我确保我之前已经运行过 docker stop
(或者重新启动了我的服务器,这实际上是我正在尝试修复的情况这里)。容器在创建后是否应该已经转发了它的端口?如果是这样,为什么我无法再次启动它?我再说一遍,运行docker ps
表明没有容器在运行。
您无法更改现有容器上的端口映射。 docker ps -a
也会显示停止的容器。
好的,我猜当时还有其他事情发生,因为我无法启动已停止的容器。我不想更改端口,我只想重新启动它。但是我得到了上面描述的错误(端口 80 已经在使用中),所以我猜容器在我第一次创建它时没有按预期使用端口 8080【参考方案2】:
我删除了容器并使用 Rancher 文档推荐的命令 sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server
创建了一个新容器,现在在正确的端口上按预期停止和启动容器工作。我不知道以前是什么问题,但现在可以了。
【讨论】:
【参考方案3】:问题可能是两个程序在同一个端口上工作。
您可以在运行docker run
命令时更改端口设置。
例如,您可以将容器的端口8080
与您计算机上的任意端口绑定,例如8081
:
docker run -d --name rancher-server -p 8081:8080 rancher/server
左侧端口号是 docker host 端口 - 您的计算机 - 右侧是 docker container 端口。
您可以修改端口
您可以change the ports docker 容器而不删除它。就像quin452 所说的那样——稍作修改:
获取容器ID:
docker ps -a
停止容器:
docker stop [container name]
编辑容器hostconfig.json
文件,位于
var/lib/docker/containers/[container ID]/hostconfig.json
在PortBindings
部分中,
将现有的HostPort
编辑到您想要的端口,
或自己添加(见下文)
保存并退出配置文件
重启泊坞窗:
sudo systemctl restart docker
启动容器:
docker start [container name]
一个示例配置文件:
"PortBindings":
"3306/tcp": [
"HostIp": "",
"HostPort": "23306"
],
"443/tcp": [
"HostIp": "",
"HostPort": "2443"
],
"80/tcp": [
"HostIp": "",
"HostPort": "280"
]
【讨论】:
以上是关于docker如何启动并连入一个已有的容器的主要内容,如果未能解决你的问题,请参考以下文章