利用Dockerfile构建自定义镜像实现一键部署Apahce服务与Nginx服务

1.利用Dockerfile部署Apahce服务

1.下载并导入镜像

#1.在网站上下载rhel7.tar镜像包
[root@foundation66 Desktop]# ls
rhel7.tar
#2.导入rhel7镜像
[root@foundation66 Desktop]# docker load -i rhel7.tar
e1f5733f050b: Loading layer  147.1MB/147.1MB
#3.查看镜像
[root@foundation66 Desktop]# docker images

在这里插入图片描述
以下操作为非必要过程,只是为了便于理解的dockerfile文件内的内容

#1.创建并运行vm1容器;-i表示交互,t表示终端 --name
[root@foundation66 Desktop]# docker run -it --name vm1 rhel7 bash
#2.配置yum源
bash-4.2# yum repolist
Skipping unreadable repository '///etc/yum.repos.d/rhel7.repo'
repolist: 0
bash-4.2# cd /etc/yum.repos.d/
bash-4.2# ls
rhel7.repo
bash-4.2# vim dvd.repo
bash: vim: command not found
bash-4.2# vi dvd.repo
######################
[dvd]
name=rhel7.3
baseurl=http://172.25.254.66/rhel7.3
gpgcheck=0

在这里插入图片描述

bash-4.2# yum clean all
Skipping unreadable repository '///etc/yum.repos.d/rhel7.repo'
Cleaning repos: dvd
Cleaning up everything
bash-4.2# yum repolist 

在这里插入图片描述

bash-4.2# pwd
/etc/yum.repos.d
#3.安装apahce
bash-4.2# yum install -y httpd
#4.查看yum安装的程序命令
[kiosk@foundation66 Desktop]$ which httpd
/usr/sbin/httpd
#5.查看httpd的安装方式
[root@foundation66 ~]# netstat -antlp | grep httpd
tcp6       0      0 :::80                   :::*                    LISTEN      1288/httpd  
[kiosk@foundation66 Desktop]$ ps aux | grep httpd

在这里插入图片描述
2.编写Dockerfile

#1.创建目录
[root@foundation66 ~]# mkdir /opt/docker
[root@foundation66 ~]# cd /opt/docker/
#2.编写文件
[root@foundation66 docker]# vim Dockerfile
###########################
FROM rhel7                       		    #指定基础镜像
COPY dvd.repo /etc/yum.repos.d    			#将本地的yum源文件复制到镜像文件系统
RUN  rpmdb --rebuilddb            			#初始化和重建rpm数据库;RUN是构件容器时就运行的命令以及提交运行结果
RUN  yum install -y httpd         			#安装apache
EXPOSE 80                                   #暴露容器运行时的监听端口
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]   #启动apache;CMD是容器启动时执行的命令

在这里插入图片描述

#构建镜像,报错因为没有配置yum源
[root@foundation66 docker]# docker build -t rhel7:v1 .

在这里插入图片描述
3.配置yum源

[root@foundation66 docker]# pwd
/opt/docker
[root@foundation66 docker]# vim dvd.repo
###########################
[dvd]
name=rhel7.3
baseurl=http://172.25.254.66/rhel7.3
gpgcheck=0

在这里插入图片描述

[root@foundation66 docker]# ls
Dockerfile  dvd.repo

4.构建镜像

[root@foundation66 docker]# docker build -t rhel7:v1 .

在这里插入图片描述5.创建并运行容器

#1.利用rhel7:v1镜像创建并运行vm2容器;-d表示打入后台,--name表示镜像名称
[root@foundation66 docker]# docker run -d --name vm2 rhel7:v1
a2af90f4c831ea6cb0904fb5d351849d37ac657e9afe59b84c63bd4e8bc92fa9
[root@foundation66 docker]# docker ps

在这里插入图片描述

#2.查看vm2容器的参数
[root@foundation66 docker]# docker inspect vm2

在这里插入图片描述
6.网页访问

在浏览器中输入:172.18.0.4 即可访问apache的默认发布网页
在这里插入图片描述
7.更改发布页面

方式1: 直接将发布页面拷贝到已创建好的容器中的apache默认发布目录中

#1.编写发布页面
[root@foundation66 docker]# pwd
/opt/docker
[root@foundation66 docker]# ls
Dockerfile  dvd.repo
[root@foundation66 docker]# vim index.html
[root@foundation66 docker]# cat index.html 
<h1>westos.org</h1>
[root@foundation66 docker]# ls
Dockerfile  dvd.repo  index.html
#2.拷贝
[root@foundation66 docker]# docker container cp index.html vm2:/var/www/html

测试:

