在docker中使用dockerfile实现自定义镜像

本文介绍如何通过Dockerfile从基础镜像centos构建自定义的nginx镜像。首先,制作初始化系统base镜像,包括准备目录结构和下载镜像。接着,详细阐述了如何在base镜像上制作nginx镜像,包括编译安装nginx,编写Dockerfile,生成镜像,并启动容器测试。Dockerfile的使用使得镜像创建过程清晰且易于维护。

在使用docker技术的时候,很多时候官方提供的基础镜像是无法满足实际要求的,因为我们可以通过dockerfile文件在基础镜像上自定义新的镜像满足实际要求,接下来我们就通过实验搭建一个容器,使用的镜像是我们通过dockerfile自定义的镜像
实验目的:通过基础镜像centos制作nginx镜像,搭建nginx服务的容器

1.首先通过dockerfile制作基于基础镜像的初始化镜像

1.1 准备目录结构,下载镜像并初始化系统

#按照业务类型或系统类型等方式划分创建目录环境,方便后期镜像比较多的时候进行分类
[root@Ubuntu1804 ~]#mkdir /data/dockerfile/{web/{nginx,apache,tomcat,jdk},system/{centos,ubuntu,alpine,debian}} -p
[root@Ubuntu1804 ~]#tree /data/dockerfile/
/data/dockerfile/
├── system
│   ├── alpine
│   ├── centos
│   ├── debian
│   └── ubuntu
└── web
    ├── apache
    ├── jdk
    ├── nginx
    └── tomcat

10 directories, 0 files
#下载基础镜像
[root@Ubuntu1804 ~]#docker pull centos:centos7.7.1908
[root@Ubuntu1804 ~]#docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              centos7.7.1908      08d05d1d5859        12 months ago       204MB

1.2 制作基于基础镜像的系统base镜像

