docker基础
为什么需要学习Docker?
- 部分企业都在采用Docker来实现软件开发部署中的自动化和部署效率安全等问题
- 需要掌握一定的Docker技术来更好的配合后端和运维来推进这一过程
简介
参考:https://jspang.com/detailed?id=75#toc246
-
doker是一个容器,会把应用程序放在一个独立运作的容器中
-
有了docker,不用在意目标环境的情况,只需要保证docker容器运行正常,就可以将它放在任何机器中
简单来说:**容器就想一个打包工具,打包的不仅是你的程序,也包括运行环境。**就好比你把你的开发主机和开发程序完全复制了一份,别人拿到后就不需要搭建环境,也不需要根据环境进行调试,直接就可以运行了
为什么需要 Docker 部署?
用以隔离环境。
假设你有三个后端服务,分别用 Java、Go、Node 编写,你需要在服务器分别安装三者的环境,才能运行所有语言编写的代码,这对于开发者而言非常麻烦。
假设你有三个 Node 服务,分别用 node10、node12、node14 编写,你需要在服务器分别安装三个版本 nodejs 才能运行各个版本 nodejs 编写的代码,对于开发者而言也非常麻烦。
而有了 Docker,就没有这种问题,它可单独提供某种语言的运行环境,并同时与宿主机隔离起来。
使用Docker场景
- 1、后端可能会提供Docker镜像给到前端,需要启动这个docker容器,才能使用后端相关服务
- image镜像从 Docker Hub 或是 公司内部私有的镜像仓库 registry
- 2、把自己的前端包 构建成 Docker image 提供給其他人使用
- 3、直接用 Docker 來当作开发环境
原理:
安装:
window:
- 1、直接去Docker官网进行下载 https://docker.com
- 2、进入官网后,选择
Products(产品),然后选择Docker Desktop,进入下载页面,点击进行下载
注意:
- window需要开启BIOS虚拟化设置、Hyper-V和容器
- 需要打开Docker Desktop才能使用
linux:
# 卸载docker
sudo yum remove docker
# 使用脚本安装
curl -fsSL get.docker.com -o get-docker.sh
# 使用shell脚本安装,执行get-docker.sh脚本
sudo sh get-docker.sh
# 查看是否安装成功
docker version
# systemctl start命令,开启Docker服务端。
sudo systemctl start docker
docker命令
- 安装好docker,查看版本
docker -v
- 创建容器 :
docker container run < image name >
#创建nginx容器,如果找不到这个容器,会拉取这个容器镜像
docker container run nginx
- 从 Dockerfile 构建镜像 参考:https://docs.docker.com/engine/reference/commandline/image_build/
docker image build -t xx
- docker run: 运行创建docker容器
- -i : 以交互模式运行容器,通常与 -t 同时使用 【交互interactive】
- -t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用 【终端terminal】
- --detach : -d 以守护进程的方式让容器在后台运行 【detach】
- --name : 为容器指定名称
- --privileged: 让容器的用户在容器内能获取完全root权限
- -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
- /bin/bash : 在容器内执行/bin/bash命令
docker run -it -d --name myvue2 --privileged -p 8081:8080 -v /Users/eric/my-repository/my-app-vue2:/app/vue node:10.16.2 /bin/bash -c "cd /app/vue && node -v && npm install && npm run serve"
- docker exec在运行的容器中执行命令
docker exec -it gitlab-runner /bin/bash
- docker rm : 删除一个或多个容器
#强制删除容器 db01、db02:
docker rm -f db01 db02
#删除容器 nginx01, 并删除容器挂载的数据卷:
docker rm -v nginx01
- docker rmi 除一个或多个镜像
#强制删除本地镜像 runoob/ubuntu:v4。
docker rmi -f runoob/ubuntu:v4
- docker ps:列出所有容器
docker ps -a: 列出所有的容器
- 查看现在拥有的镜像列表
docker image ls
docker images
- docker pull :获取镜像
# 查看命令语法
docker pull
# 格式 docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker pull ubuntu:18.04
docker pull nginx
- 查看可用镜像
# 输入docker search命令搜索 Docker Hub 上可用的nginx、Jenkins 镜像:
docker search nginx
docker search jenkins
- 镜像推送到Cockerhub上, 其他人就可以使用你制作的镜像了
# 先登录Dockerhub账号
docker login
# 把q/node镜像推送到社区
docker image push q/node
容器相关操作
镜像和容器
镜像:就是像是我们装机时候需要的系统盘或者系统镜像文件,这里它负责创建docker容器的,有很多官方现成的镜像:node、mysql、monogo、nginx可以从远程仓库下载,可以把镜像看成面向对象编程中的只读类(read-only Class)。
容器和镜像几乎一模一样,唯一的区别是镜像是只读的,而容器上面有一个可读写层。所以容器=镜像+读写层。可以比拟成一个迷你的系统,例如一个只安装mysql5.7的linux最小系
- 容器是由镜像实例化而来, 简单来说,镜像是文件,容器是进程。
创建容器
image代表一个镜像的名称
docker container run < image name >
如果你想使用的镜像名称是nginx,就可以写成下面的样子。
docker container run nginx
如果是使用ubuntu镜像,命令就变成了下面的写法。
docker container run ubuntu
输入完成后,直接回车。如果系统中没有这个镜像,Docker会自动去Docker Hub上拉取对应的镜像到本地,然后执行对应的Shell脚本,脚本会把镜像自动安装到Doker容器里,并最终启动对于的镜像服务。
Docker Hub 是Docker官方的镜像和社区,里边有很多开发者制作好的镜像,我们可以直接使用这些镜像。如果你有能力,也可以制作镜像,并上传到Docker Hub。
运行docker容器
run命令运行创建docker容器
- -i : 以交互模式运行容器,通常与 -t 同时使用 【交互interactive】
- -t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用 【终端terminal】
- -d : 让容器在后台运行 【detach】
- --name : 为容器指定名称, 默认是随机
- --privileged: 让容器的用户在容器内能获取完全root权限
- -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
- --restart: 用于指定自动重启docker容器
- --restart=no : 默认值,容器退出时,docker不自动重启容器
- --restart=always : 容器退出时总是重启
- /bin/bash : 是在让容器分配的虚拟终端以 bash 模式执行命令
- -v :绑定一个卷 【volume】
- -c: CPU 份额
docker run -it -d --name myvue2 --privileged -p 8081:8080 -v /Users/eric/my-repository/my-app-vue2:/app/vue node:10.16.2 /bin/bash -c "cd /app/vue && node -v && npm install && npm run serve"
docker run只能创建启动一个docker容器,我们可以用docker-compose来一次启动多个容器,常用于单机下安装多个服务
启动、暂停、关闭、重启容器
# 启动一个已经停止的容器实例
docker start 容器ID或容器名
# 停止一个正在运行的容器
docker stop 容器ID或容器名
# 直接关闭容器
docker kill 容器ID或容器名
# 重启一个容器
docker restart 容器ID或容器名
Dockerfile理解
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。
可以简单总结为下面三点:
- Dockerfile是用于构建docker镜像的文件
- Dockerfile里包含了构建镜像所需的”指令“
- Dockerfile有其特定的语法规则(重要学习)
常见的Dockerfile配置解析
| 指令 | 示例 | 解释与功能 |
|---|---|---|
| FROM | FROM ubuntu:18.04 | 指定基础镜像,用作新镜像的基础。 |
| MAINTAINER | MAINTAINER John Doe | 标记维护镜像的人员信息(已被LABEL取代)。 |
| LABEL | LABEL maintainer="John Doe" | 添加自定义元数据标签到镜像,如维护者信息、版本等。 |
| RUN | RUN apt-get update && | 在容器内执行命令。通常用于安装软件、配置环境。 |
| CMD | CMD ["executable","param1"] | 容器启动后默认执行的命令。可被docker run命令行参数覆盖。 |
| ENTRYPOINT | ENTRYPOINT ["executable"] | 容器启动时始终执行的命令。与CMD不同,CMD会被覆盖,而ENTRYPOINT则会成为执行的命令的前缀。 |
| EXPOSE | EXPOSE 80 | 指定容器内应用程序使用的端口。在运行容器时,可以使用-p或者-P参数映射这些端口到主机。 |
| ENV | ENV MY_ENV_VAR=value | 设置环境变量,供容器内的应用程序使用。 |
| ADD | ADD src dest | 将本地文件/目录复制到容器中。如果src为URL,也可以用来下载并复制文件。 |
| COPY | COPY src dest | 类似于ADD,但只支持复制本地文件/目录。推荐使用COPY,除非需要自动解压缩远程文件或使用URL。 |
| WORKDIR | WORKDIR /path/to/directory | 设置容器内工作目录,后续命令将在此目录下执行。 |
| VOLUME | VOLUME /data | 声明持久化数据卷,用于容器内外的数据交换。【可理解为挂载数据】 |
| USER | USER username | 指定容器内部运行命令的用户名或UID。 |
| HEALTHCHECK | HEALTHCHECK CMD | 添加容器健康检查指令,用于检测容器是否运行正常。 |
| ARG | ARG build_version | 声明构建时传递的参数,类似于环境变量,但仅在构建过程中有效。 |
| ONBUILD | ONBUILD COPY | 在当前Dockerfile的基础上创建新的镜像时执行的命令。 |
| STOPSIGNAL | STOPSIGNAL SIGTERM | 设置容器停止时发送的信号。 |
| RUN | RUN command | 可以多次使用,每次都会在镜像构建期间执行。 |
| CMD | CMD command | 只能在Dockerfile中使用一次,指定容器启动时要运行的命令。 |
Dockerfile语法
- FROM: 指定基础镜像
- RUN:执行命令
# 基于ubuntu最新的版本镜像
FROM ubuntu:latest
# 下载安装Python环境
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.9 python3-pip python3.9-dev
# 添加脚本文件
ADD jspang.py /
# 运行脚本
CMD ["python3","jspang.py"]
COPY和ADD
COPY和ADD命令,在复制普通文件的时候,并没有什么太大的不同,两个命令都可以把本地文件,复制到镜像里,ADD 构建镜像和COPY最直观的一点不同,是ADD命令可以直接解压gzip压缩文件,这当我们有很多文件要上传操作的时候,就会变的简单很多。 【可以说ADD 命令基本上是 COPY 命令的超集】
- COPY
FROM node:14
# 把index.js文件,拷贝到app目录下面
COPY index.js /app/index.js
- ADD
- ADD 命令可以完成 COPY 命令的所有功能
- ADD还可以支持解压gzip压缩文件
FROM node:14
# 把index.tar解压拷贝到app目录下面
ADD index.tar /app/
ENTRYPOINT和CMD
- ENTRYPOINT和CMD都是让用户指定一个可执行程序
- 组合ENTRYPOINT和CMD能发挥更大的作用
组合使用ENTRYPOINT和CMD, ENTRYPOINT指定默认的运行命令, CMD指定默认的运行参数
- docker把CMD的命令拼接到ENTRYPOINT命令之后, 拼接后的命令才是最终执行的命令
FROM ubuntu:trusty
ENTRYPOINT ["/bin/ping","-c","3"]
CMD ["localhost"]
ENTRYPOINT和CMD的区别
- CMD设置的命令,可以在 docker container run / docker run 时传入其它命令,覆盖掉 CMD 的命令,但是ENTRYPOINT所设置的命令时一定会被执行的。
- ENTRYPOINT 和 CMD 可以联合使用, ENTRYPOINT 设置执行的命令,CMD传递参数。
ARG 和ENV
ARG和ENV是经常容易被混淆的两个Dockerfile语法,它们都可以用来设置一个“变量”
ARG和ENV的不同点:
总的来说ARG和ENV有两点不同,第一点是声明变量的作用域不同,第二点是ARG声明后,可以在构建时修改变量。
构建镜像
- 社区上如果没有合适的镜像,我们通常用Dockerfile来构建自定义镜像
构建的镜像,镜像里面包含所需要的环境
编写Dockerfile
Dockerfile文件(不需要后缀),键入以下指令
# 基于node11基础镜像
FROM node:11
COPY . ./demo
#类似于 `cd /demo`
WORKDIR /demo
# 一些元数据,比如作者信息
LABEL maintainer="deepred5 <deepred5@gamil.com>"
# 安装pm2
RUN npm install pm2 -g --registry=https://registry.npm.taobao.org
#容器启动后执行`node index.js`命令
CMD node index.js
# 暴露容器的端口
EXPOSE 80 443
FROM node:11就是说我们的镜像会继承 node:11 这个镜像WORKDIR /demo类似于cd /demo。CMD node index.js容器启动后执行node index.js命令。
创建镜像
build命令创建镜像
-
**-f :**指定要使用的Dockerfile路径;
-
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签
基于这个Dockerfile创建我们自己的镜像deepred5/node-pm2
docker build -t demo .
注意最后有一个.
查看我们自己的镜像
# 可以看到demo镜像了
docker images
基于demo镜像启动一个容器
docker run -it demo
进入容器后,我们运行pm2 -v,可以看见pm2已经安装成功了
上传镜像
我们本地构建的镜像如果希望可以被其他人使用,就需要把镜像上传到仓库。登录dockerhub,注册一个账户。
# 登入账户,输入用户名和密码
docker login
# 上传镜像
docker push deepred5/node-pm2:1.0
volume持久化
docker run的--volume/-v或--mount选项来创建带有数据卷的容器
--volume(或简写为-v)只能创建bind mount--mount : 参数
--mount默认情况下用来挂载volume,但也可以用来创建bind mount和tmpfs。如果不指定type选项,则默认为挂载volume,volume是一种更为灵活的数据管理方式,volume可以通过docker volume命令集被管理
volume命令
# 查看下主机上的卷
docker volume ls
# 将 my-image的/app目录映射到 /my-data 目录中
docker run -d -v my-data:/app my-image
# docker run命令启动一个新的容器,并且挂载 myvolume 卷
docker run -d --name=nginx --mount source=myvolume,target=/usr/share/nginx/html nginx
在启动一个容器的时候,可以使用-v,给容器中的volume起一个名字。比如还使用我们之前自己创建的镜像my-image。
docker container run -d -v <Volume name:Dockerfile VOLUME path> my-image
例如启动容器的时候给volume起个名字叫my-data,然后指定Dockerfile中的VOLUME命令路径。因为一个Dockerfile中可能有多个VOLUME命令,所以这里一定要准确指定路径。(注意是Dockerfile中VOLUME命令下的路径)。
docker run -d -v my-data:/app my-image
这时候再查看volume,这时候的VOLUME NAME就不是一大串类似ID的东西了,而是我们起的名字。
# docker volume ls
DRIVER VOLUME NAME
local my-data
Docker Compose
- 可以运行多个Docker容器的应用
- 可以通过一个单独的
docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。- 执行这个docker-compose.yml文件就可以启动我们想要的容器
在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等
docker-compose 中有两个重要的概念:
- 服务 (
service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。 - 项目 (
project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。
docker-compose命令:
# 启动容器
docker-compose up
# 停止容器
docker-compose stop
安装
- 如果你是Windows或者Mac安装了docker 桌面版本(desktop)以后,就默认安装了docker-compose工具了。可以直接进行使用
docker-compose --version
- linux用户可在官方推荐方法安装
Linux系统默认是没有安装docker-compose工具的,可以进入下面的网址。
https://docs.docker.com/desktop/
Product Manuals—>Docker compose—>Liunx后,可以看到三条命令,依次执行就可以安装docker-compose工具了
docker-compose.yml说明
云服务
在镜像仓库,把手动创建的镜像,部署到云端上
云服务:
- daocloud
docker资源限制配置
参考:https://www.cnblogs.com/edisonchou/p/docker_resource_limitation_introduction.html
docker运行nginx
nginx -g "daemon off;"理解
前台运行(daemon off)、后台运行(daemon on)
1、docker容器跑着为啥会挂掉?
- docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker 容器pid挂了,那么docker容器便会直接退出。
2、为什么要加 nginx -g "daemon off;" ?
-
当运行nginx的时候,nginx的pid进程为1,执行其他命令之后,pid为1进程不再是nginx,nginx会在后台运行,一旦执行完其他自定义命令之后,nginx容器也就退出了
-
因为要让容器能持续运行, 必须要有前台进程,常规的nginx是后台守护进程,设置为daemon off将nginx在前台运行, 让Docker 可以正确跟踪进程
在容器启动时启动 nginx 进程,并让 nginx 在后台运行,在实际部署中,这样做可以让 nginx 一直保持在运行状态,为前端应用程序提供静态文件服务
搭建私有内部镜像仓库
业务项目而言,一般会上传至公司内部的私有镜像仓库
1、可通过harbor 搭建的私有镜像仓库。
遇到问题
解决部署时间长
构建镜像时间过长、构建镜像大小过大
- 利用镜像缓存
- 可以通过缓存镜像中间结果来加速构建过程。可以通过在 Dockerfile 中使用
--cache-from参数来从其他已有的镜像中缓存中间结果。
- 可以通过缓存镜像中间结果来加速构建过程。可以通过在 Dockerfile 中使用
1、相对于项目的源文件来讲,package.json 是相对稳定的。如果没有新的安装包需要下载,则再次构建镜像时,无需重新构建依赖。则可以在 npm install 上节省一半的时间
2、对于 ADD 来讲,如果需要添加的文件内容的 checksum 没有发生变化,则可以利用缓存。把 package.json/package-lock.json 与源文件分隔开写入镜像是一个很好的选择。目前,如果没有新的安装包更新的话,可以节省一半时间
- CI 环境下的优化
- 多阶段构建
- 多阶段构建是一种将 Docker 镜像构建分成多个阶段的技术,可以减少镜像大小,加快构建速度。通过在每个阶段使用不同的基础镜像和指令来实现。
- 调整 Docker 配置:可以调整 Docker 的配置来提高其性能和稳定性,例如增加 Docker 的内存和 CPU 资源限制,优化 Docker 的存储驱动和网络配置等。
- 使用对象存储服务 (OSS)
总结:
1、镜像中使用基于 alpine 的镜像,减小镜像体积。 2、镜像中需要锁定 node 的版本号,尽可能也锁定 alpine 的版本号,如 node:10.19-alpine3.11。(我示例代码中未如此详细地指出) 3、选择合适的环境变量 NODE_ENV 及 PROJECT_ENV,如在测试环境下进行构建 4、npm ci 替代 npm i,避免版本问题及提高依赖安装速度 5、package.json 单独添加,充分利用镜像缓存 6、使用多阶段构建,减小镜像体积
7、如有必要,静态资源请上 CDN
应用场景
构建自己的前端开发镜像
创建一个react项目,如使用create-react-app来搭建,在项目根目录创建Dockerfile文件
#基于node:15.10.0-slim镜像
FROM node:15.10.0-slim镜像
# 将当前目录拷贝到镜像的/demo目录
COPY . ./demo
# 类似于 cd /demo
WORKDIR /demo
# 执行命令
RUN npm install
# 容器启动后执行命令
CMD npm run start
存在问题?
可以看到,按开发的模式来说,这样是存在问题的。比如:
- 将代码打包进镜像中,每次修改代码都必须要
重新构建镜像 - 打包出来的镜像指包含node环境,
缺少开发时需要的依赖
我们希望的是,通过容器来提供开发时需要的依赖,然后通过vscode修改的代码实时跑在容器中。
构建自己开发镜像
要让我们的镜像提供开发时需要的依赖,其实就是让我们的镜像包含node(typescript)、git就行了。
FROM node:15.10.0-slim
RUN apt-get update && apt-get install -y git
RUN npm install -g typescript
构建镜像:docker image build -t frontend-dev .。
运行容器: docker container run -it frontend-dev /bin/bash。
进入到容器,就可以看到我们安装的程序了。
挂载点:
- docker提供了挂载点,可以让容器访问我们本机的文件系统。
只需要在我们的项目中启动容器时指定-v 参数就行,即
- -v是绑定一个卷 【volume】
- 运行一个容器并且将当前机器的"${pwd}:/demo"目录绑定到容器的匿名卷中
- 启动frontend-dev容器,并绑定到容器的"${pwd}:/demo"目录中
`docker container run -v "${pwd}:/demo" -it frontend-dev /bin/bash`。
frontend-dev启动的容器多了/demo目录
配合vscode使用容器开发
-
使用Remote-Containers插件
-
只要机器装了docker,启动了容器,就可以使用了
-
Remote-Containers插件会打开你启动的容器镜像
使用 docker 高效部署你的前端应用
使用 Docker 部署前端应用程序的基本步骤是:
-
安装 Docker
-
创建 Dockerfile 文件
-
构建 Docker 镜像
-
运行容器并部署应用程序
创建 Dockerfile 文件
- 在前端项目根目录中创建一个 Dockerfile 文件,其中定义了如何构建前端项目的 Docker 镜像
Dockerfile 的内容可能类似于这样:
# 使用 node:10 镜像作为基础镜像
FROM node:10
# 设置工作目录为 /app
WORKDIR /app
# 复制当前目录下的所有文件到工作目录 /app 中
COPY . /app
# 安装项目依赖
RUN npm install
# 将容器的 80 端口映射到主机的 80 端口
EXPOSE 80
# 启动容器时执行的命令
CMD ["npm", "start"]
构建 Docker 镜像
- 终端中执行以下命令来构建 Docker 镜像
docker build -t my-frontend-app .
其中,-t 选项指定镜像的名称为 my-frontend-app。
运行容器并部署应用程序
通过运行以下命令来启动一个容器并运行前端应用程序
docker run -p 80:80 my-frontend-app
其中,-p 选项用来将容器的 80 端口映射到主机的 80 端口,这样外部就可以通过浏览器访问你的前端应用程序了。
在实际部署中,可能还需要将前端应用程序打包为静态文件,然后使用 Nginx 或其他 Web 服务器来提供静态文件服务。这样可以提高应用程序的性能和稳定性。
docker如何配合nginx高效部署?
-
安装nginx,可以参考 Nginx 官方文档中的安装说明
-
在 Dockerfile 中添加如下内容,用来安装 Nginx 并配置 Nginx 提供静态文件服务
# 安装 Nginx
RUN apt-get update && apt-get install -y nginx
# 复制前端应用程序打包后的静态文件到 Nginx 的默认存放目录中
COPY dist/ /var/www/html
# 配置 Nginx
RUN rm /etc/nginx/sites-enabled/default
COPY nginx.conf /etc/nginx/nginx.conf
# 将容器的 80 端口映射到主机的 80 端口
EXPOSE 80
# 启动 Nginx 并运行前端应用程序
CMD ["nginx", "-g", "daemon off;"
-
其中,nginx.conf 文件中包含了 Nginx 的配置信息。
-
最后,通过执行以下命令来构建 Docker 镜像并运行容器:
docker build -t my-frontend-app .
docker run -p 80:80 my-frontend-app
补充:
CMD ["nginx", "-g", "daemon off;" 解释:
CMD 是Dockerfile 中的一条指令,用来指定容器启动时要执行的命令
其中,"nginx" 是要执行的命令,"-g" 和 "daemon off;" 是参数
"-g" 参数用来指定 nginx 配置文件中的全局参数,可以指定一些 nginx 进程的通用配置,例如错误日志文件的存放目录等。
"daemon off;" 参数用来配置 nginx 进程在后台运行,这样可以让容器在启动 nginx 后不会立即退出。
简单来说:作用是:在容器启动时启动 nginx 进程,并让 nginx 在后台运行,在实际部署中,这样做可以让 nginx 一直保持在运行状态,为前端应用程序提供静态文件服务
/var/www/html 目录 : 可以在 Nginx 的配置文件中指定:例如,可以在 nginx.conf 中加入以下内容来指定要提供静态文件服务的目录
当浏览器访问 http://localhost 时,Nginx 就会从 /usr/share/nginx/html 目录中提供静态文件服务
server { listen 80; server_name localhost;
location / {root /var/www/html;index index.html index.htm;}}
docker部署jenkins自动化部署
解决不同项目安装不同版本
传统方式直接安装的话,虽然简单粗暴,但是会污染全局环境、多版本情况不好处理
- 项目1: node10 + webpack
- 项目2: node12 + vite
- 项目3:node 11 + mysq8
- 项目4:node7+mysql5.7
写好配置后,它一个命令就在电脑上同时安装不同版本的nodej、msyql、nginx 等而且是互相隔离独立同时运行,这时候还不需要你手动来回切换、
使用Nginx做一个接口转发
我们需要在开发中需要用到该接口:https://yapi.thisjs.com/mock/21/antd/games,我需要使用nginx对其进行一些代理配置,这样我们只需要创建一个.conf文件,然后使用Docker启动一个Nginx挂载该conf文件到conf.d/目录下即可。
你是如何使用Docker部署前端项目进行自动化流程?
- 使用 Docker Compose 搭建一个包含 Web 应用
- 在构建流程中,使用 Docker 来打包和构建前端应用,并将其打包成 Docker 镜像。这样可以保证在不同的环境中都能够使用相同的镜像进行部署,并且可以保证应用的一致性和可重复性。
- 在监控和运维流程中,使用 Docker 来管理应用的日志、性能指标、健康状况等信息,并使用相关工具来进行实时监控和预警。同时,也可以使用 Docker 来进行应用的升级、回滚、备份和恢复等操作,保证应用的高可用性和数据安全性。
Dockerfile配置项目常用
- 可以配合
.dockerignore来忽略一些不需要的文件 【比如 node_modules、.vsode、dist等】- 当使用COPY命令的时候,被忽略的文件是不会被复制的
# 指定基础镜像
FROM node:lts-alpine as build-stage
# 自定义额外信息 如维护者、版本号等
LABEL qqqiu=642827353@qq.com
# 创建工作目录
WORKDIR /app
# 把当前目录 复制到当前目录容器中
COPY . .
# 安装依赖
RUN npm install
# 构建
RUN npm run build
# production stage 【生产的构建】
FROM nginx:stable-alpine as production-stage
# 把上面构建好的dist目录,放到nginx中web目录中
COPY --from=build-stage /app/dist /usr/share/nginx/html
# 暴露容器端口
EXPOSE 80
# 运行nginx命令,使nginx一直在后台运行
CMD ["nginx", "-g", "daemon off;"]