Dockerfile 案例之 SSh、systemctl、
一、Dockerfile之SSH镜像构建
mkdir /opt/sshd
cd /opt/sshd
#基础镜像 FROM centos #镜像维护人信息 MAINTAINER this is ssh image <ht> #更新基于镜像yum源 RUN yum -y update #在基于镜像上安装软件 #openssh是SSH协议的免费开源实现 #net-tools组件可支持使用ifconfig命令查看网卡信息 #lsof查看进程打开的文件、打开文件的进程、进程打开的端口 #telnet支持远程登陆 #passwd用于设置密码,更新用户身份令牌 RUN yum -y install openssh* net-tools lsof telnet passwd #更改root用户密码为abc1234 RUN echo 'abc1234' | passwd --stdin root #将ssh服务端配置文件中所有的UsePAM yes替换为UsePAM no,关闭第三方认证登陆,别人都无法远程登陆该主机 RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config #创建非密钥对文件,生成到/etc/ssh/目录下为ssh_host_rsa_key RUN sed -i '/^session\s+required\s+pam_loginuid.so/ s/^/#/' /etc/pam.d/sshd
RUN ssh-keygen -t rsa -A # 生成秘钥认证文件 #嵌套创建/root/.ssh目录并且将/root目录属主和属组改为root并且为/root/.ssh目录赋权700,只有root用户可读写执行 RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh #指定端口22 EXPOSE 22 #在运行容器时启动ssh服务,并开启守护进程 CMD ["/usr/sbin/sshd","-D"] #构建新镜像, docker build -t sshd:centos . #后台运行并启动容器,修改root密码
docker run -d -P sshd:centos
docker ps -a
ssh localhost -p 49153
二、Dockerfile之构建systemctl镜像
mkdir /opt/systemctl cd /opt/systemctl vim Dockerfile # 指定基础镜像为之前的sshd容器进行 FROM sshd:centos MAINTAINER this is systemctl image <wl> ENV container docker 指定环境变量 #除了systemd-tmpfiles-setup.service,删除其它所有文件 RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \ rm -f /lib/systemd/system/multi-user.target.wants/*; \ rm -f /etc/systemd/system/*.wants/*; \ rm -f /lib/systemd/system/local-fs.target.wants/*; \ rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ rm -f /lib/systemd/system/basic.target.wants/*;\ rm -f /lib/systemd/system/anaconda.target.wants/*;
#创建数据卷,用于挂载到宿主目录
VOLUME [ "/sys/fs/cgroup" ]
#启动容器时,用于init命令将系统初始化,作为容器的第一个进程,但是如果之前镜像中有CMD命令或 ENTRYPOINT 命令会覆盖或者只执行最后一条CMD命令
CMD ["/usr/sbin/init"] //生成新的镜像 docker build -t systemd:centos . //启动容器,并挂载宿主机目录挂载到容器中,和进行初始化 docker run --privileged -it -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd:centos /sbin/init & #--privileged:使container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。 docker ps -a //进入容器 docker exec -it a0d624d2bfa9 bash systemctl status sshd 方法二: docker run -d -P --privileged sshd:centos /usr/sbin/init &