Docker 使用入门,创建一个Nginx服务器

Stella981
• 阅读 904

运行环境: MAC

Docker 版本: Docker version 17.12.0-ce, build c97c6d6

一、启动Nginx 服务器

启动Nginx 服务器,并进入模拟终端

docker run -p 8080:80 --name nginx_web -it  nginx /bin/bash

二、了解Nginx 镜像的配置文件位置

日志文件位置:/var/log/nginx
配置文件位置: /etc/nginx
资源存放的位置: /usr/share/nginx/html


**上面的配置路径是我电脑上的虚拟linux中地址,请各位读者,也自己去看下自己的配置位置**

三、修改Nginx 的默认首页,测试是否可以运行

重要提示: 对于不想折腾的同学,可以直接从第四步来运行

/usr/share/nginx/html

echo "<h1>Hello Docker</h1>" > index.html


**到这里有的朋友,可能会发现,我访问localhost:8080 端口,第一次出现了Nginx 的欢迎界面,而第二次就出现了404 提示。**

关于这个问题,本文不展开详序,如果不明白的,可以参考:

  1. docker运行nginx为什么要使用 daemon off
  2. docker容器运行后退出,怎么才能一直运行?
  3. Docker run 命令的使用方法

Docker 执行 docker run 之后,先在当前操作系统的基础上,虚拟化了一个精简版的linux(仅仅包含系统运行的最精简功能),然后加载我们的Nginx镜像。当Nginx镜像加载到我们的虚拟Linux环境中时,相当于在系统里执行了一个脚本,而这个脚本就是Nginx。

由于默认的Nginx 是不作为守护进程运行的。所以当Docker内监听到80端口的请求后,完成之后,就退出了Nginx的进程。该容器内只有一个进程,并且是非守护的,执行完请求进程就销毁了。那么这个容器也就没有存在的必要了,所以Docker 中这个服务也就停掉了。这也就是我们执行 docker top 看不到当前运行的容器的原因。

作为暂时解决Nginx 只执行一次就退出的问题,我们可以进入交互式终端,执行 nginx & 让nginx 作为守护进程后台运行。


查看我们正在运行的容器

roverliang$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

如果什么内容都没有,说明当前没有正在运行的容器。

查看已经运行结束的容器

roverliang$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                  NAMES
5bff285f60b3        nginx               "/bin/bash"              9 minutes ago       Exited (0) 6 minutes ago                           nginx_web


> 重新启动我们刚刚启动过的容器

docker start nginx_web


> 进入到我们的容器内部

docker attach nginx_web

echo "<h1>Hello Docker</h1>" > /usr/share/nginx/html/index.html

nginx & 

然后 使用快捷键 control + Q 退出当前的容器

之后我们在浏览器再次访问:http://localhost:8080/


**折腾了这么久,终于看到我们期望的的内容了。**


Hello Docker

四、将前面Nginx Demo 变成一个可以玩的 Demo

先创建我们本机需要映射的文件夹

 mkdir -p  docker_study/log  docker_study/etc docker_study/html

注意: 在自己的家目录创建


复制我们docker中nginx 的配置文件

docker cp 65bc23f952db:/etc/nginx/ /Users/roverliang/docker_study/etc/

关闭掉我们的容器

docker stop nginx_web


> 删除掉我们的练习的demo,我们重新来构建一个可以用的。

docker rm nginx_web


> 将Nginx 镜像和我们本机的目录进行映射,方便我们修改文件

docker run \
-p 8080:80 \
--name nginx_web \
-v /Users/roverliang/docker_study/log/:/var/log/nginx \
-v /Users/roverliang/docker_study/etc/nginx.conf:/etc/nginx/nginx.conf \
-v /Users/roverliang/docker_study/html/:/usr/share/nginx/html \
-it \
-d \
nginx \
/bin/bash \

运行到这里,我们可能还是会发现访问http://localhost:8080/ 没有内容。但是不要急,解决问题的过程,就是学习新东西的过程,继续网上查资料,参考如下:

Docker运行nginx

摘抄文中让我豁然开朗的一段:

我之前运行的时候,一般都采用交互式: -i 保证容器的stdin开启-t 为容器生成一个tty终端,在命令的最后加一个/bin/bash来保证可以交互。但是实际上,nginx并没有运行,导致我以为容器的端口绑定不是持久化的。

接下来我们需要关掉,并删除我们的容器,再按照如下的命令重启一个:

docker run \
-p 8080:80 \
--name nginx_web \
-v /Users/roverliang/docker_study/log/:/var/log/nginx \
-v /Users/roverliang/docker_study/etc/nginx.conf:/etc/nginx/nginx.conf \
-v /Users/roverliang/docker_study/html/:/usr/share/nginx/html \
-d \
nginx 

五、修改Nginx 配置,解析一个网站

修改我们刚刚复制过来的nginx 配置

cd /Users/roverliang/docker_study/etc
vim nginx.conf

在Http 模块中添加如下配置:
 server
    {   
        listen 80; 
        server_name www.test_nginx.com;
        index index.html;
        root /usr/share/nginx/html;
    }   

然后回到宿主机,绑定host 127.0.0.1      www.test_nginx.com

大功告成

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这