0
点赞
收藏
分享

微信扫一扫

8、利用构建好的Ubuntu镜像构建Nginx镜像

利用DockerFile文件执行docker build基于基础镜像自动构建nginx镜像

做的时候可以找一台宿主机边执行命令,边写Dockerfile
应用级镜像一定要有一个进程是前台执行,进程存在不至于程序启动就退出
CMD:容器启动命令

第一步:按照业务类型或系统类型等方式划分创建目录环境,方便后期镜像比较多的时候进行分类
[root@ubuntu2004 ~]#mkdir -pv /data/dockerfile/{app/{nginx,tomcat,jdk},system/{ubuntu,rocky,alpine}}
[root@ubuntu2004 ~]#tree /data/
/data/
└── dockerfile
    ├── app
    │   ├── jdk
    │   ├── nginx
    │   └── tomcat
    └── system
        ├── alpine
        ├── rocky
        └── ubuntu

9 directories, 0 files

第二步:以做好的ubuntu镜像为基础镜像,因为nginx要在ubuntu上运行  
可以在ubuntu上创建用户和组
[root@ubuntu2004 ~]#cd /data/dockerfile/app/nginx/
下载nginx包
[root@ubuntu2004 nginx]#wget http://nginx.org/download/nginx-1.22.0.tar.gz
[root@ubuntu2004 nginx]#ls
Dockerfile  nginx-1.22.0.tar.gz

写Dockerfile文件
[root@ubuntu2004 nginx]#vim Dockerfile
FROM ubuntu:20.04-20221018-v2.0              #父镜像是制作好的ubuntu镜像
ENV VERSION=1.22.0
ENV NGINX_INSTALL_DIR=/apps/nginx
LABEL Author=mengfanchao version=nginx-${VERSION}
RUN apt update && apt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev                                   #安装编译nginx所需要的依赖包
ADD ngixn-${VERSION}.tar.gz /usr/local/src/  #把下载好的包复制并解压缩到镜像指定目录
RUN cd /usr/local/src/nginx-${VERSION} && \  #执行shell命令进入目录进行编译
    ./configure --prefix=${NGINX_INSTALL_DIR} --user=www --group=www --with-http_ssl_module \
    --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module \
    --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make && make install
EXPOSE 80                                   #暴露端口80,执行-P可找到随机端口和80的映射关系
CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"] 
#把镜像打成容器的时候,要指定容器启动时默认启动哪个程序作为系统中的第一个进程,并且进程前台运行
#应用级镜像一定要有一个进程是前台执行,进程存在不至于程序启动就退出
#CMD命令可以写多次,但是只有最后一次有效,在docker build不执行,在容器启动时执行

[root@ubuntu2004 nginx]#bash build.sh v1.22.0-`date +%F`
#!/bin/bash

docker build -t nginx:$1 .

跑nginx容器
[root@ubuntu2004 nginx]#docker run nginx:v1.22.0-2022-10-18

打开另外页面 查看运行的容器
[root@ubuntu2004 ubuntu]#docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED              STATUS              PORTS     NAMES
b227af3bef9b   nginx:v1.22.0-2022-10-18   "/apps/nginx/sbin/ng…"   About a minute ago   Up About a minute   80/tcp    gallant_tesla
查看IP
[root@ubuntu2004 nginx]#docker inspect b227af3bef9b
"IPAddress": "172.17.0.2",
访问
[root@ubuntu2004 nginx]#curl 172.17.0.2 -I
HTTP/1.1 200 OK
Server: nginx/1.22.0
Date: Tue, 18 Oct 2022 13:56:51 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 18 Oct 2022 13:48:49 GMT
Connection: keep-alive
ETag: "634eaec1-267"
Accept-Ranges: bytes

第三步:定制web页面   
[root@ubuntu2004 nginx]#mv /data/dockerfile/system/ubuntu/index.html.tar .
[root@ubuntu2004 nginx]#ls
build.sh  Dockerfile  index.html.tar.gz  nginx-1.22.0.tar.gz

修改Dockerfile文件
FROM ubuntu:20.04-20221018-v2.0
ENV VERSION=1.22.0
ENV NGINX_INSTALL_DIR=/apps/nginx
LABEL Author=mengfanchao version=nginx-${VERSION}
RUN apt update && apt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev
ADD nginx-${VERSION}.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-${VERSION} && \
    ./configure --prefix=${NGINX_INSTALL_DIR} --user=www --group=www --with-http_ssl_module \
    --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module \
    --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make && make install
EXPOSE 80
ADD index.html.tar.gz /apps/nginx/html/                #新加的,用来解压文件
CMD ${NGINX_INSTALL_DIR}/sbin/nginx -g "daemon off;"   #两种写法

重新打镜像
[root@ubuntu2004 nginx]#bash build.sh v1.22.0-`date +%F`
查看运行的容器
[root@ubuntu2004 nginx]#docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS          PORTS     NAMES
8d56d4b6c3e9   nginx:v1.22.0-2022-10-18   "/bin/sh -c '${NGINX…"   27 seconds ago   Up 26 seconds   80/tcp    elastic_franklin
查看容易详细内容
[root@ubuntu2004 nginx]#docker inspect 8d56d4b6c3e9
访问
[root@ubuntu2004 nginx]#curl 172.17.0.2
docker websit

退出上面的容器正式跑下面的容器(小p做端口映射)
[root@ubuntu2004 nginx]#docker run -d -p 80:80 --name nginx nginx:v1.22.0-2022-10-18 
595f03958221587f89fecc21baec54078cc5cfa1c950d43042c62116940d5d35
去其他机器进行访问
[root@rocky8 ~]#curl 10.0.0.101
docker website