刷新网页,发现发布页面内容更改了
在这里插入图片描述

方式2: 在创建容器时直接将发布页面挂载到apache的默认发布目录中(挂载数据卷)

挂载数据卷:

(1).手工挂载

#1.删除原来的vm2容器
[root@foundation66 docker]# docker rm -f vm2
vm2
#2.更改Dockerfile文件
[root@foundation66 docker]# vim Dockerfile 
###########################
FROM rhel7
COPY dvd.repo /etc/yum.repos.d
RUN  rpmdb --rebuilddb
RUN  yum install -y httpd
VOLUME ["/var/www/html"]     #挂载数据目录
EXPOSE 80
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

在这里插入图片描述

#3.构建镜像
[root@foundation66 docker]# docker build -t rhel7:v2 .

在这里插入图片描述

#查看镜像的创建历史
[root@foundation66 docker]# docker history rhel7:v1
[root@foundation66 docker]# docker history rhel7:v2

在这里插入图片描述

#4.创建目录并拷贝发布文件
[root@foundation66 docker]# ls
Dockerfile  dvd.repo  index.html
[root@foundation66 docker]# mkdir webdata
[root@foundation66 docker]# ls
Dockerfile  dvd.repo  index.html  webdata
[root@foundation66 docker]# mv index.html webdata/
[root@foundation66 docker]# ls
Dockerfile  dvd.repo  webdata
#5.利用rhel7:v2镜像创建并运行vm2容器,-v表示挂载数据卷
[root@foundation66 docker]# docker run -d --name vm2 -v /opt/docker/webdata:/var/www/html/ rhel7:v2
455323b624533d80546d0f42c5590d76f8d3b68403892b89876f096e03fcce00

测试:

刷新网页,发现依旧可以查看到发布页面的内容
在这里插入图片描述
(2).自动挂载

#1.删除之前的vm2容器
[root@foundation66 docker]# docker rm -f vm2
vm2
#2.利用rhel7:v2镜像创建并运行vm2容器
[root@foundation66 docker]# docker run -d --name vm2 rhel7:v2
6ec89dedd5f5339f4b377413666e3039176bd737e6f0b782b1af13f3b39c1531
#查看数据卷
[root@foundation66 docker]# docker volume ls
DRIVER              VOLUME NAME
local               5ef3ef7331d7dbf5e3b61381afc5b3de119ea10de0f30dbebf6973ba1b30f3fd
local               a88d303812772a52ffe58b382cffaebc32cbd4a3be89d27fb8842ef2eb6ef623
#3.查看vm2容器的参数
[root@foundation66 docker]# docker inspect vm2

在这里插入图片描述

#4.先进入数据目录中,拷贝发布文件,此时会自动挂载数据卷
[root@foundation66 ~]# cd /var/lib/docker/volumes/a88d303812772a52ffe58b382cffaebc32cbd4a3be89d27fb8842ef2eb6ef623/_data
[root@foundation66 _data]# ls
[root@foundation66 _data]# cp /opt/docker/webdata/index.html .
[root@foundation66 _data]# ls
index.html

测试:

刷新网页,发现依旧可以查看到发布页面的内容
在这里插入图片描述

#5.更改发布页面
[root@foundation66 _data]# vim index.html 
[root@foundation66 _data]# cat index.html 
<h1>westos.org</h1>
<h1>westos.org</h1>
<h1>westos.org</h1>

测试:

刷新页面,发现网页发生了改变
在这里插入图片描述

删除数据卷:
#删除容器后,数据仍然存在
#1.删除容器
[root@foundation66 ~]# docker rm -f vm2
vm2
[root@foundation66 ~]# cd -
/var/lib/docker/volumes/a88d303812772a52ffe58b382cffaebc32cbd4a3be89d27fb8842ef2eb6ef623/_data
[root@foundation66 _data]# ls
index.html
[root@foundation66 _data]# cd
#2.删除数据
[root@foundation66 ~]# docker volume rm a88d303812772a52ffe58b382cffaebc32cbd4a3be89d27fb8842ef2eb6ef623
[root@foundation66 ~]# cd -
-bash: cd: /var/lib/docker/volumes/a88d303812772a52ffe58b382cffaebc32cbd4a3be89d27fb8842ef2eb6ef623/_data: No such file or directory
只读挂载:
#1.使用rhel7:v2镜像创建并运行vm2容器;-d表示打入后台,-v表示挂载数据卷,ro表示只读挂载
[root@foundation66 ~]# docker run -d --name vm2 -v /opt/docker/webdata:/data:ro rhel7:v2
4452950dedadb766b8938cfaf3b014759a79884e45dd14f7e79296609eac8664
#2.查看vm2容器的参数
[root@foundation66 ~]# docker inspect vm2

