在使用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脚本一样,可以高效的制作镜像,是非常实用的一个制作镜像的方法。
本文介绍如何通过Dockerfile从基础镜像centos构建自定义的nginx镜像。首先,制作初始化系统base镜像,包括准备目录结构和下载镜像。接着,详细阐述了如何在base镜像上制作nginx镜像,包括编译安装nginx,编写Dockerfile,生成镜像,并启动容器测试。Dockerfile的使用使得镜像创建过程清晰且易于维护。
2149

被折叠的 条评论
为什么被折叠?



