docker 命令解释 - nginx镜像制作

本文介绍了Dockerfile中ENTRYPOINT和CMD的用法,包括它们的区别和如何结合使用。通过示例展示了如何配置Nginx镜像,监听8007端口,并修改配置文件。还提到了使用dockerstats监控容器性能以及如何创建和挂载数据卷。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

Dockerfile 部分命令解释

1、ENTRYPOINT

而ENTRYPOINT 语言 CMD的区别

1、docker run 启动容器的时候,可以传递参数进入给ENTRYPOINT里面的命令(-e)

2、当2者都存在的时候,CMD里的内容会成为 ENTRYPOINT 里的参数(位置参数)

如图所示,完成如下实例

配置nginx镜像,并配置监听端口为8007项目:

编译Dockerfile文件

编译好one_creat_ngin.sh文件

在下载过程中,我们可以使用docker stats查看容器的性能

​编辑

下面我们将修改nginx的配置文件

进入容器内部查看nginx配置文件路径,从而得到nginx的配置文件:

修改nginx配置文件(将listen 80 改为 8007)

创建volume

修改Dockerfile文件


Dockerfile 部分命令解释

1、ENTRYPOINT

ENTRYPOINT  ["xxx"] --》指定启动容器的时候运行命令

撰写方式:

而ENTRYPOINT 语言 CMD的区别

1、docker run 启动容器的时候,可以传递参数进入给ENTRYPOINT里面的命令(-e)

2、当2者都存在的时候,CMD里的内容会成为 ENTRYPOINT 里的参数(位置参数)

 

因此相当于docker-entrypoint.sh mysqld 

因此ENTRYPOINT更加高级

dockerfile中CMD和ENTRYPOINT必须要有一个吗?

在 Dockerfile 中定义CMD和ENTRYPOINT指令并不是必须的,但如果想要以容器形式运行应用程序,则至少需要定义其中一个。

如图所示,完成如下实例

其中需要注意while.sh 文件的权限问题

chmod +x while.h

测试:

[root@mysql mydocker2]# vim hello.txt
[root@mysql mydocker2]# vim Dockerfile 
[root@mysql mydocker2]# vim while.sh
[root@mysql mydocker2]# chmod +x while.sh
[root@mysql mydocker2]# ll
总用量 8
-rw-r--r-- 1 root root 83 6月  19 09:51 Dockerfile
-rwxr-xr-x 1 root root 95 6月  19 09:53 while.sh
[root@mysql mydocker2]# docker build -t scbusybox:1.2 .


[root@mysql mydocker2]# docker run --rm -it --name scbusybox-1 scbusybox:1.2
hello world sanchuang! 1
hello world sanchuang! 2
hello world sanchuang! 3
hello world sanchuang! 4
hello world sanchuang! 5
hello world sanchuang! 6
hello world sanchuang! 7
hello world sanchuang! 8
hello world sanchuang! 9
hello world sanchuang! 10

配置nginx镜像,并配置监听端口为8007项目:

准备一台虚拟机centos7.9

安装好docker,创建文件夹/dockernginx

编译Dockerfile文件

[root@mysql dockernginx]# cat Dockerfile 
FROM centos:7             #FROM语句指定了创建镜像的基础镜像
ENV NGINX_VERSION 1.23.1   #定义环境变量
ENV AUTHOR sc_clay
LABEL maintainer="clay<2384319786@qq.com>"   #LABEL语句用于给镜像添加元数据信息

WORKDIR /sc          #WORKDIR语句用于设置当前工作目录
COPY . /sc          #将宿主机本地的文件copy到镜像中的/sc目录下
RUN yum install vim net-tools iputils iproute -y \
    && bash /sc/one_creat_nginx.sh && mkdir /scvolume        #镜像生成过程中执行的命令
EXPOSE 80            #暴露80端口
VOLUME /scvolume       #设置卷为/scvolume
ENV PATH=/usr/local/scnginx66/sbin:$PATH    #定义环境变量PATH
STOPSIGNAL SIGQUIT       #STOPSIGNAL语句用于设置容器停止时发送给进程的信号,其中,<signal>参数表示要发送的信号名称或编号,默认为SIGTERM

