m-zhuang

导航

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"]


image-20230818143222136

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容器也就退出了。


image-20230818142043120

4. 准备网站页面

echo "this is test web" > index.html

image-20230818142110643

5. 生成镜像

docker build -t httpd:centos .

注:末尾有点 “ . ”

.:表示Dockerfile所在的上下文路径,默认情况下是当前目录。Dockerfile是一个文本文件,其中包含了构建镜像的指令和配置

image-20230818142430217

6. 新镜像运行容器

docker run -d -p 12345:80 httpd:centos

image-20230818143539455

7. 测试

浏览器访问:http://129.168.23.35:12334

image-20230818143715836

二、 构建 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"]


image-20230818160056038

3. 生成镜像

docker build -t sshd:centos .

image-20230818160222503

4. 启动容器并使用密码登录

docker run -d -P sshd:centos
docker ps -a
ssh localhost -p 32768

image-20230818160633258

5. 更改密码

passwd root
123123
123123

image-20230818162045998

三、构建 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

posted on 2023-08-20 22:30  m_zhuang  阅读(37)  评论(0编辑  收藏  举报