docker部署静态项目 - 用实践理解docker

简介: docker部署静态项目 - 用实践理解docker

docker部署静态项目 - 用实践理解docker


本文入门尝试,利用 docker 环境,运行 nginx,部署静态网站项目,从而理解docker

服务器端项目的尝试,在后一篇文章。 练习两个项目,类似全栈部署,相信对docker会自然理解和基本使用了

Docker 是什么

Docker 是一个让应用和操作平台解耦的开源的应用容器引擎,其让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,该容器包含了应用程序的代码、运行环境、依赖库、配置文件等必需的资源,通过容器就可以实现方便快速并且与平台解耦的自动化部署方式,无论你部署时的环境如何,容器中的应用程序都会运行在同一种环境下。(更多详情请移步 docker 官网查看 docker)。

核心是解耦应用和平台,让其可移植,脱离操作系统

静态网站项目

建一个文件夹demo,里面建一个文件夹dist,增加index.htmlindex.css文件,随便写点什么。

创建nginx配置文件

项目根目录下,创建nginx文件夹,该文件夹下新建文件default.conf

该配置文件location定义了首页的指向为 /usr/share/nginx/html/index.html,所以可以一会把 dist的静态资源放到/usr/share/nginx/html 目录下。

server {
  listen       80;
  server_name  localhost;
  #charset koi8-r;
  access_log  /var/log/nginx/host.access.log  main;
  error_log  /var/log/nginx/error.log  error;
  # index.html的位置
  location / {
      root   /usr/share/nginx/html;
      index  index.html index.htm;
  }
  #error_page  404              /404.html;
  # redirect server error pages to the static page /50x.html
  #
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
      root   /usr/share/nginx/html;
  }
}

拉取nginx公共镜像

拉取nginx公共镜像

docker pull nginx

镜像名称组成结构:REPOSITORY[:TAG],TAG 默认为 latest,其他镜像命令:

  • 搜索镜像 - docker search [REPOSITORY[:TAG]]
  • 拉取镜像 - docker pull [REPOSITORY[:TAG]]
  • 查看镜像列表 - docker image ls
  • 删除镜像 - docker image rm [REPOSITORY[:TAG]]docker rmi [REPOSITORY[:TAG]]

创建Dockerfile文件

一般自定义构建镜像,是基于Dockerfile文件构建。

项目根目录下,创建Dockerfile文件

FROM nginx
COPY dist/ /usr/share/nginx/html/
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
  • FROM nginx是基于 nginx:latest 镜像而构建的。
  • COPY dist/ /usr/share/nginx/html/ 是将项目根目录dist文件夹下的所有文件复制镜像/usr/share/nginx/html/ 目录下。
  • COPY nginx/default.conf /etc/nginx/conf.d/default.conf 同理也是复制到镜像中,用本地的 default.conf 配置来替换nginx镜像里的默认配置。

自定义构建应用镜像

基于Dockerfile文件,自定义构建应用镜像:

docker build -t static_nginx_image .
  • -t 是给镜像命名
  • . 是基于当前目录的 Dockerfile 来构建镜像

基于镜像启动容器

启动容器,访问

docker run -p 3333:80 -d --name static_nginx_container static_nginx_image
  • docker run 是基于镜像启动一个容器
  • -p 3333:80 是端口映射,将宿主的 3333 端口映射容器的 80 端口
  • -d 是后台方式运行
  • --name 容器名,便于用docker ps 查看其进程

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

正因为是,类与实体的关系,可以基于同一镜像,构建多个容器。

比如上面的,再来个容器docker run -p 3334:80 -d --name static_nginx_container2 static_nginx_image访问

修改内容,需要重新构建镜像和启动容器

现在因为需要,修改网页的内容,此时就需要重新构建镜像和启动容器,因为上次构建镜像的时候,将未修改前的dist复制到镜像里了。

按照以下步骤,重新构建镜像和启动容器:

