Dockerfile 构建镜像
目录
一、构建 Apache 镜像
1. 创建工作目录
mkdir /opt/apache
2. 编辑Dockerfile脚本
cd /opt/apache
vim Dockerfile
# 基于的基础镜像
FROM centos:7
# 维护镜像的用户信息
MAINTAINER this is apache image <mz>
# 镜像操作指定安装apache软件
RUN yum -y update
RUN yum -y install httpd
# 开启80端口
EXPOSE 80
# 复制网站首页文件
ADD index.html /var/www/html/index.html
# 方法一
# 将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
# 启动容器时执行脚本
CMD ["/run.sh"]
# 方法二
ENTRYPOINT ["/usr/sbin/apachectl"]
CMD ["-D","FOREGOUND"]
3. 编辑run执行脚本
用方法一时需要run.sh脚本
vim run.sh
#! /bin/bash
# 清理httpd的缓存
rm -rf /run/httpd/*
# 指定为前台运行
/usr/sbin/apachectl -D FOREGOUND
# 因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。
4. 准备网站页面
echo "this is test web" > index.html
5. 生成镜像
docker build -t httpd:centos .
注:末尾有点 “ . ”
.
:表示Dockerfile所在的上下文路径,默认情况下是当前目录。Dockerfile是一个文本文件,其中包含了构建镜像的指令和配置
6. 新镜像运行容器
docker run -d -p 12345:80 httpd:centos
7. 测试
浏览器访问:http://129.168.23.35:12334
二、 构建 SSH 镜像
1. 创建工作目录
mkdir /opt/sshd
2. 创建Dockerfile脚本
cd /opt/sshd
vim Dockerfile
# 指定基于的基础镜像
FROM centos:7
# 作者信息
MAINTAINER this is sshd image <mz>
# 镜像的操作指令
RUN yum -y update
RUN yum -y install openssh* net-tools lsof telnet passwd
RUN echo 'abc123' | passwd --stdin root
# 禁用PAM验证机制
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
# 取消PAM限制
RUN sed -ri '/^session\s+required\s+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd
# 生成SSH密钥对,-t 指定生成RSA类型的密钥,-A 生成全部默认类型的主机密钥对
RUN ssh-keygen -t rsa -A
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
# 指定端口
EXPOSE 22
# 用于前台启动sshd服务
CMD ["/usr/sbin/sshd","-D"]
3. 生成镜像
docker build -t sshd:centos .
4. 启动容器并使用密码登录
docker run -d -P sshd:centos
docker ps -a
ssh localhost -p 32768
5. 更改密码
passwd root
123123
123123
三、构建 Systemctl 镜像
1. 创建工作目录
mkdir /opt/systemctl
2. 编辑Dockerfile脚本
cd /opt/systemctl
vim Dockerfile
# 指定基于的基础镜像
FROM sshd:centos
# 维护者信息
MAINTAINER this is systemctl images <mz>
# 设置环境变量container为docker
ENV container docker
# 除了 systemd-tmpfiles-setup.server 删除其它所有文件
RUN (cd /lib/systemd/system/sysinit.target.wants/;for i in *;do [ $i == systemd-tmpfile-setup.service ] || rm -f $1;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/*;
# 将宿主机的 /sys/fs/cgroup 目录挂载到容器中
VOLUME ["/sys/fs/cgroup"]
# 启动容器时执行
CMD ["/usr/sbin/init"]
systemd-tmpfiles-setup.service
是一个由Systemd init系统提供的服务单元文件。它负责在系统启动过程中创建临时文件和目录
3. 生成镜像
docker build -t systemd:centos .
4. 启动容器
启动容器,并挂载宿主机目录挂载到容器中,和进行初始化
docker run --privileged -d -P -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd:centos /sbin/init
--privileged
:使container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。
5. 进入容器
docker ps -a
# 进入容器
docker exec -it
systemctl status sshd