一、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. [python]上传文件验证

    上传文件验证 上传文件验证分为:1.文件头验证 2.文件类型验证 3.文件后缀验证 获取文件上传的二进制数据 # 获取上传文件 file = request.files.get('file') if ...

  2. [Database] Oracle 中的where 可以后接group by

    SELECT e.DEPTNO,COUNT(e.EMPNO) FROM emp e WHERE e.DEPTNO=10 GROUP BY e.DEPTNO

  3. week7 ls

    week7 ls 实现ls: 实现ls -l:

  4. script利用src引用外部js文件,如果内部嵌套了js代码呢

    <script src='test.js' defer async> var a = 5; </script> 这个时候 var a = 5;会被忽略.

  5. selenium java 文件上传、下载

    1.webdriver对页面文件的下载 我们一般操作浏览器下载时会让我们选择下载的目录然后经过一系列操作后才进行文件下载操作,但是用webdriver不能按这样的方式操作.经过查询资料找到了如下的实现 ...

  6. 菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理

    菜鸟脱壳之脱壳的基础知识(二)——DUMP的原理当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向O ...

  7. PAT 1073 Scientific Notation

    1073 Scientific Notation (20 分)   Scientific notation is the way that scientists easily handle very ...

  8. YAML基础语法

    正如YAML所表示的YAML Ain’t Markup Language,YAML 是一种简洁的非标记语言.YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读. 一边学习规则 ...

  9. .net core部署到Ubuntu

    1.使用vs2017创建Asp.net Core Web应用程序,选择ubuntu中安装的.net core版本,这里选择2.1版本: 2.右键发布该项目,选择文件系统发布: 3.在ubuntu中安装 ...

  10. GDAL源码编译(32位)

    GDAL源码编译(32位) 前言 GDAL:GDAL/OGR 是一个地理空间数据的格式转换及处理工具.官网:https://www.gdal.org/ swig:SWIG是个帮助使用C或者C++编写的 ...