对于运行的docker容器,我们有三种方式进入docker容器内部,但三种方式存在不同的区别,且在生成环境中,慎用进入docker的方式非常有必要

1、docker attach进入docker容器

对于运行在后台的docker容器,我们经常需要做的事情是进入到容器中,docker为我们提供了docker attach命令,通过docker attach进入mydocker容器

docker attach mydocker----语法:docker  attach 镜像名字

图片.png

PS:docker attach存在的问题是,当多个窗口同时attach到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞,docker attach命令可以说是最不方便的进入后台docker容器的方法,当采用docker attach进入容器退出时,docker容器也就EXIT了,因此在生产环境中,不推荐使用docker attach


2、nsenter进入容器

采用nsenter进入容器,需要采用yum安装util-linux:yum -y install util-linux

图片.png

nsenter进入容器需要通过容器的PID进入,因此要通过docker inspect找到docker运行的PID,注意:如果docker没有运行,采用docker inspect找到的PID为0

docker inspect : 获取容器/镜像的元数据。

图片.png

获取docker 容器的PID可以采用format获取:docker inspect --format "{{.State.pid}}" mydocker

图片.png

进入docker:nsenter --target 30257 --mount --uts --ipc --net --pid

解释nsenter指令中进程id之后的参数的含义:
* –mount参数是进去到mount namespace中
* –uts参数是进入到uts namespace中
* –ipc参数是进入到System V IPC namaspace中
* –net参数是进入到network namespace中
* –pid参数是进入到pid namespace中
* –user参数是进入到user namespace中

在Linux中,最爱简单的查看指定命令参数含义的办法是在终端中输入:
$ nsenter --help  #会回显所有与该命令有关的参数
$ man nsenter  #能查到更加详细的使用示例和参数说明


在实际环境中可编写脚本,通过传输docker镜像的名字进入容器,脚本docker_in.sh如下

#!/bin/bash
docker_in() {
        Docker_name=$1
        Docker_pid=$(docker inspect --format "{{.State.Pid}}" $Docker_name)
        nsenter --target $Docker_pid --mount --uts --ipc --net --pid 
}
docker_in $1

此方法在生产环境中推荐使用


3、docker exec进入容器

docker在1.3.X版本之后还提供了一个新的命令exec用于进入容器,这种方式相对更简单一些

图片.png

4、关于docker容器命令,汇总如下

图片.png