docker如何自制一个带对管理 systemd 系统和服务(systemctl)的ubantu20.04镜像?

一、场景需求

docker打打简化了部署的难易程度,大部分的应用都能通过官方或第三方制作的镜像来完成自己的需求,但除此之外,有些特殊的需求,需要自制镜像来满足需求,假设我有这么一个需求:创建一个ubantu20.04容器,在这个容器内分别安装nginx服务和其他的服务,并制作成一个带nginx服务和其他的服务的新容器。

二、具体实践

要实现这个操作,首先,我们需要制作出来一个带systemctl的ubantu20.04容器。
具体操作如下:

1. 编写一个"Dockerfile"文件,编写内容如下:

FROM ubuntu:20.04
LABEL maintainer="kaiyuan"
EXPOSE 21
ARG DEBIAN_FRONTEND=noninteractive

# Install: dependencies, clean: apt cache, remove dir: cache, man, doc, change mod time of cache dir.
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
       software-properties-common \
       rsyslog systemd systemd-cron sudo \
    && apt-get clean \
    && rm -Rf /usr/share/doc && rm -Rf /usr/share/man \
    && rm -rf /var/lib/apt/lists/* \
    && touch -d "2 hours ago" /var/lib/apt/lists
RUN sed -i 's/^\($ModLoad imklog\)/#\1/' /etc/rsyslog.conf

RUN rm -f /lib/systemd/system/systemd*udev* \
  && rm -f /lib/systemd/system/getty.target
ENV ASPNETCORE_URLS=http://+:21
VOLUME ["/sys/fs/cgroup", "/tmp", "/run"]
CMD ["/lib/systemd/systemd"]

2. 通过通过 docker build -t myubantu:20.04 . 命令进行镜像的构建(基于ubantu:20.04构建),如果在通过docker build 构建时报错,只能先拉取一个基础镜像,然后运行此容器,在进入容器进行安装依赖操作 ,完成操作后提交镜像,在运行下图的Dockerfile文件进行编译新的镜像:
 

# 先拉取一个基础镜像
docker pull ubuntu:20.04
# 运行该镜像
docker run  --name myubant --detach --privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro ubuntu:20.04
# 安装对应的服务依赖环境
apt-get update \
    && apt-get install -y --no-install-recommends \
       software-properties-common \
       rsyslog systemd systemd-cron sudo \
    && apt-get clean \
    && rm -Rf /usr/share/doc && rm -Rf /usr/share/man \
    && rm -rf /var/lib/apt/lists/* \
    && touch -d "2 hours ago" /var/lib/apt/lists
# 注释$ModLoad imklog 开头的行    
sed -i 's/^\($ModLoad imklog\)/#\1/' /etc/rsyslog.conf

# 清理和简化容器内的 systemd 环境
 rm -f /lib/systemd/system/systemd*udev* \
  && rm -f /lib/systemd/system/getty.target

# 完成后退出容器
exit

# 找到对应容器CONTAINER ID
docker ps -a

# 通过CONTAINER ID将容器提交为一个新的镜像
docker commit <CONTAINER ID>  <容器名称>:版本号/标签

#在运行Dockerfile文件将服务注册为容器启动时开启

3. 构建完成带服务功能的镜像后使用docker run --detach --privileged -p 5000:5000 -p 5010:5010 -v /home/nginx:/home/nginx -v /home/other:/home/other -v /dev/mem:/dev/mem --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro <容器名称>:标签 运行容器,其中/home/nginx/home/kaihe01 ,和/home/other 分别对应nginx在宿主机的位置,在这里需要准备nginx的安装包,以及其他想注册为服务的应用;

4. 通过 docker ps 可以查看正在运行容器的CONTAINER ID;

5. 在通过 docker exec -it <CONTAINER ID> /bin/bash 进入容器内容,进入到对应的nginx及其他服务的挂载目录下,按照正常linux下的安装教程,进行安装与注册为开机自启服务即可;

6. 完成上述操作后,使用 docker stop <CONTAINER ID> 停止容器,然后使用docker commit <CONTAINER ID> <自定义镜像名称>:自定义版本号/标签 提交镜像为一个新的镜像

7. 至此一个新的带nginx服务和其他服务的ubantu20.04镜像就制作完毕,可以使用docker run,或者docker-compose启动该容器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值