从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,否则无法正常通讯