今天自己摸索了怎么用docker部署web应用,权作记录,关于docker和nginx的正确使用建议参考官方文档。
安装docker
centos环境下可以使用yum下载和安装docker,参考官网文档,里面还有其他系统的,步骤非常详细,而且永远是最新最正确的。
安装nginx镜像
获取镜像
安装docker之后,执行命令
docker pull nginx
拉取nginx官方镜像。
查看镜像
执行命令
docker images
查看已安装的镜像,可以看到nginx
启动容器
执行命令
docker run -d --name nginx -p 8888:80 nginx
使用nginx镜像启动一个容器实例
- run命令:创建一个新的容器并运行
- -d:后台运行
- –name nginx:–name选项为容器命名为nginx
- -p 8888:80:端口映射,(实际端口):(容器内部端口),通过本机的实际端口访问容器内部端口,即这样设置后可以通过本机的8888端口访问我们创建的这个nginx容器的80端口
- nginx:镜像名
用命令
docker ps
查看运行中的容器
创建新容器用于部署
平时将应用部署到nginx上时,需要把前端打好包的dist文件夹放到html文件夹,然后修改nginx.conf配置文件配置代理等等,这是最基本的两个需求。容器化后的nginx怎么修改这两个地方呢?docker提供了 -v 选项,可以将容器内的目录挂载到本地目录,对本地目录内容的修改就可以反映到容器内。
创建挂载目录
首先,我在/usr/local目录下创建了docker/nginx文件夹放置我的nginx配置。
cd /usr/local
mkdir docker
cd docker
mkdir nginx
cd nginx
然后,我这里使用docker的 cp 命令将上面启动的第一个nginx容器内的nginx.conf复制进来
docker cp nginx:/etc/nginx/nginx.conf nginx.conf
- nginx:/etc/nginx/nginx.conf :这里nginx是我上面创建的容器名,如果创建容器时没有为容器命名的话可以用命令
docker ps
查看容器名,或者用容器id代替。冒号后面是文件在容器内的目录
最后,创建html文件夹
mkdir html
现在/usr/local/docker/nginx目录下面是这样的
移除旧容器
上面旧的容器没用可以删掉了,使用命令
docker stop nginx
将容器停掉,再用命令
docker rm nginx
移除容器
这时输入
docker ps -a
查看所有已创建的容器,发现nginx已经没有了,接下来可以创建一个新的nginx容器了
创建新容器
输入命令
docker run -d --name nginx -p 80:80 \
-v /usr/local/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/docker/nginx/html:/usr/share/nginx/html \
nginx
- -p 80:80:我这里直接用本地的80端口映射容器的80端口
- -v /usr/local/docker/nginx/nginx.conf:/etc/nginx/nginx.conf:-v选项挂载本地文件/usr/local/docker/nginx/nginx.conf到容器文件/etc/nginx/nginx.conf,部署时修改本地的nginx.conf配置文件就可以了
- -v /usr/local/docker/nginx/html:/usr/share/nginx/html:和上面一样,将本地目录挂载到容器目录
命令执行后新的nginx容器就跑起来了,可以用docker ps
命令看看状态是否正常,浏览器输入你的ip地址就可以看到熟悉的nginx欢迎页面了。
关于容器内的目录是怎么获取的,我也是看别人的博客的。有日志需求的可以将本地目录挂载到/var/log/nginx,在本地查看nginx日志;无论挂不挂载都可以用docker logs nginx
命令查看日志(这里的nginx是容器名或容器id,所有容器都可以用这个命令查看日志)
部署应用
部署应用就和以往一样,在上面创建的nginx.conf里写好后端服务的代理等等,把前端打好的包丢进上面创建的html文件夹就行
附上我的nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# root '/usr/local/nginx/html/dist';
root /usr/share/nginx/html/dist;
#root这里填了容器中的绝对路径
#我填相对路径如html/dist时
#容器会去/etc/nginx/html/dist找
index index.html index.htm;
}
location /api {
#这里是后端的设置,根据你的实际情况写
rewrite ^/api/(.*)$ /$1 break;
proxy_pass localhost:8087;
}
}
}
配置修改后使用命令
docker kill -s HUP nginx
使配置生效,或者直接重启容器
docker restart nginx
到这里利用docker容器化nginx部署就完成了,输入地址访问你的应用,和非容器方式部署时并没有什么不同。