一.搭建nginx

实验环境:

主机名ip
server1172.25.12.1
server2172.25.12.2
server3172.25.12.3
物理机172.25.254.12

1.将nginx镜像导入并查看

[root@server1 ~]# ls
[root@server1 ~]# docker load -i nginx.tar 
[root@server1 ~]# docker images

在这里插入图片描述
2.查看容器的详情

[root@server1 ~]# docker inspect nginx

在这里插入图片描述

3.编辑配置文件

[root@server1 ~]# cd /tmp/docker/
[root@server1 docker]# vim Dockerfile 

配置文件的内容如下:

FROM rhel7
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD nginx-1.15.8.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel
#使其不生成debug日至
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc 
RUN ./configure --prefix=/usr/local/nginx 
RUN make 
RUN make install
#如果无法知道此命令怎么写,查看容器的情况即可知道(docker inspect xx)
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

在这里插入图片描述
4.将nginx-1.15.8.tar.gz安装包移动到/tmp/docker目录下

[root@server1 ~]# ls
[root@server1 ~]# cp nginx-1.15.8.tar.gz /tmp/docker
[root@server1 ~]# cd /tmp/docker/
[root@server1 docker]# ls

在这里插入图片描述
5.重新创建一个镜像,发现可以成功创建,说明配置文件中的内容正确

[root@server1 docker]# docker build -t nginx:v1 .

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

6.查看镜像

[root@server1 docker]# docker images
[root@server1 docker]# docker images nginx

在这里插入图片描述

7.清除掉之前的容器

[root@server1 docker]# docker ps -a 
[root@server1 docker]# docker rm -f vm2
[root@server1 docker]# docker rm -f apache
[root@server1 docker]# docker ps -a

在这里插入图片描述

8.创建容器并指定映射端口

[root@server1 docker]# docker run -d --name nginx -p 80:80 nginx:v1
[root@server1 docker]# docker ps

在这里插入图片描述

9.在浏览器中输入网址http://172.25.12.1/,发现可以成功显示nginx页面
在这里插入图片描述

10.编辑dockerfile文件,增加服务端口(即如果容器中运行应用服务,可以把服务端口暴露出去)和指定的应用的数据挂载点

[root@server1 docker]# vim Dockerfile 
配置文件中增加的内容如下:
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]

在这里插入图片描述
11.重新创建一个镜像,发现此时运行很快,其原因是因为很多层都用的是缓存

[root@server1 docker]# docker build -t nginx:v2 .

在这里插入图片描述

12.删除容器nginx,并新建一个nginx容器

[root@server1 docker]# docker rm -f nginx
[root@server1 docker]# docker run -d --name nginx -p 80:80 nginx:v2

在这里插入图片描述

13.比较nginx:v2和nginx:v1的层数结构的区别

[root@server1 docker]# docker history nginx:v2
[root@server1 docker]# docker history nginx:v1

在这里插入图片描述

14.查看容器nginx的情况并找到挂载(因为没有设置路径,所以显示系统自定义的名字,此处应为管理卷)

[root@server1 docker]# docker inspect nginx

在这里插入图片描述在这里插入图片描述

15.切换到该目录下并查看,发现有内容,说明挂载成功

[root@server1 docker]# cd /var/lib/docker/volumes/03803afd17b411fce56b159417a50a85402029ac474ab78530f2254e314043f8/_data
[root@server1 _data]# ls

在这里插入图片描述

注意:
如果挂载的路径下没有内容,可能的原因是没有使用最新的容器

16.在上一个路径下编辑测试页

[root@server1 _data]# vim test.html
[root@server1 _data]# cat test.html

测试页中的内容如下:
test.westos.org

在这里插入图片描述

17.在浏览器中输入网址http://172.25.12.1/test.html,发现可以成功查看
在这里插入图片描述
总结:
1.源码方式部署nginx
2.优化一下nginx的源码编译
3.cmd是容器起来之后才起来
4.如果使用cache不要在上面加,否则会变更
5.会从容器内拷过来,docker管理卷
5.容器的id
6.会自动删除不用的

