利用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
标签:http,ubuntu2004,Nginx,--,module,nginx,构建,镜像,root
From: https://blog.51cto.com/mfc001/6454386