• Dockerfile之nginx(六)


    一、Dokcerfile的基本指令
     
    1)From 指定构建镜像的基础镜像
    2)MAINTAINER 指定镜像的作者
    3)RUN 使用前一条指令创建的镜像生产容器,并在容器中执行命令,执行结束后会自动提交成为新的镜像
    4)CMD 为容器提供运行时的默认值,作为容器启动的默认第一条指令,在Dockerfile只有一条,有多条的话以最后一条为准
    5)LABEL 为生成的镜像添加描述信息,可以使用inspect查看
    6)EXPOSE 申明容器在运行时将会监听的特定端口,即对外暴露的端口,但要真正暴露还是要在run时使用-p或-P指定,不能使用EXPOSE做端口映射
    7)ENV 设置环境变量,作用于Docker后续的所有指令,而且还会作用于生成镜像所创建出来的容器中
    8)ADD 从复制文件到镜像中,可以是文件、目录、甚至是url;也可以是绝对路径,也可以是相对路径
    9)COPY 从复制文件到镜像中,比起ADD,只能复制本地文件
    10)ENTRYPOINT 为容器提供运行时的默认值,不同于cmd的是ENTRYPOINT只能传入指令,而CMD还可以传入参数
    11)VOLUME 建立挂载点
    12)USER 设置用户名会uid
    13)WORKDIR 指定工作目录,该目录可以用于RUN,CMD,ENTRYPOINT,COPY和ADD指令,可以是绝对目录,也可以是相对目录
    14)ONBUILD 为镜像添加触发器,可以使用inspect查看。当该镜像被作为其他Dokcer中From指令的参数时,ONEBUILD注册的指令会按顺序执行,构建完成后,触发器指定被删除。注意ONEBUILD不能被嵌套
     
    二、实战
     
    1:在我自己的虚拟机上登录我在阿里云搭建的docker镜像仓库 (账号密码有需要的话私聊,哈哈)
     
    docker login www.lereun.com:5000 
     
     
     
    2:查看远端仓库的私有镜像有哪些
     
    curl -u 账号:密码 https://www.lereun.com:5000/v2/_catalog
     
     
     
    3:下载centos基础镜像
     
    docker pull www.lereun.com:5000/centos
     
     
     
    4:下载完成后,docker images 查看镜像
     
     
     
    5:创建一个目录,用于存放需要用到的包和Dockerfile文件
     
    mkdir /root/Docker
     
    把nginx的压缩包放在此目录下,并在这目录下编写Dockefile文件
     
     
     
    Dockerfile的内容如下:
     
    #基础镜像
    FROM www.lereun.com:5000/centos
     
    #维护者
    MAINTAINER 836217653@qq.com
     
    #把nginx的压缩包拷贝至/usr/local/docker下并解压
    ADD nginx-1.12.2.tar.gz /usr/local/docker
     
    #安装依赖包
    RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
    RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
    RUN useradd nginx
     
    #改变当前路径,相当于cd进去了
    WORKDIR /usr/local/docker/nginx-1.12.2
     
    #编译安装
    RUN ./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_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
     
    #添加环境变量
    ENV PATH /usr/local/nginx/sbin:$PATH
     
    #运行nginx,这样在启动容器的时候就不需要再带nginx启动
    CMD /bin/sh -c 'nginx -g "daemon off;"'
     
    EXPOSE 80
     
     
    6:构建镜像
     
    docker build -t centos_nginx .
     
    查看镜像时可以看到:
     
     
     
    7:启动基于该镜像的容器,测试访问nginx是否能成功
     
    先创建将挂载的目录
     mkdir -p /docker/nginx
     
    启动容器:
    docker run -d -p 8070:80 -v /docker/nginx/conf.d:/usr/local/nginx/conf/conf.d -v /docker/nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf -v /docker/nginx/log:/usr/local/nginx/logs centos_nginx
     
    这里会报错:
     
     
    意思是不能将nginx.conf文件映射到一个目录,所以这里还需做的一个操作就是在宿主机上拷贝一份nginx.conf到/docker/nginx目录下;这里得特别注意nginx的配置文件的一些路径,否则启动不起来,启动不起来可以查看docker的日志文件/var/log/message里
     
    nginx的配置文件:
    user nginx nginx;
     
    worker_processes 8;
    error_log logs/error.log info;
    pid logs/nginx.pid;
    worker_rlimit_nofile 65535;
     
    events {
    use epoll;
    worker_connections 65535;
    }
     
    http {
    include mime.types;
    default_type application/octet-stream;
     
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
     
    server_tokens off;
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 65;
    gzip on;
     
    include /usr/local/nginx/conf/conf.d/*;
     
    server {
    listen 80;
    server_name localhost;
     
    location /{
    index index.php index.html index.htm;
    }
     
    }
     
    }
     
    docker正常启动如下:
     
    注:
    -p 8070:80 表示将容器的80端口映射到宿主机的8070端口
    -v /docker/nginx/conf.d:/usr/local/nginx/conf/conf.d   左边为宿主机目录,右边为docker下目录
    -v /docker/nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf
    -v /docker/nginx/log:/usr/local/nginx/logs
    这里我的理解就是:把docker里的nginx的配置文件和日志目录等挂载出来,可以直接在宿主机上更改
     
    查看是否启动:docker ps -l
     
    docker container ls
     
    8、测试
     
    测试一:访问本机的8070端口
     
     
    测试二:修改挂载目录下的nginx配置文件,看是否生效
     
    在server里添加一段:
    location /testdocker{
        return 520;
    }
     
    重启该容器:
    docker container restart 0177578edf39
     
     
    测试访问:可以看到是访问成功的,说明在docker容器使用的nginx配置文件就是宿主机的这一个
     
     
    也可以进入到挂载的日志目录,访问日志与错误日志都是在的
     
     
    测试三:删除该容器后,挂载在容器的目录是否还在存在
     
     
    查看挂载的目录还是存在的
     
     
     
    9、将此docker镜像上传到自己的仓库
     
    1)修改docker的配置文件:vim /etc/docker/daemon.json 添加我自己的私有仓库地址
    {
        "insecure-registries": [
            "www.lereun.com:5000"
        ]
    }
     
    2)重启docker
    systemctl restart docker
     
    3)将centos_nginx tag一下
    docker tag centos_nginx www.lereun.com:5000/centos_nginx
     
    4)push到私有仓库
     
     
    在自己的私有仓库端查看镜像,或者使用curl查看
     
     
    10、Docker里nginx为何不在后台运行
     
    在Dockerfile里可以看到,运行nginx的时候是这样的:nginx -g "daemon off;“
     
    原因:
    docker容器会把容器内第一个进程,也就是pid=1的程序作为容器是否正在运行的一句,如果docker容器pid挂了,那么docker容器变回直接退出;docker run的时候把command作为容器的内部命令,如果使用nginx,nginx将在后台运行,这个时候nginx并不是pid为1的程序,而是执行的bash;bash执行完nginx启动命令后就关了,所以容器也就退出了
     
    在上面的例子中,nginx在后台启动时,可以查看挂载出来的日志目录,看到nginx的pid为1
     
     
     
    nginx配置文件、Dockerfile、及nginx的安装包: https://gitee.com/lemon_le/docker_nginx
     
  • 相关阅读:
    iOS
    iOS
    iOS
    iOS
    iOS(WKWebView)OC与JS交互 之三
    iOS(UIWebView 和WKWebView)OC与JS交互 之二
    CentOS VMware 下SSH配置方法详解
    15个nosql数据库
    MySql 优化
    Elasticsearch 相关名词理解
  • 原文地址:https://www.cnblogs.com/lemon-le/p/9210268.html
Copyright © 2020-2023  润新知