在上一篇文章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>
...