【Linux|Docker】以CentOS 7为基础镜像制作一个目标镜像(Nginx)

1.需求分析

1.以centos7作为基础镜像
2.在里面安装好ip,vim,ping命令
3.编译好nginx,使用我们指定的配置文件nginx.conf  
4.启动容器的时候,就启动nginx
5.网页代码上传到容器里(有两种方式): 
		(1).直接做到镜像里
		(2).使用数据卷挂载使用	
		/usr/local/nginx1/html/

====
需要哪些东西?
1.nginx的安装脚本 install_nginx.sh 源码
https://nginx.org/download/nginx-1.23.3.tar.gz
2.Dockerfile

2.实验环境

CentOS 7.9,Docker 23.0.1,Nginx 1.23.3

3.详细步骤

3.1 准备环境,新建目录
[root@docker1 mydocker]# mkdir nginx
[root@docker1 mydocker]# cd nginx/
[root@docker1 nginx]# pwd
/mydocker/nginx
[root@docker1 nginx]# 
3.2 编写一个编译安装nginx的脚本

为了提高效率,编写一个脚本执行,一次性编译安装好!vim install_nginx.sh
脚本文件内容如下:

#!/bin/bash

#解决软件的依赖关系,需要安装的软件包
yum -y install wget zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake make
#download nginx
mkdir -p /nginx
cd /nginx
#解压 下载的nginx的源码包
wget https://nginx.org/download/nginx-1.23.3.tar.gz
tar xf nginx-1.23.3.tar.gz
cd  nginx-1.23.3
#生成编译前配置工作-->Makefile
./configure --prefix=/usr/local/nginx1  --with-threads --with-http_ssl_module    --with-http_stub_status_module --with-stream
#编译
make
#编译安装--》将编译好的二进制程序安装指定目录/usr/local/nginx1
make   install
3.3 编写Dockerfile

编写Dockerfile,vim Dockerfile,内容如下:

FROM centos:7
ENV NGINX_VERSION 1.23.3
ENV AUTHOR Jiang_da
LABEL maintainer="jiangda<1404658417@qq.com>"
ARG sg

WORKDIR /jd
COPY . /jd
RUN  yum  install  vim net-tools  iputils  iproute -y \
     && bash /jd/install_nginx.sh && mkdir /jdvol
EXPOSE 80
ENV PATH=/usr/local/nginx1/sbin:$PATH
volume /jdvol
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]

3.4 制作第一版本的镜像并启动一个容器

这一步是为了获得nginx.conf配置文件,以便提高后面步骤的复制修改的效率!

[root@docker1 nginx]# docker build -t jdnginx:1.0 --build-arg sg=jiangda  .
[+] Building 0.0s (9/9) FINISHED                                                                                                                                                             
 => [internal] load .dockerignore                                                                                                                                                       0.0s
 => => transferring context: 2B                                                                                                                                                         0.0s
 => [internal] load build definition from Dockerfile                                                                                                                                    0.0s
 => => transferring dockerfile: 397B                                                                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/centos:7                                                                                                                             0.0s
 => [1/4] FROM docker.io/library/centos:7                                                                                                                                               0.0s
 => [internal] load build context                                                                                                                                                       0.0s
 => => transferring context: 68B                                                                                                                                                        0.0s
 => CACHED [2/4] WORKDIR /jd                                                                                                                                                            0.0s
 => CACHED [3/4] COPY . /jd                                                                                                                                                             0.0s
 => CACHED [4/4] RUN  yum  install  vim net-tools  iputils  iproute -y      && bash /jd/install_nginx.sh && mkdir /jdvol                                                                0.0s
 => exporting to image                                                                                                                                                                  0.0s
 => => exporting layers                                                                                                                                                                 0.0s
 => => writing image sha256:b13ee6fee0edec091c09a7d03fdfb67ecfc7d5895c7c167715347f1675440243                                                                                            0.0s
 => => naming to docker.io/library/jdnginx:1.0                                                                                                                                          0.0s

在这里插入图片描述
启动容器:

[root@docker1 nginx]# docker run -d -p 4433:80 --name jdnginx-1 jdnginx:1.0
1358ab64a54e7be482b3b7511d89e2dd1822a73cc04a5abe3cce96fd393655e5

在这里插入图片描述

====
1.指定nginx.conf配置文件
监听端口号为8008
2.创建容器的时候,使用卷,加载里面的网页
2.1 创建卷 jdnginx_web,新建一个index.html网页文件
2.2 创建容器,加载卷

3.5 指定nginx.conf配置文件

利用docker cp,得到容器的配置文件。

[root@docker1 nginx]# docker cp jdnginx-1:/usr/local/nginx1/conf/nginx.conf .
Preparing to copy...
Successfully copied 4.608kB to /mydocker/nginx/.
[root@docker1 nginx]# 

进行修改,将端口号修改为8008,作为模板的nginx.conf使用:
在这里插入图片描述
目前目录结构:
在这里插入图片描述

3.6 修改Dockerfile
FROM centos:7
ENV NGINX_VERSION 1.23.3
ENV AUTHOR sanchuang_cali
LABEL maintainer="jiangda<1404658417@qq.com>"
ARG sg

WORKDIR /jd
COPY . /jd

RUN  yum  install  vim net-tools  iputils  iproute -y \
     && bash /jd/install_nginx.sh && mkdir /jdvol-1
EXPOSE 8008
ENV PATH=/usr/local/nginx1/sbin:$PATH
volume /jdvol-1
STOPSIGNAL SIGQUIT
COPY nginx.conf  /usr/local/nginx1/conf

