前言
Docker是一种流行的容器化平台,它能够快速构建、交付和运行应用程序。在使用Docker时,我们经常需要进入容器进行调试、管理和运行命令等操作。
进入 docker 容器需要执行以下步骤:打开终端窗口。使用 docker ps 命令查看正在运行的容器。使用 docker exec -it /bin/bash 命令进入容器,在容器内执行命令,使用 exit 命令退出容器。
一、使用docker exec进入Docker容器
进入 Docker 容器的步骤很简单,只需一条命令即可完成:
要在Docker容器中运行命令,您可以使用docker exec
命令。这里是一个基本的例子:
bash
docker exec -it <container_id_or_name> <command>
其中<container_id_or_name>
是您想要运行命令的容器的ID或名称,<command>
是您想要执行的命令。
例如,如果您想要在名为mycontainer
的容器中执行bash
shell,您可以使用:
bash
docker exec -it mycontainer bash
如果您想要在容器中运行一个不需要交互的命令,比如查看容器中的某个文件,您可以直接执行:
bash
docker exec mycontainer cat /path/to/file
这将在mycontainer
容器中执行cat /path/to/file
命令,并将结果直接输出到您的终端。
其他命令提示说明:
**识别容器名称:**使用以下命令查看正在运行的容器列表:
bash
docker ps
这将输出容器名称、镜像名称、启动时间等信息。
执行 exec 命令:使用 docker exec 命令进入容器。例如,要进入名为 "my-container" 的容器,可以使用以下命令:
bash
docker exec -it my-container /bin/bash
- -i 选项表示在容器中打开一个交互式会话。
- -t 选项表示为会话分配一个伪tty。
- /bin/bash 命令:/bin/bash 命令在容器中启动一个 bash 会话。
- **提示符:**成功进入容器后,您将在命令提示符中看到 root@。这表示您现在已作为 root 用户登录到容器中。
- **执行命令:**您现在可以在容器内执行命令,就像在普通 Linux 系统中一样。
- **退出容器:**要退出容器,只需键入 exit 命令即可。
二、使用docker attach进入Docker容器
接下来我们创建一个守护态的Docker容器,然后使用docker attach命令进入该容器。
bash
$ sudo docker run -itd ubuntu:xx.xx /bin/bash
然后我们使用docker ps查看到该容器信息,接下来就使用docker attach进入该容器
bash
$ sudo docker attach container_id
可以看到我们已经进入到该容器中了。但是,使用该命令有一个问题,当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。
因为这个原因,所以docker attach命令不太适合于生产环境,平时自己开发应用时可以使用该命令。
通常情况下,需要查看docker容器内stdout,会使用命令 docker attach container_id
来查看容器输出.但是不知道如何退出,使用Ctrl+c直接卡死。正确的退出方式应该用一个组合键 Ctrl+p Ctrl+q
然后容器会关闭,界面也可恢复。
三、使用nsenter进入Docker容器。
nsenter
是用来进入容器内部的一个命令,它的优势之处在于可以自己选择加载容器的哪些namespaces
可以直接选择yum安装
bash
$ yum install util-linux -y
也可以选择源码安装
系统默认将我们需要的nsenter安装到主机中
如果没有安装的话,按下面步骤安装即可(注意是主机而非容器或镜像)
具体的安装命令如下:
bash
$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
$ tar -xzvf util-linux-2.24.tar.gz
$ cd util-linux-2.24/
$ ./configure --without-ncurses
$ make nsenter
$ sudo cp nsenter /usr/local/bin
安装好nsenter之后可以查看一下该命令的使用。先使用--help
查看一下nsenter
的帮助信息
bash
$ nsenter --help
用法:
nsenter [options] <program> [<argument>...]
Run a program with namespaces of other processes.
选项:
-t, --target <pid> 要获取名字空间的目标进程
-m, --mount[=<file>] enter mount namespace
-u, --uts[=<file>] enter UTS namespace (hostname etc)
-i, --ipc[=<file>] enter System V IPC namespace
-n, --net[=<file>] enter network namespace
-p, --pid[=<file>] enter pid namespace
-U, --user[=<file>] enter user namespace
-S, --setuid <uid> set uid in entered namespace
-G, --setgid <gid> set gid in entered namespace
--preserve-credentials do not touch uids or gids
-r, --root[=<dir>] set the root directory
-w, --wd[=<dir>] set the working directory
-F, --no-fork 执行 <程序> 前不 fork
-Z, --follow-context set SELinux context according to --target PID
-h, --help 显示此帮助并退出
-V, --version 输出版本信息并退出
可以看到选项很多,但是大致上都是进入某个namespace
bash
--mount参数是进去到mount namespace中
--uts参数是进入到uts namespace中
--ipc参数是进入到System V IPC namaspace中
--net参数是进入到network namespace中
--pid参数是进入到pid namespace中
--user参数是进入到user namespace中
nsenter可以访问另一个进程的名称空间。所以为了连接到某个容器我们还需要获取该容器的第一个进程的PID。可以使用docker inspect命令来获取该PID。
四、docker inspect命令使用
bash
$ sudo docker inspect --help
inspect命令可以分层级显示一个镜像或容器的信息。使用docker ps 查看我们当前有一个正在运行的容器,可以使用docker inspect来查看该容器的详细信息。
bash
$ sudo docker inspect container_id
如果要显示该容器第一个进程的PID可以使用如下方式
bash
$ sudo docker inspect -f {{.State.Pid}} container_id
在获取到该进程PID之后我们就可以使用nsenter命令访问该容器了。
bash
$ sudo nsenter --target PID --mount --uts --ipc --net --pid
五、docker inspect : 获取容器/镜像的元数据。
语法
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
OPTIONS说明:
-f :指定返回值的模板文件。
-s :显示总的文件大小。
--type :为指定类型返回JSON。
实例
获取镜像mysql:5.6的元信息。(展示部分信息)
命令:xx@xx:~$ docker inspect mysql:5.6
html
[
{
"Id": "xx",
"RepoTags": [
"mysql:5.6"
],
"RepoDigests": [],
"Parent": "",
"Comment": "",
"Created": "xx",
"Container": "xx",
"ContainerConfig": {
"Hostname": "xx",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"3306/tcp": {}
},
...
获取正在运行的容器mysql02的 IP。
xx@xx:~$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql02
Docker 常用的命令集:
- docker version: 显示Docker版本
- docker info: 显示Docker信息
- docker attach: 挂载正在后台运行的容器到前台
- docker run: 在一个新的容器中执行命令 (Ctrl+p CTRL+q 退出至后台运行)
- docker ps: 列出当前容器
- docker images: 列出当前镜像
- docker logs: 显示容器的日志
- docker inspect: 显示镜像或容器的详细信息
- docker stop: 停止运行中的容器 (Ctrl+d 强制退出, exited (0)表示正常退出)
- docker kill: 杀掉一个运行中的容器 (exited (-1)表示异常退出)
- docker start: 重启停止的容器
- docker restart: 重启运行中的容器
- docker cp: 拷贝容器中的文件
- docker rm: 删除容器
- docker top: 查看容器输出
- docker events: 实时监听容器的事件
- docker history: 显示镜像的历史记录
- docker pull: 从远程拉取镜像
- docker diff: 列出镜像中文件和目录的变化
- docker commit: 将容器打包成新的镜像
- docker build: 使用Dockerfile构建新镜像
- docker tag: 为镜像加上标签
- docker load: 将tar压缩文件保存为image
- docker export: 把容器系统文件打包并导出来,方便分发给其他场景使用