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

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

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

exec方法

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

[root@salt-node1 pkg]# docker exec --helpUsage:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]Run a command in a running containerOptions:  -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 -efUID         PID   PPID  C STIME TTY          TIME CMDredis         1      0  0 14:25 ?        00:00:00 redis-server *:6379root         12      0  0 14:27 ?        00:00:00 /bin/shroot         16     12  0 14:27 ?        00:00:00 ps -ef使用指定用户登录容器[root@salt-node1 pkg]# docker exec -ti  -u redis demo1 /bin/sh $ iduid=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 # envHOSTNAME=78bd4fa22582HOME=/rootctime=2017-03-04 22:38REDIS_DOWNLOAD_SHA1=6780d1abb66f33a97aad0edbe020403d0a15b67fTERM=xtermservice=blog.nginxs.netPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binREDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.2.8.tar.gzREDIS_VERSION=3.2.8GOSU_VERSION=1.7PWD=/data# echo $ctime2017-03-04 22:38# exit[root@salt-node1 pkg]# #前端运行一个容器
[root@salt-node1 pkg]# docker run -it  centos[root@efd2c7e14ef4 /]# dfFilesystem                                                                                       1K-blocks     Used Available Use% Mounted on/dev/mapper/docker-8:3-78681558-2adb3ef25d882c28c20263b9e894d6a7e9067a646bba84042475a0dcb55948e1  10474496   240760  10233736   3% /tmpfs                                                                                               933632        0    933632   0% /devtmpfs                                                                                               933632        0    933632   0% /sys/fs/cgroup/dev/sda3                                                                                         18555904 15322128   3233776  83% /etc/hostsshm                                                                                                  65536        0     65536   0% /dev/shmtmpfs                                                                                               933632        0    933632   0% /sys/firmware

attach方法

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

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

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