CMD ["nginx", "-g", "daemon off;"]
3.7 制作最终镜像

执行docker build -t jdnginx:10.0 --build-arg sg=jiangda .

制作最终镜像jdnginx:10.0,注意制作镜像的时长比较久,因为有一些工具的下载,本人大概花费五分钟左右。你们若也遇到这个问题,希望你们放些耐心噢!

[root@docker1 nginx]# docker build -t jdnginx:10.0 --build-arg sg=jiangda .
[+] Building 266.3s (10/10) FINISHED                                                                                                                                                         
 => [internal] load build definition from Dockerfile                                                                                                                                    0.0s
 => => transferring dockerfile: 451B                                                                                                                                                    0.0s
 => [internal] load .dockerignore                                                                                                                                                       0.0s
 => => transferring context: 2B                                                                                                                                                         0.0s
 => [internal] load metadata for docker.io/library/centos:7                                                                                                                             0.0s
 => [1/5] FROM docker.io/library/centos:7                                                                                                                                               0.0s
 => [internal] load build context                                                                                                                                                       0.0s
 => => transferring context: 517B                                                                                                                                                       0.0s
 => CACHED [2/5] WORKDIR /jd                                                                                                                                                            0.0s
 => [3/5] COPY . /jd                                                                                                                                                                    0.0s
 => [4/5] RUN  yum  install  vim net-tools  iputils  iproute -y      && bash /jd/install_nginx.sh && mkdir /jdvol-1                                                                   264.5s
 => [5/5] COPY nginx.conf  /usr/local/nginx1/conf                                                                                                                                       0.0s
 => exporting to image                                                                                                                                                                  1.8s
 => => exporting layers                                                                                                                                                                 1.8s
 => => writing image sha256:8eb57fa1ca60070450e8421eb20d049c92a2cafeb1a43c870fe30e194a91f87c                                                                                            0.0s 
 => => naming to docker.io/library/jdnginx:10.0                                                                                                                                         0.0s

在这里插入图片描述

3.8 使用卷使用数据卷挂载使用
3.8.1 创建卷 jdnginx_web,新建一个index.html网页文件

执行docker volume create jdnginx_web

[root@docker1 nginx]# docker volume create jdnginx_web
jdnginx_web
[root@docker1 nginx]# docker volume inspect jdnginx_web
[
    {
        "CreatedAt": "2023-03-13T04:42:02-04:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/jdnginx_web/_data",
        "Name": "jdnginx_web",
        "Options": null,
        "Scope": "local"
    }
]

3.8.2 新建首页文件index.html在卷对应的目录下
[root@docker1 nginx]# cd /var/lib/docker/volumes/jdnginx_web/_data/
[root@docker1 _data]# ls
[root@docker1 _data]# vim index.html
[root@docker1 _data]# cat index.html 
welcome jiangda's website!
3.8.3 启动容器(使用卷)

执行 docker run -d -p 4455:8008 --name jdd-nginx -v jdnginx_web:/usr/local/nginx1/html jdnginx:10.0

[root@docker1 nginx]# docker run -d -p 4455:8008 --name jdd-nginx -v jdnginx_web:/usr/local/nginx1/html  jdnginx:10.0
2785cde489279bf56dc53f5c7f26b91b61429f60c373bc40702a2a8aa1df0f3c
3.9 访问测试
3.9.1 进入容器,查看ip,vim,ping等命令能否使用
[root@docker1 nginx]# docker exec -it jdd-nginx /bin/bash
[root@2785cde48927 jd]# ip route
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3 
[root@2785cde48927 jd]# vim  
[root@2785cde48927 jd]# ping 192.168.1.132 -c 1
PING 192.168.1.132 (192.168.1.132) 56(84) bytes of data.
64 bytes from 192.168.1.132: icmp_seq=1 ttl=64 time=0.072 ms

--- 192.168.1.132 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.072/0.072/0.072/0.000 ms
[root@2785cde48927 jd]# 
3.9.2 使用windows本机访问容器宿主机4455端口,看是否运行

成功访问!
在这里插入图片描述
NICE!!!

4.知识点总结

问题一:将代码制作进入镜像和使用卷挂载进入容器,那个方式更加好?
解释:上述是使用卷。如果有些配置是需要固定到镜像里的,在制作镜像的时候就COPY进去;
如果容器启动后可以加载的,就使用卷挂载进入容器使用。


问题二:如何让你制作的镜像比较小?
解释:1.使用基础镜像要小。
	2.少使用RUN和COPY,ADD。
	3.使用镜像启动容器后,再在里面安装软件,使用卷挂载数据。


问题三:Dockerfile内容解答:
q:为什么有的镜像启动需要接-it,有的不需要?
a:centos7或者ubuntu的基础镜像,在启动的时候,运行的程序是bash;
一运行完就马上退出了,使用-it可以保证一直有一个前台进程运行,保证容器不挂掉

q:怎么理解代码:  CMD [“nginx”,"-g",“daemon off;”]
a:让nginx在前台运行;
-g daemon off 将off值赋值给daemon这个变量,告诉ngixn不要在后台启动,在前台启动;
daemon是守护进程,默认在后台运行。

q:有一些命令不能直接install,如何查看某个命令来自哪个包?
a:你可以执行yum provides xxx去获得需要安装什么包;
例如ip命令,你就得安装iproute包;ping命令,你就得安装iputils包。

在这里插入图片描述

收获满满!!!一起加油!!!热爱代码的我们!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日 近 长 安 远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值