从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: <name|uid>[:<group|gid>])
下面命令就是创建一个输入流和终端进入容器执行命令
[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,否则无法正常通讯
来源:oschina
链接:https://my.oschina.net/u/4389078/blog/4346325