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、数据库等等,也可以这样。

引用

目录
相关文章
|
7天前
|
人工智能 API 数据库
FastGPT一站式解决方案[1-部署篇]:轻松实现RAG-智能问答系统(含sealos云端部署、docker部署、OneAPI&Xinference模型接入)
【9月更文挑战第5天】 FastGPT一站式解决方案[1-部署篇]:轻松实现RAG-智能问答系统(含sealos云端部署、docker部署、OneAPI&Xinference模型接入)
 FastGPT一站式解决方案[1-部署篇]:轻松实现RAG-智能问答系统(含sealos云端部署、docker部署、OneAPI&Xinference模型接入)
|
17天前
|
Docker 容器
Docker自建仓库之Harbor高可用部署实战篇
关于如何部署Harbor高可用性的实战教程,涵盖了从单机部署到镜像仓库同步的详细步骤。
57 15
Docker自建仓库之Harbor高可用部署实战篇
|
17天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
16天前
|
虚拟化 Docker Windows
window 10专业版部署docker环境
本文介绍了如何在Windows 10专业版上部署Docker环境,包括安装步骤、配置镜像加速以及可能遇到的错误处理。
41 2
window 10专业版部署docker环境
|
5天前
|
Devops jenkins 持续交付
DevOps实践:构建和部署一个Docker化的应用
【9月更文挑战第14天】在当今快节奏的软件开发领域,DevOps已经成为提升效率、加速交付的关键。本文将引导你理解DevOps的核心概念,并通过一个实际的示例—构建和部署一个Docker化的应用—来深入探讨其实践方法。我们将从简单的应用出发,逐步实现Docker容器化,并最终通过CI/CD流水线自动化部署过程。这不仅是对DevOps流程的一次实操演练,也是对现代软件开发理念的一次深刻体验。
|
14天前
|
Cloud Native 持续交付 Docker
云原生技术实践:Docker容器化部署教程
【9月更文挑战第4天】本文将引导你了解如何利用Docker这一云原生技术的核心工具,实现应用的容器化部署。文章不仅提供了详细的步骤和代码示例,还深入探讨了云原生技术背后的哲学,帮助你理解为何容器化在现代软件开发中变得如此重要,并指导你如何在实际操作中运用这些知识。
|
17天前
|
NoSQL 关系型数据库 数据库
JumpServer的Docker部署实战案例
JumpServer的Docker部署实战案例,详细介绍了JumpServer的概述、环境准备、基于Docker的快速部署步骤,以及如何访问JumpServer的WebUI。
19 0
|
5天前
|
弹性计算 运维 持续交付
探索Docker容器化技术及其在生产环境中的应用
探索Docker容器化技术及其在生产环境中的应用
33 5
|
17天前
|
监控 数据管理 pouch
Docker容器技术概览
关于Docker容器技术的概览,包括Docker的优势、劣势、核心技术、容器所依赖的技术,以及Docker容器的管理和编排工具。
45 7
Docker容器技术概览
|
17天前
|
NoSQL 应用服务中间件 Redis
Docker跨宿主机容器通信-通过网络跨宿主机互联
这篇文章介绍了Docker容器跨宿主机通信的实现方法,包括Docker的四种网络模式(host、none、container、bridge)以及如何通过修改网络配置和添加路由规则来实现不同宿主机上的容器之间的互联。
48 0
Docker跨宿主机容器通信-通过网络跨宿主机互联