对于运行的docker容器,我们有三种方式进入docker容器内部,但三种方式存在不同的区别,且在生成环境中,慎用进入docker的方式非常有必要
1、docker attach进入docker容器
对于运行在后台的docker容器,我们经常需要做的事情是进入到容器中,docker为我们提供了docker attach命令,通过docker attach进入mydocker容器
docker attach mydocker----语法:docker attach 镜像名字
PS:docker attach存在的问题是,当多个窗口同时attach到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞,docker attach命令可以说是最不方便的进入后台docker容器的方法,当采用docker attach进入容器退出时,docker容器也就EXIT了,因此在生产环境中,不推荐使用docker attach
2、nsenter进入容器
采用nsenter进入容器,需要采用yum安装util-linux:yum -y install util-linux
nsenter进入容器需要通过容器的PID进入,因此要通过docker inspect找到docker运行的PID,注意:如果docker没有运行,采用docker inspect找到的PID为0
docker inspect : 获取容器/镜像的元数据。
获取docker 容器的PID可以采用format获取:docker inspect --format "{{.State.pid}}" mydocker
进入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用于进入容器,这种方式相对更简单一些
4、关于docker容器命令,汇总如下