在这里插入图片描述
测试:

#exec表示在运行的容器中运行命令,-i表示交互式,-t表示分配一个终端
[root@foundation66 ~]# docker exec -it vm2 bash
bash-4.2# cd data
bash-4.2# ls
index.html
bash-4.2# cat index.html 
<h1>westos.org</h1>
bash-4.2# rm -rf index.html 
rm: cannot remove 'index.html': Read-only file system    #只读

2.利用Dockerfile部署Nginx服务

(1).构建镜像实现一键部署Nginx服务

1.拉取镜像

前提:已经配置好了镜像加速器
#1.从网上拉取nginx镜像
[root@foundation66 docker]# docker pull nginx
#2.查看镜像
[root@foundation66 docker]# docker images

在这里插入图片描述
2.下载nginx软件包

安装包:

nginx-1.15.7.tar.gz
#下载nginx并将其移动到编写Dockerfile文件的目录中
[root@foundation66 ~]# cd /opt/docker/
[root@foundation66 docker]# ls
auth  certs  Dockerfile  dvd.repo  nginx-1.15.7.tar.gz  test  webdata

3.编写Dockerfile

[root@foundation66 docker]# vim Dockerfile 
###########################
FROM rhel7                                   #指定基础镜像
COPY dvd.repo /etc/yum.repos.d               #将本地的dvd.repo文件(yum源)拷贝到容器的 /etc/yum.repos.d目录
RUN  rpmdb --rebuilddb                       #初始化和重建rpm数据库
RUN yum install -y gcc pcre-devel zlib-devel make                         #安装依赖包
ADD nginx-1.15.7.tar.gz /mnt                 #ADD与COPY类似,将本地的nginx-1.15.7.tar.gz复制到容器的/mnt目录,不同的是它会自动解压
WORKDIR /mnt/nginx-1.15.7                    #设置工作目录;进入/mnt/nginx-1.15.7 目录(相当于cd命令)
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc     #关闭debug日志;sed为shell命令
RUN ./configure --prefix=/usr/local/nginx    #configure配置,--prefix表示指定安装路径
RUN make                                     #编译
RUN make install                             #安装
EXPOSE 80                                    #暴露容器运行时的监听端口
VOLUME ["/usr/local/nginx/html"]             #挂载数据目录
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]   #启动nginx

在这里插入图片描述
4.构建镜像

[root@foundation66 docker]# docker build -t rhel7:v3 .

在这里插入图片描述

#查看镜像历史
[root@foundation66 docker]# docker history rhel7:v3

在这里插入图片描述
5.创建并运行容器

[root@foundation66 docker]# docker run -d --name nginx rhel7:v3
cd3d7c1183f5006afcc0d07d5285c4893d1226f08dac0fb0e91d8e137f7d3af7
#查看容器
[root@foundation66 docker]# docker ps

在这里插入图片描述

6.查看容器参数

[root@foundation66 docker]# docker inspect nginx

在这里插入图片描述
在这里插入图片描述
网页访问:

在浏览器中输入:172.18.0.2 即可访问nginx的默认发布页面
在这里插入图片描述
7.更改发布页面

[root@foundation66 docker]# cd /var/lib/docker/volumes/ce4e5aaa5df9f6940059a82afe9917cfdfcc60d1fb7cd3f7397d92a2f954ae66/_data
[root@foundation66 _data]# ls
50x.html  index.html
[root@foundation66 _data]# vim index.html 
[root@foundation66 _data]# cat index.html 
<h1>www.westos.org</h1>

刷新网页:
在这里插入图片描述

2.优化镜像

优化1:清理

#1.更改Dockerfile 
[root@foundation66 ~]# cd /opt/docker/
[root@foundation66 docker]# vim Dockerfile 
###########################
FROM rhel7
COPY dvd.repo /etc/yum.repos.d
RUN  rpmdb --rebuilddb
RUN yum install -y gcc pcre-devel zlib-devel make &> /dev/null && yum clean all     #清理yum缓存并将多余的输出信息导入垃圾箱(减少输出)
ADD nginx-1.15.7.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.7
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx  &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
RUN cd && rm -rf /mnt/nginx-1.15.7       #删除无用的目录
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]           

在这里插入图片描述

#2.构建镜像
[root@foundation66 docker]# docker build -t rhel7:v4 .

在这里插入图片描述
测试:

#查看镜像,发现镜像的大小减小了
[root@foundation66 docker]# docker images rhel7

在这里插入图片描述
优化2:缩减层数

