一、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: 
 
 
 
2:查看远端仓库的私有镜像有哪些
 
curl -u 账号:密码 https://www.lereun.com:5000/v2/_catalog
 
 
 
3:下载centos基础镜像
 
docker pull www.lereun.com:/centos
 
 
4:下载完成后,docker images 查看镜像
 
 
 
5:创建一个目录,用于存放需要用到的包和Dockerfile文件
 
mkdir /root/Docker
 
把nginx的压缩包放在此目录下,并在这目录下编写Dockefile文件
 
 
 
Dockerfile的内容如下:
 
#基础镜像
FROM www.lereun.com:/centos #维护者
MAINTAINER @qq.com #把nginx的压缩包拷贝至/usr/local/docker下并解压
ADD nginx-1.12..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. #编译安装
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
 
 
6:构建镜像
 
docker build -t centos_nginx .
 
查看镜像时可以看到:
 
 
 
7:启动基于该镜像的容器,测试访问nginx是否能成功
 
先创建将挂载的目录
 mkdir -p /docker/nginx
 
启动容器:

docker run -d -p : -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 ;
error_log logs/error.log info;
pid logs/nginx.pid;
worker_rlimit_nofile ; events {
use epoll;
worker_connections ;
} 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 ;
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: 表示将容器的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 ;
}
 
重启该容器:
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:/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
 

Dockerfile之nginx(六)的更多相关文章

  1. 使用dockerfile构建nginx镜像

    使用dockerfile构建nginx镜像 docker构建镜像的方法:   commit.dockerfile 1.使用commit来构建镜像: commit是基于原有镜像基础上构建的镜像,使用此方 ...

  2. Dockerfile构建nginx镜像

    Dockerfile构建nginx镜像 [root@bogon ~]# mkdir /opt/docker-file [root@bogon ~]# cd /opt/docker-file/ [roo ...

  3. Docker Alpine Dockerfile 安装nginx,最小镜像

    Docker Alpine Dockerfile 安装nginx,最小镜像 FROM alpine MAINTAINER will ## 将alpine-linux:apk的安装源改为国内镜像 RUN ...

  4. dockerfile构建nginx并结合php

    转自:https://www.cnblogs.com/jsonhc/p/7799358.html 查看nginx和php的目录结构: [root@docker docker_demo]# tree n ...

  5. 9、Dockerfile实战-Nginx

    上一节我们详解Dockerfile之后,现在来进行实战.我们通过docker build来进行镜像制作. build有如下选项: [root@localhost ~a]# docker build - ...

  6. 通过dockerfile构建nginx

    上次 利用命令行的形式来构建nginx服务, http://www.cnblogs.com/loveyouyou616/p/6806788.html 这次利用dockerfile文件来构建nginx服 ...

  7. centos7 Dockerfile安装nginx

    1.写一个Dockerfile文件 FROM centos MAINTAINER apeng apeng@apenglinux-002.com RUN yum install -y pcre-deve ...

  8. dockerfile+ubuntu+nginx搭建web环境

    准备目录 [root@izchz ~]# mkdir /usr/local/dockerfile1 该目录下准备Dockerfile文件 FROM ubuntu MAINTAINER xbf RUN ...

  9. dockerfile构建nginx

    mkdir docker_demo cd docker_demo wget http://nginx.org/download/nginx-1.2.9.tar.gz vim Dockerfile FR ...

随机推荐

  1. HRBUST 1186 青蛙过河 (思路错了)

    在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串 ...

  2. ES6标准之箭头函数

    语法 具有一个参数的简单函数 var single = a => a single('hello, world') // 'hello, world' 没有参数的需要用在箭头前加上小括号 var ...

  3. Centos 中 service iptables stop 失败

    Centos7中的防火墙调整为firewalld,试一下systemctl stop firewalld关闭防火墙.

  4. yii中的restful方式输出并调用接口和判断用户是否登录状态

    //创建一个控制器接口 返回的是restful方式 <?php namespace frontend\controllers; use frontend\models\Fenlei; use f ...

  5. 『OpenCV3』霍夫变换原理及实现

    霍夫变换常用于检测直线特征,经扩展后的霍夫变换也可以检测其他简单的图像结构. 在霍夫变换中我们常用公式 ρ = x*cosθ + y*sinθ 表示直线,其中ρ是圆的半径(也可以理解为原点到直线的距离 ...

  6. hdu6133 Army Formations 线段树合并

    给你一棵有n个节点的二叉树,每个节点有一个权值,对于一棵子树u,将u的子树中的节点权值从大到小排序,令sz[u]为子树u的大小, 则ans[u] = 1 * a[1] + 2 * a[2] + ... ...

  7. 如何从零开始在github上新建项目

    准备工作: (1)安装git: Git-2.16.1-64-bit.exe (2)新建一个文件夹grpc007,作为本地git仓库 (3)进入到grpc007目录,右键/打开git bash.使用gi ...

  8. Oracle DB 使用RMAN恢复目录

    • 对恢复目录和RMAN 资料档案库控制文件的使用进行比较• 创建和配置恢复目录• 在恢复目录中注册数据库• 同步恢复目录• 使用RMAN 存储脚本• 备份恢复目录• 创建虚拟专用目录 RMAN 资料 ...

  9. 牛客网多校第3场C-shuffle card 平衡树或stl(rope)

    链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there ...

  10. 使用 udev 高效、动态地管理 Linux 设备文件

    本文转自:https://www.ibm.com/developerworks/cn/linux/l-cn-udev/index.html 概述: Linux 用户常常会很难鉴别同一类型的设备名,比如 ...