一、场景需求
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启动该容器。