Docker容器中运行ssh服务¶
实际上在Docker容器内不建议运行sshd服务 Docker基本概念 :Docker是设计成在每个容器只运行一个单一服务/进程,所以运行应用的容器 中,通常不需要再运行sshd服务。这样自然就避免了运维人员登陆容器内容进行手工操作。
不过,也并非无法在容器中启动sshd服务,一些情况下,例如个人的开发环境,能够在容器内部运行一个ssh服务,还是很方便维护的 。
启动容器:
docker run --net ceph-net --ip 172.18.0.11 -it -d \ --hostname ceph-node1 --name ceph-node1 -v data:/data ubuntu:latest /bin/bash
登陆容器:
docker attach ceph-node1
在容器内部执行安装sshd服务:
apt install openssh-server
创建sshd服务使用的的host key:
ssh-keygen -A
创建sshd服务运行目录:
mkdir /run/sshd
启动ssh服务:
/usr/sbin/sshd
备注
注意,这里启动sshd服务是一次性的,下次启动容器,由于容器创建只运行了 /bin/bash
所以并没有启动sshd服务。
要保持docker启动时能够启动ssh服务并运行bash,需要先将包含ssh的镜像制作出来,然后基于此镜像启动容器时采用bash来执行多条命令,案例如下:
保存镜像:
docker commit ceph-node1 local:ubuntu18.04-ssh
再次创建容器,此时容器运行命令中包含启动sshd服务:
docker rm ceph-node1 docker run --net ceph-net --ip 172.18.0.11 -it -d \ --hostname ceph-node1 --name ceph-node1 -v data:/data local:ubuntu18.04-ssh \ /bin/bash -c "/usr/sbin/sshd && /bin/bash"
备注
虽然上述通过命令方式一点点积累也能够搞好镜像,并且能让别人能参考这篇文档来完成镜像制作,不过毕竟还是一个重复的手工操作。Docker为了方便系统管理员能够自己定制镜像,提供了一个 从Dockerfile构建Docker镜像