Administrator
发布于 2022-10-21 / 905 阅读 / 0 评论 / 0 点赞

dockerfile学习及php+nginx环境

参考内容

命令缩略

命令 作用
FROM 镜像基础来源镜像
RUN 构建镜像执行的命令,每一次RUN都会构建一层
CMD 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数
VOLUME 定义数据卷,如果没有定义则使用默认
USER 指定后续执行的用户组和用户
WORKDIR 切换当前执行的工作目录
HEALTHCHECH 健康检测指令
ARG 变量属性值,但不在容器内部起作用
EXPOSE 暴露端口
ENV 变量属性值,容器内部也会起作用
ADD 添加文件,如果是压缩文件也解压
COPY 添加文件,以复制的形式
ENTRYPOINT 容器进入时执行的命令

image-1666335640226

build

docker build -t nginx:v3 .

示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签),最后的 . 代表本次执行的上下文路径。

ADD与COPY

COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,从上下文目录中复制文件或者目录到容器里指定路径。不同之处如下:

ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

CMD

CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

CMD 在docker run 时运行。
RUN 是在 docker build。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

ENTRYPOINT

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

VOLUME

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

作用:

避免重要的数据,因容器重启而丢失,这是非常致命的。
避免容器不断变大。
格式:

在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

EXPOSE

EXPOSE <端口1> [<端口2>...]

仅仅只是声明端口。

作用:

帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

WORKDIR

WORKDIR <工作目录路径>

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

错误汇总

拉取不到镜像

[internal] load metadata for docker.io/library/centos7:alpine:
failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head “https://mirror.baidubce.com/v2/library/centos7/manifests/alpine?ns=docker.io”: unable to connect to 106.39.162.224:443. Do you need an HTTP proxy?

image-1666578385541

找不到镜像

pull access denied for centos7, repository does not exist or may require ‘docker login’: denied: requested access to the resource is denied

写法错误

# 原来的写法
FROM centos7
# 更正后的写法
FROM centos:centos7

PHP + Nginx环境编写

Dockerfile

FROM centos:centos7

LABEL author="TUTU" 

# 暴露端口
EXPOSE 80 443
# 安装工具

# 切换目录
WORKDIR /usr/local/src
# 设置变量,执行命令时,就可以省略前缀目录了 
ENV PATH /usr/local/nginx/sbin:$PATH

# 拷贝本地目录
COPY ./nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf
COPY ./nginx/vhost /usr/local/nginx/conf/conf.d
# 项目目录
COPY ./codes /usr/local/nginx/html

# 添加远程文件
ADD http://nginx.org/download/nginx-1.17.0.tar.gz .
RUN yum -y update && \
    tar zxvf nginx-1.17.0.tar.gz && cd nginx-1.17.0 && \
    # 安装扩展
    yum -y install wget net-tools gcc gcc-c++ glibc make autoconf zlib zlib-devel pcre pcre-devel openssl openssl-devel && \
    yum -y install nginx libxslt-devel -y gd gd-devel GeoIP GeoIP-devel epel-release php php-fpm && \
    # 添加nginx用户
    useradd -M -s /sbin/nologin nginx && \
    # 编译
    ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_degradation_module --with-http_stub_status_module && make && make install

# 运行php和nginx
CMD /usr/sbin/php-fpm -D && /usr/local/nginx/sbin/nginx -g "daemon off;"

./nginx/conf/nginx.conf

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    include ./conf.d/*.conf;
}

./vhost/default.conf

server {
    listen       80;
    server_name  127.0.0.1;

    location / {
        root   /usr/local/nginx/html;
        index  index.php index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/local/nginx/html;
    }

    location ~ \.php$ {
        root           /usr/local/nginx/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

./codes/index.php

<?php

phpinfo();

构建运行

docker build -t php-test:v1 .
docker run --name php-env -d -p 80:80 -p 443:443 php-test:v1

访问:127.0.0.1
image-1666597378987