定制配置文件,把容器里面的配置文件拷贝到宿主机/data/dockerfile/app/nginx/下
[root@ubuntu2004 nginx]#docker cp nginx:/apps/nginx/conf/nginx.conf /data/dockerfile/app/nginx
[root@ubuntu2004 nginx]#ls
build.sh  Dockerfile  index.html.tar.gz  nginx-1.22.0.tar.gz  nginx.conf

修改配置文件(打开日志格式)
vim nginx.conf
worker_processes  auto;                  #进程个数改为和宿主机CPU核数数量一样
log_format access_log_format  '$remote_addr - $remote_user [$time_local] "$request" '          '$status $body_bytes_sent "$http_referer" '
     '"$http_user_agent" "$http_x_forwarded_for"'   
     '$server_name:$server_port';        #自定义访问日志      
gzip  on;                                #开启压缩
charset utf-8;                           #字符集
include /apps/nginx/conf/conf.d/*.conf;  #增加include,后期好扩展

把文件加进去,修改Dockerfile文件
[root@ubuntu2004 nginx]#vim Dockerfile
FROM ubuntu:20.04-20221018-v2.0
ENV VERSION=1.22.0
ENV NGINX_INSTALL_DIR=/apps/nginx
LABEL Author=mengfanchao version=nginx-${VERSION}
RUN apt update && apt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev
ADD nginx-${VERSION}.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-${VERSION} && \
    ./configure --prefix=${NGINX_INSTALL_DIR} --user=www --group=www --with-http_ssl_module \
    --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module \
    --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make && make install
EXPOSE 80
COPY nginx.conf ${NGINX_INSTALL_DIR}/conf/nginx.conf
ADD index.html.tar.gz /apps/nginx/html/
CMD ${NGINX_INSTALL_DIR}/sbin/nginx -g "daemon off;"

重新打镜像
[root@ubuntu2004 nginx]#docker exec -it nginx bash
开启容器
[root@ubuntu2004 nginx]#docker run -d -p 80:80 --name nginx nginx:v1.22.0-2022-10-18 
9c99f741250a683db48ab33ad88ef3e32f983b1643645b0b91c3688ac745bd1c
进入容器进行查看
[root@ubuntu2004 nginx]#docker exec -it nginx bash
查看配置文件
root@9c99f741250a:/# vim /apps/nginx/conf/nginx.conf

ENTRYPOINT指令与CMD指令的关系

1、可以替代CMD
2、如果ENTRYPOINT与CMD共存,ENTRYPOINT的优先级高,将ENTRYPOINT指定的指令作为系统第一个启动的进程,而不是CMD指定的指令,并且CMD指定的指令将沦落为ENTRYPOINT的参数

如下所示:

1、ENTRYPOINT指令替代CMD指令
ENTRYPOINT ${NGINX_INSTALL_DIR}/sbin/nginx -g "daemon off;" #在Dockerfile中用其替代CMD


2、CMD作为ENTRYPOINT的参数 
CMD的指令将作为ENTRYPOINT参数,用"/apps/nginx/sbin/nginx","-g","daemon off;"指令替代
"/docker-entrypoint.sh"指令,最终执行"/apps/nginx/sbin/nginx","-g","daemon off;"

但ENTRYPOINT ["/docker-entrypoint.sh"]成了初始化环境的脚本
脚本之前的命令已经执行完毕,在执行的时候最后一条写的exec "$@",此时CMD便不再是ENTRYPOINT的参数
最终用CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"]实现了系统的第一个进程  
如下所示:

ENTRYPOINT指令:做初始化环境用

做一个初始化脚本
#创建配置文件
[root@ubuntu2004 nginx]#vim docker-entrypoint.sh  
#!/bin/bash
mkdir -p /apps/nginx/conf/conf.d
cat > /apps/nginx/conf/conf.d/www.conf <<EOF
server {
    listen 80;
    server_name www.meng.org;
    root /data/website;
}
EOF
exec "$@"     #执行exec "$@"后,CMD便不再是ENTRYPOINT的参数

#exec,用当前的命令把bash替换掉,并保留进程编号。
#如echo $BASHID  是1958
#exec sleep 100
#pstree 可看到sleep替换了bash,进程编号还是1958

[root@ubuntu2004 nginx]#chmod +x docker-entrypoint.sh
[root@ubuntu2004 nginx]#vim Dockerfile
FROM ubuntu:20.04-20221018-v2.0
ENV VERSION=1.22.0
ENV NGINX_INSTALL_DIR=/apps/nginx
LABEL Author=mengfanchao version=nginx-${VERSION}
RUN apt update && apt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev
ADD nginx-${VERSION}.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-${VERSION} && \
    ./configure --prefix=${NGINX_INSTALL_DIR} --user=www --group=www --with-http_ssl_module \
    --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module \
    --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make && make install
EXPOSE 80
COPY nginx.conf ${NGINX_INSTALL_DIR}/conf/nginx.conf
ADD index.html.tar.gz /apps/nginx/html/
COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"] 
CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"]  

   
打镜像
[root@ubuntu2004 nginx]# bash build.sh v1.22.0-`date +%F`
开启容器
[root@ubuntu2004 nginx]# docker run -d -p 80:80 --name nginx nginx:v1.22.0-2022-10-18
进入容器查看配置文件
[root@ubuntu2004 nginx]#docker exec -it nginx bash
root@7332ad4fdd09:/# cat /apps/nginx/conf/conf.d/www.conf 
server {
    listen 80;
    server_name www.meng.org;
    root /data/website;
}
最终运行的程序是CMD实现的,ENTRYPOINT做初始化环境用

也可以在临时运行中用自己指定的接命令把CMD替了
[root@ubuntu2004 nginx]# docker run -d -p 80:80 --name nginx nginx:v1.22.0-2022-10-18 sleep 1000

举报

相关推荐

0 条评论