二.对nginx进行优化

镜像的优化

  • 选择最精简的基础镜像
  • 减少镜像的层数
  • 清理镜像构建的中间产物
  • 注意优化网络请求
  • 尽量去用构建缓存
  • 使用多阶段构建镜像

实验开始:
1.使用prune删除未被占用的卷,已经占用的需要将其删除

[root@server1 docker]# docker volume ls
#发现nginx被占用
[root@server1 docker]# docker ps
[root@server1 docker]# docker ps -a
#删除卷
[root@server1 docker]# docker volume prune
#发现只删除了一个,原因是还有一个卷被占用了
[root@server1 docker]# docker volume ls
#删除容器nginx
[root@server1 docker]# docker rm  -f nginx
#再次删除卷
[root@server1 docker]# docker volume prune
#查看,发现卷已经成功被删除
[root@server1 docker]# docker volume ls

在这里插入图片描述

2.查看镜像nginx:v2的大小,发现是276MB

[root@server1 docker]# docker images nginx
[root@server1 docker]# docker images nginx:v2

在这里插入图片描述
第一次修改
3.重新编辑dokerfile,将所有RUN命令写在一起,即减少镜像的层数

[root@server1 docker]# vim Dockerfile 


文件中的内容如下:

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

在这里插入图片描述

4.重新创建镜像nginx:v3

[root@server1 docker]# docker build -t nginx:v3 .

在这里插入图片描述
5.查看镜像的状态,发现nginx:v3比nginx:v2的大小小了26MB

[root@server1 docker]# docker images nginx

在这里插入图片描述
第二次修改
6.编辑配置文件,清理镜像构建的中间产物

[root@server1 docker]# vim Dockerfile 

文件中的内容如下:

FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD nginx-1.15.8.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel && yum clean all && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install && rm -rf /mnt/nginx-1.15.8

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;"]

在这里插入图片描述

7.重新创建镜像nginx:v4

[root@server1 docker]# docker build -t nginx:v4 .

在这里插入图片描述
8.查看镜像的状态,发现nginx:v3的大小只有141MB

[root@server1 docker]# docker images nginx

在这里插入图片描述

9.创建容器并访问nginx网页,发现可以成功访问,说明此时nginx成功优化一部分

[root@server1 docker]# docker ps -a
[root@server1 docker]# docker run -d --name nginx -p 80:80 nginx:v4
#可以查看容器的状态得知ip
[root@server1 docker]# curl 172.25.12.1

在这里插入图片描述
在这里插入图片描述
第三次修改
10.导入一个镜像,即选择最精简的基础镜像并查看

[root@server1 ~]# ls
[root@server1 ~]# docker load -i distroless.tar 
[root@server1 ~]# docker images

在这里插入图片描述

11.编辑dockerfile文件

[root@server1 docker]# vim Dockerfile
配置文件中的内容如下:

FROM nginx 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;"]

在这里插入图片描述
在这里插入图片描述

12.新建一个nginx:v5镜像

[root@server1 docker]# docker build -t nginx:v5 .

在这里插入图片描述
13.查看镜像,发现nginx:v5只有23.2MB

[root@server1 docker]# docker images

在这里插入图片描述

14.创建容器并访问nginx网页,发现可以成功访问,说明此时nginx成功优化

[root@server1 docker]# docker rm -f nginx
[root@server1 docker]# docker run -d --name nginx -p 80:80 nginx:v5
[root@server1 docker]# docker ps
[root@server1 docker]# curl 172.25.12.1

在这里插入图片描述
在这里插入图片描述
补充:
可以使用以下命令查看系统调用,即系统调用了哪些库

[kiosk@foundation12 Desktop]$ ldd /usr/sbin/httpd

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