我已经开始使用Docker了。我正在使用WordPress的基础镜像和docker-compose。
我正试图通过ssh进入其中一个容器来检查在初始构建过程中创建的文件/目录。我试着运行docker-compose run containername ls -la
,但是没有任何作用。即使它做了,我也希望有一个控制台,可以遍历目录结构,而不是运行一条命令。用Docker做这件事的正确方法是什么?
docker attach
将让你连接到你的Docker容器,但这与ssh
不是一回事。 例如,如果你的容器正在运行一个网络服务器,docker attach
可能会将你连接到网络服务器进程的stdout。 它不一定会给你一个shell。
docker exec
命令可能是你正在寻找的;这将让你在现有的容器中运行任意的命令。 比如说。
docker exec -it <mycontainer> bash
当然,无论你运行什么命令,都必须存在于容器的文件系统中。
在上面的命令中,<mycontainer>
是目标容器的名称或ID。 你是否使用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
$
比方说,由于你自己的原因,你真的想使用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
以下是一些相关资源。
注意。 这个答案推广了一个我写的工具。
我创建了一个容器化的SSH服务器,你可以将其'贴在任何运行的容器上。 贴到任何正在运行的容器上。 这样你就可以和每个容器一起创建组成。 唯一的要求是容器有Bash。
下面的例子将启动一个连接到容器上的 SSH 服务器,名称为 'my-container'。
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 客户端),一个 Bash 会话将在容器中启动,名称为 'my-container'。
更多的指针和文档请看。 https://github.com/jeroenpeeters/docker-ssh
在某些情况下,你的图像可能是基于阿尔卑斯山的。 在这种情况下,它会扔。
OCI运行时exec失败。 exec failed: container_linux.go:348: 启动
容器进程造成"exec: \&quot;bash&quot;。 可执行文件未在 $PATH": unknown
因为/bin/bash
并不存在。
你应该使用。
docker exec -it 9f7d99aa6625 ash
或
docker exec -it 9f7d99aa6625 sh
如果容器已经退出了(可能是由于一些错误),你可以做的是
$ 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时,容器将被删除。
安装 "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
这也解决了一个长期存在的【关于固定Docker容器终端大小的问题】[1]。 如果你面对它,这是非常烦人的。
另外如果你按照[链接][2],你'你的docker容器名称也会有命令完成。
[1]: https://stackoverflow.com/questions/38786615/docker-number-of-lines-in-terminal-changing-inside-docker [2]: https://stackoverflow.com/a/49281526/5284370
很简单!
列出你所有的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
我的PC上有两个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
使用。
docker attach <container name/id here>
另一种方法,虽然有危险,就是用attach
,但如果你Ctrl</kbd>。
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)
使用这个命令。
docker exec -it containerid /bin/bash
$ docker exec -it <Container-Id> /bin/bash
或者根据外壳的不同,它可以是
$ docker exec -it <Container-Id> /bin/sh
你可以通过docker ps
命令获得container-Id。
-i
=互动式
-t
=分配一个伪TTY。
如果你安装了Docker与Kitematic
,你可以使用GUI。
从Docker图标打开Kitematic
,在Kitematic
窗口中选择你的容器,然后点击exec
图标。
在这个GUI中,你也可以看到容器日志和很多容器信息(在设置选项卡中)。
[![从菜单中选择Kitematic][1]][1]。
[![点击执行][2]][2]
[1]: https://i.stack.imgur.com/CIUnq.jpg [2]: https://i.stack.imgur.com/GDdTz.jpg
我已经创建了一个终端功能,以便于访问容器的终端'。 也许它对你们也有用。
所以结果是,不需要输入:
docker exec -it [container_id] /bin/bash
你'会写。
dbash [container_id]
在你的 ~/.bash_profile 中加入以下内容(或者其他任何适合你的内容),然后打开一个新的终端窗口,享受这个快捷方式。
#usage: dbash [container_id]
dbash() {
docker exec -it "$1" /bin/bash
}