#先制作基于基础镜像的系统base镜像
[root@Ubuntu1804 ~]#cd /data/dockerfile/system/centos/
[root@Ubuntu1804 centos]#vim Dockerfile
FROM centos:centos7.7.1908
LABEL maintainer="lianlian <root@lianlianlianlian.com>"
RUN yum -y install wget && rm -f /etc/yum.repos.d/*
COPY base.repo /etc/yum.repos.d/
RUN yum -y install vim-enhanced tcpdump lrzsz tree telnet  bash-completion net-tools wget curl bzip2 lsof zip unzip nfs-utils gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel \
    && yum clean all \
    && rm -f /etc/localtime \
    && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#在准备好的base.repo文件移动至对应目录
[root@Ubuntu1804 centos]#mv /root/base.repo /data/dockerfile/system/centos/
[root@Ubuntu1804 centos]#docker build -t centos7-base:v1 .
[root@Ubuntu1804 centos]#docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7-base        v1                  168c34e63eab        7 seconds ago       509MB
centos              centos7.7.1908      08d05d1d5859        12 months ago       204MB
#查看镜像构建历史
[root@Ubuntu1804 centos]#docker history centos7-base:v1 
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
168c34e63eab        3 minutes ago       /bin/sh -c yum -y install vim-enhanced tcpdu…   226MB               
944c10aea4f7        6 minutes ago       /bin/sh -c #(nop) COPY file:7981247772790058…   276B                
5cfaeb2d70a6        13 minutes ago      /bin/sh -c yum -y install wget && rm -f /etc…   79.4MB              
13cad447c819        14 minutes ago      /bin/sh -c #(nop)  LABEL maintainer=lianlian…   0B                  
08d05d1d5859        12 months ago       /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           12 months ago       /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           12 months ago       /bin/sh -c #(nop) ADD file:3e2a127b44ed01afc…   204MB         

2. 通过dockerfile制作基于base镜像的nginx镜像

2.1 在dockerfile目录下准备编译安装相关文件

#准备相关文件夹
[root@Ubuntu1804 ~]#mkdir /data/dockerfile/web/nginx/1.18
[root@Ubuntu1804 ~]#cd /data/dockerfile/web/nginx/1.18
#下载nginx压缩包进行编译安装
[root@Ubuntu1804 1.18]#wget http://nginx.org/download/nginx-1.18.0.tar.gz
#创建指定网页页面
[root@Ubuntu1804 1.18]#mkdir app/
[root@Ubuntu1804 1.18]#echo "test page in app" > app/index.html
#将网页页面进行压缩为压缩文件
[root@Ubuntu1804 1.18]#tar zcf app.tar.gz app
[root@Ubuntu1804 1.18]#ls
app  app.tar.gz  nginx-1.18.0.tar.gz.1

2.2 在一台测试机进行编译安装nginx生成模版配置文件

#在centos7上进行编译安装同版本nginx生成相关配置文件
[root@localhost ~]# yum -y install vim-enhanced tcpdump lrzsz tree telnet bash-completion net-tools wget bzip2 lsof tmux man-pages zip unzip nfs-utils gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel
#下载nginx,主要要指定相同版本
[root@localhost ~]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@localhost ~]# mv nginx-1.18.0.tar.gz /usr/local/src/
[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# tar xf nginx-1.18.0.tar.gz 
[root@localhost nginx-1.18.0]# ./configure --prefix=/apps/nginx 
[root@localhost nginx-1.18.0]# make && make install

#将生成的配置文件拷贝至nginx镜像服务器对应目录下
[root@localhost nginx-1.18.0]# scp /apps/nginx/conf/nginx.conf 10.0.0.10:/data/dockerfile/web/nginx/1.18/

#在镜像服务器编写配置文件
[root@Ubuntu1804 1.18]#ls
app  app.tar.gz  nginx-1.18.0.tar.gz  nginx.conf
[root@Ubuntu1804 1.18]#vim nginx.conf 
user  nginx;
daemon off;   #增加此选项,关闭后台运行

2.3 编写Dockerfile文件

[root@Ubuntu1804 nginx]#pwd
/data/dockerfile/web/nginx
[root@Ubuntu1804 nginx]#vim Dockerfile
FROM centos7-base:v1
LABEL maintainer="lianlian <root@lianlianlianlian.com>"
ADD 1.18/nginx-1.18.0.tar.gz /usr/local/src
RUN cd /usr/local/src/nginx-1.18.0 && ./configure --prefix=/apps/nginx && make && make install \
    && rm -rf /usr/local/src/nginx* \
    && useradd -r nginx
COPY 1.18/nginx.conf /apps/nginx/conf/
ADD 1.18/app.tar.gz /apps/nginx/html/
EXPOSE 80 443
CMD ["/apps/nginx/sbin/nginx"]

2.4生成nginx镜像

[root@Ubuntu1804 nginx]#docker build -t nginx-centos7:1.8.1 .
[root@Ubuntu1804 nginx]#docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx-centos7       1.8.1               66a60f88dbb8        3 minutes ago       519MB
centos7-base        v1                  168c34e63eab        49 minutes ago      509MB
centos              centos7.7.1908      08d05d1d5859        12 months ago       204MB

2.5 启动容器测试镜像

#启动容器
[root@Ubuntu1804 nginx]#docker run -d -p 80:80 nginx-centos7:1.8.1 
dc2772cf46bf806c6a36c121d1e9737ee275cf5630bcfacfb47cd44f347f3c80
[root@Ubuntu1804 nginx]#docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                         NAMES
dc2772cf46bf        nginx-centos7:1.8.1   "/apps/nginx/sbin/ng…"   15 seconds ago      Up 13 seconds       0.0.0.0:80->80/tcp, 443/tcp   priceless_shaw
#进入容器
[root@Ubuntu1804 nginx]#docker exec -it dc2772cf46bf bash
[root@dc2772cf46bf /]# ps auxf  #查看进程
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          7  3.0  0.1  12364  3568 pts/0    Ss   16:27   0:00 bash
root         26  0.0  0.1  51764  3520 pts/0    R+   16:28   0:00  \_ ps auxf
root          1  0.3  0.1  20580  2516 ?        Ss   16:27   0:00 nginx: master process /apps/nginx/sbin/nginx      #运行nginx进程
nginx         6  0.0  0.1  21016  2320 ?        S    16:27   0:00 nginx: worker process
#通过访问网页页面测试
[root@Ubuntu1804 nginx]#docker port dc2772cf46bf
80/tcp -> 0.0.0.0:80
[root@Ubuntu1804 nginx]#curl 127.0.0.1/app/
test page in app

到此,我们已经实现通过dockerfile文件制作自定义镜像并实现nginx服务,可以看出dockerfile文件可以直观看出镜像的产生过程,当后期有额外需求时,只要在文件中添加或者修改相应的命令就可以重新生成新的镜像,就像shell脚本一样,可以高效的制作镜像,是非常实用的一个制作镜像的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值