CMD ["nginx","-g","daemon off;"] 


[root@mysql dockernginx]# 

编译好one_creat_ngin.sh文件

[root@mysql dockernginx]# cat one_creat_nginx.sh 
#!/bin/bash

#新建一个文件夹用来存放下载的nginx源码包
mkdir -p  /nginx
cd /nginx

#新建工具人用户、设置无法登录模式
useradd  -s /sbin/nologin  clay

#下载nginx
#wget  http://nginx.org/download/nginx-1.23.2.tar.gz
curl -O http://nginx.org/download/nginx-1.23.2.tar.gz

#解压nginx源码包
tar xf nginx-1.23.2.tar.gz

#解决软件依赖关系、需要安装的软件包
yum install epel-release -y
yum install gcc gcc-c++ openssl openssl-devel  pcre pcre-devel  automake  make  psmisc  net-tools lsof vim geoip  geoip-devel wget  zlib zlib-devel -y  

#到达nginx配置文件目录下
cd nginx-1.23.2

#编译前的配置
./configure  --prefix=/usr/local/scnginx66  --user=clay  --with-http_ssl_module --with-http_v2_module --with-stream --with-http_stub_status_module --with-threads 

#编译、开启一个进程同时编译
make -j 1

#编译安装
make install

[root@mysql dockernginx]#

在下载过程中,我们可以使用docker stats查看容器的性能

如果我们想知道容器内进程的消耗,我们就可以使用docker top 容器名

下载完成后查看镜像

[root@mysql dockernginx]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
sclpf-nginx   1.23.1    e704e64746c5   14 minutes ago   671MB
scbusybox     1.2       c86b8980dcc1   5 hours ago      4.86MB
sccentos      7         d1c7ea7a3707   10 hours ago     204MB
nginx         latest    3f8a00f137a0   4 months ago     142MB
mysql         5.7.35    8a8a506ccfdc   20 months ago    448MB
centos        7         eeb6ee3f44bd   21 months ago    204MB
[root@mysql dockernginx]# 

创建容器 

[root@mysql ~]# docker run -d -p 4430:80 --name lpf-nginx sclpf-nginx:1.23.1
2eed8b767d2f4bc133b77655776911ff00460164ba02a92e6c8865b8412a6dd8
[root@mysql ~]# 

查看容器是否启动:

[root@mysql ~]# docker ps
CONTAINER ID   IMAGE                COMMAND                   CREATED              STATUS              PORTS                                   NAMES
2eed8b767d2f   sclpf-nginx:1.23.1   "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:4430->80/tcp, :::4430->80/tcp   lpf-nginx
22e10551d3cd   nginx                "/docker-entrypoint.…"   24 hours ago         Up 4 hours          0.0.0.0:6606->80/tcp, :::6606->80/tcp   claylpf-nginx-1
[root@mysql ~]# 

下面我们将修改nginx的配置文件

1、指定nginx.conf配置文件

        监听端口号为8007

2、创建容器的时候使用卷,加载里面的网页

        2.1创建卷nginx_web,新建一个index.html网页文件

        2.2创建容器,加载容器

进入容器内部查看nginx配置文件路径,从而得到nginx的配置文件:

[root@mysql ~]# docker exec -it lpf-nginx bash
[root@2eed8b767d2f sc]# ls

