在上一篇文章Docker中搭建nginx服务(一)中,通过nginx提供的官方镜像很简单的就把nginx服务搭建起来了,但通过这种方式,我们服务的nginx.conf文件、证书文件等都要通过绑定的方式将本地文件映射到docker文件系统中,这样在实际工程中并不方便,我们可能更希望这些文件直接放置在docker文件系统中,这样更方便部署。这样我们就必须自已编写dockerfile文件来实现,下面主要讲解如何通过dockerfile来搭建nginx服务。

1.1 工作目录

在本地建立一个工作目录,将需要放置到docker文件系统中的文件都放在此处,如nginx.conf文件、证书文件等。

mkdir -p /root/docker_nginx
cd /root/docker_nginx

1.2 下载nginx源码包

可以在nginx官网中下载自已想要的版本,我这里选择nginx-1.18.0版本。

wget http://nginx.org/download/nginx-1.18.0.tar.gz

1.3 编写dockerfile文件

可以直接修改官方提供的dockerfile文件(如果看的懂),因为没看懂,所以尝试的自已写了一下:

FROM centos

MAINTAINER fengshenyun808@163.com

RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel gd-devel && \
	yum clean all && \
	rm -rf /var/cache/yum/*

ADD nginx-1.18.0.tar.gz .

RUN cd nginx-1.18.0 && \
	./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module && \
	make && make install && \
	mkdir -p /usr/local/nginx/ssl && \
	cd / && rm -rf nginx-1.18.*

ENV PATH $PATH:/usr/local/nginx/sbin
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
COPY www.fengshenyun.com.key /usr/local/nginx/ssl/www.fengshenyun.com.key
COPY www.fengshenyun.com.pem /usr/local/nginx/ssl/www.fengshenyun.com.pem
WORKDIR /usr/local/nginx

EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]

在网上查找了一些资料,熟悉了一下Dockerfile的语法,编译了多次才终于成功。(写这个就别怕出错,出不了啥事,不断根据提示的错误尝试就一定会成功)。

因为对centos系统的包管理更熟悉一点,所以选择在这上面构建nginx服务,这里要特别说明一个第9行的ADD nginx-1.18.0.tar.gz .这个语句。 可以看到通过ADD命令将包拷到docker文件系统后,并没有解压的操作,其实这个解压操作ADD命令帮你做了,并且做完后把nginx-1.18.0.tar.gz文件删掉了,所以你再去做的时候会报找不到nginx-1.18.0.tar.gz文件的错误。这也是ADD命令和COPY命令的区别之一。

1.4 构建dockerfile文件

在机器上执行如下命令:

docker build -t my_nginx:v2 -f Dockerfile .

执行完后,通过 docker images看到生成的镜像,如下:

[.. docker-nginx]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
my_nginx              v2                  622051d8eda2        4 minutes ago       429MB

1.5 运行服务

构建镜像成功并不意味着服务就可以跑起来了,可能路还长着呢。nginx服务运行失败会在error.log打印出错误的原因,因此运行时要把日志信息弄出来。执行如下命令:

docker run -p 80:80 -p 443:443 -v /root/docker-nginx/logs:/usr/local/nginx/logs --name fengshenyun01 -d my_nginx:v2

可以看到比上一篇文章的命令长度短了很多,主要是把端口和日志目录做了映射。

日志目录一定要通过映射,一是这样可以映射一个磁盘空间大的盘,还有就是把日志执久化,方便后续的日志分析。如果日志信息没有被映射,当运行的实例被删除时,日志会被清0。

执行 docker run通常不会失败,要想看服务是否正常跑起来,一定要用 docker ps看一下服务是否真的正在运行,如果没有就是运行失败了,去 /root/docker-nginx/logs目录看下error日志。如果有说明服务启动成功了。

[.. docker-nginx]# docker ps 
CONTAINER ID	IMAGE			COMMAND			CREATED			STATUS			PORTS   NAMES
51b46501a549    my_nginx:v2     "nginx -g "   	34 minutes ago  Up 34 minutes   0.0.0   fengshenyun01

1.6 验证

HTTP服务验证OK。

[.. docker-nginx]# curl "http://www.fengshenyun.com/index.html"
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
...

HTTPS服务验证OK。

[.. docker-nginx]# curl "https://www.fengshenyun.com/index.html"
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
...