[root@foundation66 docker]# vim Dockerfile 
###########################
FROM rhel7
COPY dvd.repo /etc/yum.repos.d
RUN  rpmdb --rebuilddb
ADD nginx-1.15.7.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.7
RUN yum install -y gcc pcre-devel zlib-devel make &> /dev/null && yum clean all && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx &> /dev/null && make &> /dev/null && make install &> /dev/null && cd && rm -rf /mnt/nginx-1.15.7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

在这里插入图片描述

[root@foundation66 docker]# docker build -t rhel7:v5 .

在这里插入图片描述
测试:

#查看镜像,发现镜像的大小减小了
[root@foundation66 docker]# docker images rhel7

在这里插入图片描述
优化3:分阶段构建

[root@foundation66 docker]# vim Dockerfile 
###########################                                                           
FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d
RUN  rpmdb --rebuilddb
ADD nginx-1.15.7.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.7
RUN yum install -y gcc pcre-devel zlib-devel make &> /dev/null && yum clean all && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx &> /dev/null && make &> /dev/null && make install &> /dev/null && cd && rm -rf /mnt/nginx-1.15.7

FROM rhel7
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]                                                  

在这里插入图片描述

[root@foundation66 docker]# docker build -t rhel7:v6 .

在这里插入图片描述
测试:

1.查看镜像,发现镜像的大小确实大大减小

[root@foundation66 docker]# docker images rhel7

在这里插入图片描述
2.使用镜像

#查看容器
[root@foundation66 docker]# docker ps

在这里插入图片描述

#1.删除之前创建的容器
[root@foundation66 docker]# docker rm -f nginx 
nginx
#2.重新创建容器
[root@foundation66 docker]# docker run -d --name nginx rhel7:v6
54832194adc9175d4bede712ea1e723f9aab446f236c1fd07fe797ff366338f4
#3.查看容器的参数
[root@foundation66 docker]# docker inspect nginx

在这里插入图片描述
3.网页访问
在这里插入图片描述
优化4:优化底层base

镜像:

distroless.tar 

1.下载并导入distroless.tar镜像

#1.在网站上下载镜像
[root@foundation66 Desktop]# ls
distroless.tar 
#2.导入镜像
[root@foundation66 Desktop]# docker load -i distroless.tar 
668afdbd4462: Loading layer  18.39MB/18.39MB
Loaded image: gcr.io/distroless/base:latest
#3.查看镜像
[root@foundation66 Desktop]# docker images

在这里插入图片描述
2.编写Dockerfile

[root@foundation66 Desktop]# cd /opt/docker
[root@foundation66 docker]# ls
auth  certs  Dockerfile  dvd.repo  nginx-1.15.7.tar.gz  test  webdata
#1.创建目录
[root@foundation66 docker]# mkdir bash
[root@foundation66 docker]# cd bash/
#2.编写Dockerfile
[root@foundation66 bash]# vim Dockerfile
#########################
FROM nginx:1.14.2 as base

# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG Asia/Shanghai
RUN mkdir -p /opt/var/cache/nginx && \
    cp -a --parents /usr/lib/nginx /opt && \
    cp -a --parents /usr/share/nginx /opt && \
    cp -a --parents /var/log/nginx /opt && \
    cp -aL --parents /var/run /opt && \
    cp -a --parents /etc/nginx /opt && \
    cp -a --parents /etc/passwd /opt && \
    cp -a --parents /etc/group /opt && \
    cp -a --parents /usr/sbin/nginx /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libc.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libdl.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpthread.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libcrypt.so.* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
    cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime

FROM gcr.io/distroless/base

COPY --from=base /opt /

EXPOSE 80

ENTRYPOINT ["nginx", "-g", "daemon off;"]

在这里插入图片描述
3.构建镜像

[root@foundation66 bash]# docker build -t rhel7:v7 .

在这里插入图片描述
测试:

1.查看镜像,发现镜像的大小大大减小

[root@foundation66 bash]# docker images rhel7

在这里插入图片描述

#查看镜像创建历史
[root@foundation66 bash]# docker history rhel7:v7

在这里插入图片描述
2.使用镜像

#1.删除之前的容器
[root@foundation66 bash]# docker rm -f nginx
nginx
#2重新创建容器
[root@foundation66 bash]# docker run -d --name nginx rhel7:v7
e07f3e1bc28d4d3228b1dccd28cc8a34312c1a9aab7a87be3d704255b6d7e1ec
#3.查看容器
[root@foundation66 bash]# docker ps

在这里插入图片描述

#4.查看容器参数
[root@foundation66 bash]# docker inspect nginx

在这里插入图片描述
3.网页访问
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lilygg/article/details/88594478