一、准备基础环境
1、同步rpm包
yum -y install reposync createrepo yum-utils
mkdir /etc/yum.repo/bak
mv /etc/yum.repo/*.repo /etc/yum.repo/bak
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
yum -y install centos-release-openstack-train
mkdir ~/rpm
#同步完18G
reposync -p ~/rpm
2、打包rpm包
cd ~/rpm/
tar -zcvf base.tar.gz base
tar -zcvf centos-ceph-nautilus.tar.gz centos-ceph-nautilus
tar -zcvf centos-nfs-ganesha28.tar.gz centos-nfs-ganesha28
tar -zcvf centos-openstack-train.tar.gz centos-openstack-train
tar -zcvf centos-qemu-ev.tar.gz centos-qemu-ev
tar -zcvf extras.tar.gz extras
tar -zcvf updates.tar.gz updates
3、安装docker
yum -y install device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce
systemctl restart docker && systemctl enable docker
二、编写Dockerfile
1、工作目录结构和文件如下:
/root/build/
├── config
│ ├── docker-env.sh
│ ├── nginx.conf
│ └── openstark.repo
├── Dockerfile
├── repo
│ ├── CentOS-Base.repo
│ ├── CentOS-Ceph-Nautilus.repo
│ ├── CentOS-NFS-Ganesha-28.repo
│ ├── CentOS-OpenStack-train.repo
│ ├── CentOS-QEMU-EV.repo
│ └── CentOS-Storage-common.repo
└── source
├── base.tar.gz
├── centos-ceph-nautilus.tar.gz
├── centos-nfs-ganesha28.tar.gz
├── centos-openstack-train.tar.gz
├── centos-qemu-ev.tar.gz
├── extras.tar.gz
├── nginx-1.19.1.tar.gz
└── updates.tar.gz
3 directories, 18 files
2、准备构建镜像需要的文件
mkdir ~/build
mkdir ~/build/{source,config,repo}
mv ~/rpm/*.tar.gz ~/build/source/
cp /etc/yum.repos.d/*.repo ~/build/repo/
rm -rf ~/build/repo/docker-ce.repo
wget https://nginx.org/download/nginx-1.19.1.tar.gz -P ~/build/source/
cat ~/build/config/docker-env.sh
#!/bin/sh
init_config(){
yum -y update
yum -y install make gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel createrepo
}
install_sf(){
cd /opt/repo/nginx-1.19.1
./configure --prefix=/usr/local/nginx
make -j 8 && make install
wait
rm -rf /usr/local/nginx/conf/nginx.conf
mv /opt/repo/nginx.conf /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
rm -rf /opt/repo/base/repodata/ && \
rm -rf /opt/repo/updates/repodata/ && \
rm -rf /opt/repo/extras/repodata/ && \
rm -rf /opt/repo/centos-ceph-nautilus/repodata/ && \
rm -rf /opt/repo/centos-nfs-ganesha28/repodata/ && \
rm -rf /opt/repo/centos-openstack-train/repodata/ && \
rm -rf /opt/repo/centos-qemu-ev/repodata/
createrepo /opt/repo/centos-qemu-ev && \
createrepo /opt/repo/centos-openstack-train && \
createrepo /opt/repo/centos-nfs-ganesha28 && \
createrepo /opt/repo/centos-ceph-nautilus && \
createrepo /opt/repo/extras && \
createrepo /opt/repo/updates && \
createrepo /opt/repo/base
mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
mv /tmp/*.repo /etc/yum.repos.d/
yum clean all
yum makecache
}
clean_env(){
rm -rf /opt/repo/nginx-1.19.1
rm -rf /tmp/
rm -rf /root/anaconda-ks.cfg
echo > /var/log/wtmp
echo > /var/log/btmp
echo>/var/log/lastlog
echo > /var/log/secure
echo > /var/log/messages
echo>/var/log/syslog
echo>/var/log/yum.log
echo > ~/.bash_history
yum clean all
}
main(){
init_config && \
install_sf && \
clean_env
}
main
cat ~/build/config/nginx.conf
#user nobody;
worker_processes auto;
worker_rlimit_nofile 65535;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 20480;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /opt/repo;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /opt/repo/base {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /opt/repo/updates {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /opt/repo/extras {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /opt/repo/centos-openstack-train {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /opt/repo/centos-qemu-ev {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /opt/repo/centos-ceph-nautilus {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location /opt/repo/centos-nfs-ganesha28 {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
cat ~/build/config/openstark.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://ip:port/base/
gpgcheck=0
enabled=1
[updates]
name=CentOS-$releasever - Updates
baseurl=http://ip:port/updates/
gpgcheck=0
enabled=1
[extras]
name=CentOS-$releasever - Extras
baseurl=http://ip:port/extras/
gpgcheck=0
enabled=1
[centos-openstack-train]
name=CentOS-7 - OpenStack train
baseurl=http://ip:port/centos-openstack-train/
gpgcheck=0
enabled=1
[centos-qemu-ev]
name=CentOS-$releasever - QEMU EV
baseurl=http://ip:port/centos-qemu-ev/
gpgcheck=0
enabled=1
[centos-ceph-nautilus]
name=CentOS-7 - Ceph Nautilus
baseurl=http://ip:port/centos-ceph-nautilus/
gpgcheck=0
enabled=1
[centos-nfs-ganesha28]
name=CentOS-7 - NFS Ganesha 2.8
baseurl=http://ip:port/centos-nfs-ganesha28/
gpgcheck=0
enabled=1
#建议rpm包分多层添加进镜像,单层镜像不超10G
cat ~/build/Dockerfile
FROM centos:centos7.8.2003
MAINTAINER duanshuaixing "duanshuaixing@gmail.com"
ADD ./source/base.tar.gz /opt/repo/
ADD ./source/updates.tar.gz /opt/repo/
ADD ./source/extras.tar.gz /opt/repo/
ADD ./source/centos-ceph-nautilus.tar.gz /opt/repo/
ADD ./source/centos-nfs-ganesha28.tar.gz /opt/repo/
ADD ./source/centos-openstack-train.tar.gz /opt/repo/
ADD ./source/centos-qemu-ev.tar.gz /opt/repo/
ADD ./source/nginx-1.19.1.tar.gz /opt/repo/
ADD ./config/* /opt/repo/
ADD ./repo/* /tmp/
RUN /opt/repo/docker-env.sh
WORKDIR /opt/repo
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
3、构建镜像
cd ~/build
docker build -t yum-el7:openstark-train .
docker tag yum-el7:openstark-train registry.baidubce.com/tools/yum:openstark-train
docker push registry.baidubce.com/tools/yum:openstark-train
4、这个镜像仓库是公共的,需要的朋友可以直接下载
docker pull registry.baidubce.com/tools/yum:openstark-train
#容器暴露到宿主机的端口根据实际情况修改,本次测试为8888端口
docker run -itd --restart=always --name openstark-train -p8888:80 registry.baidubce.com/tools/yum:openstark-train
5、更新包
docekr exec -it openstark-train bash
reposync /opt/repo/
6、删除容器和镜像
docker rm -f openstark-train
docker rmi -f registry.baidubce.com/tools/yum:openstark-train