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包。
文章来源:https://www.toymoban.com/news/detail-625925.html
收获满满!!!一起加油!!!热爱代码的我们!!!文章来源地址https://www.toymoban.com/news/detail-625925.html
到了这里,关于【Linux|Docker】以CentOS 7为基础镜像制作一个目标镜像(Nginx)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!