# 查看所有进程
docker ps
# 停止静态容器
docker stop web_container
# 删除静态容器 - 前提是容器处于停止状态
docker rm web_container
# 删除静态镜像 - 前提是没有容器使用该镜像
docker rmi web_image
# 重新构建静态镜像,加了接口就不是静态项目了,改个名
docker build -t web_image .
# 重新构建静态容器
docker run -p 3333:80 -d --name web_container web_image

此时访问http://localhost:3333,发现更新了

改进 - 无需重新构建镜像

正如上面,如果修改网页的内容,或者改了nginx配置,就需要重新构建镜像和容器,着实麻烦,怎么改进呢?

在构建镜像的时候 把 Nginx 配置或者项目内容复制到镜像中,而是直接挂载到宿主机上,这样每次修改配置后,直接重启容器即可~

1. 去掉 COPY

将之前静态项目的Dockerfile修改下,去掉后面的COPY

FROM nginx
# COPY dist/  /usr/share/nginx/html/
# COPY nginx/default.conf /etc/nginx/conf.d/default.conf

2. 带参数 - 重新运行容器

docker run \
-p 3333:80 \
-d --name web_container \
--mount type=bind,source=$HOME/others/code/docker_dist/nginx,target=/etc/nginx/conf.d \
--mount type=bind,source=$HOME//others/code/docker_dist/dist,target=/usr/share/nginx/html \
nginx
  • --mount type=bind,source={sourceDir},target={targetDir} 将宿主机的 sourceDir 挂载到容器的 targetDir 目录上。

主要将之前COPY的配置文件和dist文件夹,直接挂载到容器里。

命令太长,可以折行写,末尾是反斜杠+回车,为了方便,可以在根目录下,新建文件container.sh,将上面复制进去,执行的时候sh container.sh

于是,重新生成镜像和启动容器

docker stop web_container
docker rm web_container
# 先停止之前的容器,删掉镜像
docker rmi web_image
# 项目路径下,重新生成网站镜像,这里就没有COPY了
docker build -t web_image .
# 项目路径下,重新启动容器
sh container.sh

以后修改nginx配置,就重启容器就好docker restart web_container,而修改内容则不需要重启容器,会自动更新。

可移植性和解耦的表现

任意电脑,拉取项目和安装docker,然后拉取nginx镜像,运行之后的构建镜像和容器的命令,即可成功访问页面。

不需要管不同操作系统下,怎么安装nginx,这就是解耦

同理Node、数据库等等,也可以这样。

引用

目录
相关文章
|
11天前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
3天前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
61 44
|
1天前
|
数据采集 存储 Docker
深入理解Docker:为你的爬虫项目提供隔离环境
本教程介绍如何使用Docker构建隔离环境,运行Python爬虫项目,采集小红书视频页面的简介和评论。主要内容包括: 1. **Docker隔离环境**:通过Docker容器化爬虫,确保环境独立、易于部署。 2. **代理IP技术**:利用亿牛云爬虫代理突破反爬限制。 3. **Cookie与User-Agent设置**:伪装请求头,模拟真实用户访问。 4. **多线程采集**:提高数据采集效率。 前置知识要求:Python基础、Docker基本操作及HTML解析(可选)。教程还涵盖常见错误解决方法和延伸练习,帮助你优化爬虫代码并避免陷阱。
深入理解Docker:为你的爬虫项目提供隔离环境
|
25天前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
56 23
|
15天前
|
SQL Java Maven
docker部署apollo
docker部署apollo步骤
|
26天前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
48 22
|
29天前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
62 25
|
30天前
|
SQL 关系型数据库 MySQL
docker-compose部署mysql8
使用docker-compose容器化部署mysql8
|
6月前
|
运维 Java Devops
阿里云云效操作报错合集之部署docker时遇到报错,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
运维 Kubernetes 前端开发
【云原生】阿里云服务器部署 Docker Swarm集群
阿里云服务器 一键部署 Docker Swarm 集群!
720 0
【云原生】阿里云服务器部署 Docker Swarm集群

热门文章

最新文章