从2011年开始用vmware到Vgrant再到现在的docker,这些软件变得越来越快而且聪明。虚拟化软件时特别依赖ssh服务去登录到虚拟机里面进行调试,所以开始用docker的时候也习惯于ssh登录到里面进行修改,慢慢的发现违背了docker初衷。

    docker其实目标有点想java代码一样“一次编译到处运行”,也就是当你构建完你的docker镜像后就不需要经常登录到你的容器内部去做操作,容器本身是一个无状态,用后即焚的东西。为了尽量的轻量快捷建议一个容器尽量只有一个进程,否则你的容器会越来越大,越来越像一个虚拟机一样笨重不宜维护。


    当然docker官方还是提供了方法让进入到容器进行调试,下面介绍下:


exec方法

在内运行命令(命令退出不会影响容器运行

[root@salt-node1 pkg]# docker exec --help
Usage:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Run a command in a running container
Options:
  -d, --detach               后台运行命令
      --detach-keys string   Override the key sequence for detaching a container
  -e, --env list             使用环境便令 (默认是列表[])
      --help                 Print usage
  -i, --interactive          使用标准输入
      --privileged           给命令提升权限
  -t, --tty                  分配一个终端
  -u, --user string          使用用户或者id (format: [:])
  
下面命令就是创建一个输入流和终端进入容器执行命令
[root@salt-node1 pkg]# docker exec -ti demo1 /bin/sh
# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
redis         1      0  0 14:25 ?        00:00:00 redis-server *:6379
root         12      0  0 14:27 ?        00:00:00 /bin/sh
root         16     12  0 14:27 ?        00:00:00 ps -ef

使用指定用户登录容器
[root@salt-node1 pkg]# docker exec -ti  -u redis demo1 /bin/sh 
$ id
uid=999(redis) gid=999(redis) groups=999(redis)

指定登录终端的环境变量
[root@salt-node1 pkg]# docker exec -ti  -e service=blog.nginxs.net  -e ctime='2017-03-04 22:38' demo1 /bin/sh 
# env
HOSTNAME=78bd4fa22582
HOME=/root
ctime=2017-03-04 22:38
REDIS_DOWNLOAD_SHA1=6780d1abb66f33a97aad0edbe020403d0a15b67f
TERM=xterm
service=blog.nginxs.net
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.2.8.tar.gz
REDIS_VERSION=3.2.8
GOSU_VERSION=1.7
PWD=/data
# echo $ctime
2017-03-04 22:38
# exit
[root@salt-node1 pkg]# 

#前端运行一个容器
[root@salt-node1 pkg]# docker run -it  centos
[root@efd2c7e14ef4 /]# df
Filesystem                                                                                       1K-blocks     Used Available Use% Mounted on
/dev/mapper/docker-8:3-78681558-2adb3ef25d882c28c20263b9e894d6a7e9067a646bba84042475a0dcb55948e1  10474496   240760  10233736   3% /
tmpfs                                                                                               933632        0    933632   0% /dev
tmpfs                                                                                               933632        0    933632   0% /sys/fs/cgroup
/dev/sda3                                                                                         18555904 15322128   3233776  83% /etc/hosts
shm                                                                                                  65536        0     65536   0% /dev/shm
tmpfs                                                                                               933632        0    933632   0% /sys/firmware


attach方法

(命令退出容器即结束运行)

[root@salt-node1 pkg]# docker attach --help
Usage:docker attach [OPTIONS] CONTAINER
和运行容器内部进行输入
Options:
      --detach-keys string   覆盖容器内隔离的key
      --help                 Print usage
      --no-stdin             不传输标准输入
      --sig-proxy            代理所有接受到的信号默认开启,关闭后Ctrl+c容器将不再退出

如果你的容器是一个系统则可以直接attach进行使用shell,否则无法正常通讯