[root@2eed8b767d2f /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  nginx  opt  proc  root  run  sbin  sc  scvolume  srv  sys  tmp  usr  var
[root@2eed8b767d2f /]# cd /usr/local/scnginx66/conf/
[root@2eed8b767d2f conf]# ls
fastcgi.conf          fastcgi_params          koi-utf  mime.types          nginx.conf          scgi_params          uwsgi_params          win-utf
fastcgi.conf.default  fastcgi_params.default  koi-win  mime.types.default  nginx.conf.default  scgi_params.default  uwsgi_params.default
[root@2eed8b767d2f conf]# 

得到nginx的配置文件

[root@mysql dockernginx]# docker cp lpf-nginx:/usr/local/scnginx66/conf/nginx.conf .
Successfully copied 4.61kB to /dockernginx/.
[root@mysql dockernginx]# ls
Dockerfile  nginx.conf  one_creat_nginx.sh
[root@mysql dockernginx]# 

修改nginx配置文件(将listen 80 改为 8007)

 

创建volume

[root@mysql dockernginx]# docker volume create nginx_web
nginx_web
[root@mysql dockernginx]# docker volume ls
DRIVER    VOLUME NAME
local     4c7c035ff15b9b022f6fc875d8303f6286cf61d8e89ea1692996760169393f1e
local     6167418cb7d0a3dfacef4439f410e1860c088d297cf47aeceaf88d3e56528219
local     a5c3ab3de7511c90ba7a623e4b458e18a4411b2c5140a35b7e03eb52c5ad0b48
local     e129efa82af7232ec5cdfd9f1ebb5e2ab35be29216166551aefe7d322b0309bf
local     nginx-web

 创建index.html 放在卷的数据目录下

[root@mysql dockernginx]# cd /var/lib/docker/volumes/nginx_web/_data
[root@mysql _data]# ls
[root@mysql _data]# vim index.html;
[root@mysql _data]# ls
index.html
[root@mysql _data]# cat index.html 
wo shi da shuai ge lpf 
niu bi

修改Dockerfile文件

FROM centos:7
ENV NGINX_VERSION 1.23.1
ENV AUTHOR sc_clay
LABEL maintainer="clay<2384319786@qq.com>"

WORKDIR /sc
COPY . /sc
RUN yum install vim net-tools iputils iproute -y \
    && bash /sc/one_creat_nginx.sh && mkdir /scvolume
EXPOSE 8007
VOLUME /scvolume
ENV PATH=/usr/local/scnginx66/sbin:$PATH
STOPSIGNAL SIGQUIT
COPY nginx.conf /usr/local/scnginx66/conf      #添加这一条

CMD ["nginx","-g","daemon off;"]

重新编译镜像

[root@mysql dockernginx]# docker build -t sclpf-nginx:1.23.2 .

启动容器使用我们的镜像 和 需要使用的卷

[root@mysql dockernginx]# docker images                                                                                                                                                      
REPOSITORY    TAG       IMAGE ID       CREATED             SIZE
sclpf-nginx   1.23.2    361d4088b257   15 minutes ago      671MB
sclpf-nginx   1.23.1    e704e64746c5   About an hour ago   671MB
scbusybox     1.2       c86b8980dcc1   6 hours ago         4.86MB
sccentos      7         d1c7ea7a3707   11 hours ago        204MB
nginx         latest    3f8a00f137a0   4 months ago        142MB
mysql         5.7.35    8a8a506ccfdc   20 months ago       448MB
centos        7         eeb6ee3f44bd   21 months ago       204MB
[root@mysql dockernginx]# docker run -d -p 4455:8007 --name lpf-nginx-1 -v nginx_web:/usr/local/scnginx66/html sclpf-nginx:1.23.2
dec86911d80e28e1bd2ce8b58cf5222d0c752ad17d8d73f141e3fce0f63c7e37
[root@mysql dockernginx]# docker ps
CONTAINER ID   IMAGE                COMMAND                   CREATED             STATUS             PORTS                                       NAMES
dec86911d80e   sclpf-nginx:1.23.2   "nginx -g 'daemon of…"   7 seconds ago       Up 6 seconds       0.0.0.0:4455->8007/tcp, :::4455->8007/tcp   lpf-nginx-1
2eed8b767d2f   sclpf-nginx:1.23.1   "nginx -g 'daemon of…"   About an hour ago   Up About an hour   0.0.0.0:4430->80/tcp, :::4430->80/tcp       lpf-nginx
22e10551d3cd   nginx                "/docker-entrypoint.…"   25 hours ago        Up 5 hours         0.0.0.0:6606->80/tcp, :::6606->80/tcp       claylpf-nginx-1
[root@mysql dockernginx]# 

 最后测试端口:

 

<think>嗯,用户遇到了在Docker中执行nginx信号重载时出现'signal process started'报错的问题。首先,我需要理解这个错误信息的背景。根据用户提供的引用内容,特别是引用[1]和引用[2],当使用`docker exec`命令执行`nginx -s reload`时,有时候会看到这个提示,但实际可能服务并没有正确重启,或者出现错误。 首先,用户执行的命令是`docker exec docker-nginx-1 nginx -s reload`,然后得到报错信息。根据引用[1],正确的做法应该是这个命令,并且显示`signal process started`实际上是一个notice级别的日志,说明信号处理已经开始。但是用户可能误解这个信息为错误,或者在此之后有其他问题导致服务没有正确重载。 接下来,我需要分析可能的原因。可能的原因包括: 1. **容器内权限问题**:Nginx需要足够的权限来重新加载配置。如果容器以非root用户运行,可能没有权限访问某些文件或执行操作。 2. **配置文件路径错误**:Nginx容器内的默认配置文件路径可能与实际路径不符,导致重载时找不到正确的配置文件。 3. **PID文件问题**:Nginx在运行时会生成一个PID文件,如果这个文件的位置不正确或权限不足,可能导致信号无法正确传递。 4. **容器内部进程问题**:主进程可能没有正确处理信号,或者容器内的进程结构导致信号无法传递给Nginx主进程。 5. **日志级别误解**:用户可能将notice级别的日志误认为错误,实际重载已经成功。 接下来,解决方案需要考虑这些可能的原因。例如,检查权限,确保使用正确的配置文件路径,检查PID文件的位置和权限,以及确认容器的运行方式是否正确。 另外,用户提供的引用[3]提到,启动时指定配置文件路径可以解决类似问题,这可能也适用于重载的情况。因此,在解决方案中,可能需要建议用户显式指定配置文件路径,或者在构建镜像时确保配置文件正确。 还需要考虑Docker的运行方式,比如是否使用`docker run`时的`--init`参数,或者是否以daemon模式运行Nginx,这些都会影响信号的处理。 最后,验证步骤很重要,用户需要确认配置是否真的被重载,可以通过查看日志或检查服务状态来确认。</think>### 问题分析 在Docker中执行`nginx -s reload`命令时出现`signal process started`报错,可能涉及以下原因: 1. **权限问题**:容器Nginx进程无权限访问配置文件或写入PID文件[^1][^2] 2. **配置文件路径错误**:未正确指定`nginx.conf`路径导致重载失败[^3] 3. **PID文件丢失**:主进程未生成有效的`/var/run/nginx.pid`文件[^1] 4. **容器进程隔离**:Docker容器默认仅运行单个进程,信号传递机制受限 --- ### 分步解决方案 #### 1. 检查配置文件有效性 ```bash # 进入容器检查配置语法 docker exec -it docker-nginx-1 nginx -t -c /etc/nginx/nginx.conf ``` *若输出`syntax is ok`,说明配置文件有效* #### 2. 显式指定配置文件路径 ```bash # 重载时强制指定配置文件路径 docker exec docker-nginx-1 nginx -s reload -c /etc/nginx/nginx.conf ``` *此方法可解决80%的路径匹配问题* #### 3. 验证PID文件权限 ```bash # 进入容器检查PID文件 docker exec -it docker-nginx-1 bash ls -l /var/run/nginx.pid chmod 644 /var/run/nginx.pid # 确保Nginx用户有读写权限 ``` #### 4. 使用完整进程树启动容器 ```dockerfile # Dockerfile中添加init进程 RUN apt-get update && apt-get install -y dumb-init CMD ["dumb-init", "nginx", "-g", "daemon off;"] ``` *通过`dumb-init`确保信号正确传递* #### 5. 替代重载方案 ```bash # 通过容器重启实现配置更新 docker compose restart docker-nginx-1 ``` --- ### 验证方法 ```bash # 查看Nginx错误日志 docker logs docker-nginx-1 2>&1 | grep "reload" # 检查工作进程数变化 docker exec docker-nginx-1 ps aux | grep nginx ``` *正常重载应显示新旧进程共存状态[^1]* --- ### 典型错误场景对照表 | 现象 | 解决方案 | |-------|---------| | `open() "/var/run/nginx.pid" failed` | 创建PID目录并设置权限 | | `invalid PID number` | 删除旧PID文件后重载 | | `permission denied` | 使用`--user root`启动容器 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值