核心概念
在Docker和其他容器化技术中,"容器"、"网络"、"卷"和"镜像"是四个核心概念,每个都扮演着不同的角色:
1. 容器(Containers)
容器是一种轻量级、可执行的独立软件包,它将软件运行所需的代码、运行时、系统工具、库和设置打包在一起。容器与虚拟机类似,但更加轻量,因为它们不需要额外运行一个完整的操作系统,而是直接在宿主的操作系统上运行,共享内核。容器是短暂的,它们存在的时间从启动直到被终止。
2. 镜像(Images)
镜像是容器运行的模板,它是一个轻量级、只读的文件系统。镜像包含了启动容器所需的所有内容——代码、库、环境变量、配置文件等。你可以把它想象成容器的“蓝图”。通常,镜像基于某个基础镜像构建,上面加上一些定制化内容。镜像在构建后可以被存储在镜像仓库中,并可以被多次用来启动新的容器。
3. 卷(Volumes)
在Docker中,卷用于数据持久化和数据共享。由于容器本身是无状态、临时的,当容器被删除时,所有保存在容器文件系统中的数据也会丢失。为了解决这个问题,Docker引入了卷的概念。卷是独立于容器的,可以挂载到容器内部的特定路径,这样即使容器停止或删除,卷中的数据也仍然存在。卷可以在多个容器之间共享和重用。
4. 网络(Networks)
Docker网络允许容器间通信,以及容器与外部世界通信。当你启动一个Docker容器时,你可以连接它到一个或多个网络。Docker支持不同类型的网络,比如桥接网络(bridge)、覆盖网络(overlay)和主机网络(host),每种网络类型适用于不同的场景。通过正确配置网络,你可以精细地控制容器之间如何相互作用,以及它们如何访问外部网络。
Docker Compose 是一种工具,用于定义和运行多容器Docker应用程序。通过一个配置文件来管理多个Docker容器,使得部署多容器应用变得更简单。下面是关于 Docker Compose 的安装、使用和快速入门的指导。
安装 Docker Compose
Windows 和 Mac
如果你在使用 Docker Desktop (Windows 或 Mac),Docker Compose 已经包含在其中,无需单独安装。
ps: Docker Desktop的安装可以看我上一篇文章
Linux
在 Linux 系统上,你需要单独安装 Docker Compose。可以使用以下命令进行安装:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
使用 Docker Compose
1. 编写 Docker-compose.yml 文件
这个文件定义了所需的服务、网络和卷。例如,一个简单的 docker-compose.yml
文件可能看起来像这样:
version: '3.8'
services:
web:
image: nginx
ports:
- "80:80"
db:
image: postgres
environment:
POSTGRES_PASSWORD: example
2. 启动服务
在 docker-compose.yml
文件所在的目录中运行以下命令来启动服务:
docker-compose up
这个命令会根据 docker-compose.yml
文件中的定义启动所有服务。
3. 停止服务
要停止并移除所有由 docker-compose up
命令启动的容器,可以使用:
docker-compose down
快速入门(以前后端分离项目作为示例)
示例:对于一个使用Vue.js前端和Java后端,以及MySQL数据库的前后端分离项目,通过Docker容器化部署在服务器上并运行起来。可以分为几个主要步骤
步骤1: 准备项目代码
- 前端(Vue+Webpack): 一个包含所有Vue.js源代码和Webpack配置文件的目录。
- 后端(Java): 包含Java源代码和构建脚本(如Maven或Gradle)的目录。
- 数据库(MySQL): 准备初始化SQL脚本,用于设置数据库结构和初始数据。
步骤2: 编写Dockerfile
为前端、后端和数据库各写一个Dockerfile:
-
前端Dockerfile:
FROM node:14 as build-stage WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build FROM nginx:stable-alpine as production-stage COPY --from=build-stage /app/dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
这个Dockerfile使用node镜像构建Vue项目,然后使用nginx镜像来部署。
-
后端Dockerfile:
FROM openjdk:11 WORKDIR /app COPY . /app RUN ./mvnw clean package EXPOSE 8080 CMD ["java", "-jar", "target/myapp.jar"]
这个Dockerfile使用OpenJDK镜像来构建并运行Java应用。
-
MySQL Dockerfile:
MySQL通常可以直接使用官方镜像,并通过Docker Compose来配置。
步骤3: 创建Docker Compose文件
编写一个docker-compose.yml
文件来定义和运行所有服务:
version: '3.8'
services:
frontend:
build: ./path_to_frontend
ports:
- "80:80"
backend:
build: ./path_to_backend
ports:
- "8080:8080"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
volumes:
- db-data:/var/lib/mysql
ports:
- "3306:3306"
volumes:
db-data:
步骤4: 构建和运行容器
1. 构建服务
在包含 docker-compose.yml
文件的目录中运行以下命令来构建所有服务的镜像。这会查找每个服务指定的Dockerfile,并执行构建过程。
docker-compose build
2. 运行服务
构建完成后,使用以下命令启动所有服务。-d
参数表示在后台运行服务。
docker-compose up -d
这个命令将启动所有在 docker-compose.yml
文件中定义的服务,并且容器将在后台运行。
示例 docker-compose.yml
下面是一个简化的 docker-compose.yml
文件示例,它定义了三个服务:前端、后端和数据库。
version: '3.8'
services:
frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- backend
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
在这个配置中:
- 前端 服务构建自
./frontend
目录的Dockerfile,并将容器的80端口映射到宿主机的80端口。 - 后端 服务构建自
./backend
目录的Dockerfile,并将容器的8080端口映射到宿主机的8080端口。 - 数据库 使用了官方的MySQL 5.7镜像,并设置了环境变量来初始化数据库。
3. 检查服务状态
一旦服务运行起来,你可以使用以下命令来查看运行中的容器的状态:
docker-compose ps
这将列出所有由 docker-compose
管理的容器及其状态。
4. 访问应用
- 前端 可以通过
http://localhost
访问(或者使用你服务器的IP地址)。 - 后端API 可以通过
http://localhost:8080/api
访问。
5. 停止和清理服务
当不再需要运行服务时,可以使用以下命令停止所有服务并移除容器,同时保留数据卷和网络配置,以便下次可以快速启动。
docker-compose down
通过以上步骤,你的前后端分离项目就可以通过Docker容器在任何Docker支持的环境中一致地运行了。这样的部署方式简化了环境配置,提高了项目的可移植性和易维护性。
关于配置文件的参数解释
docker-compose.yml
文件用于定义一组相关联的服务(容器),这些服务可以一起协作作为一个应用。一个基本的文件包含以下几个部分:
- version: 指定 Docker Compose 文件的版本,这会影响你可以使用的配置选项。
- services: 定义你的应用中的各个服务(容器),每个服务可以包含镜像设置、端口映射等。
- volumes: 定义数据卷,用于数据持久化和服务之间的数据共享。
- networks: 定义网络,用于设置容器间的网络连接。
具体配置项解释
-
version:
version: '3.8'
这里的
'3.8'
表示你使用的是 Docker Compose 3.8 版本的配置格式。 -
services:
services: frontend: build: ./path_to_frontend ports: - "80:80"
frontend
是服务的名称。build: ./path_to_frontend
告诉 Docker Compose 在指定路径查找 Dockerfile 并构建镜像。ports
指定端口映射,将容器内部的 80 端口映射到宿主机的 80 端口。
-
环境变量 (
environment
):environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: mydb
- 这些键值对设置容器内的环境变量,例如 MySQL 服务的根密码和数据库名称。
-
volumes:
volumes: - db-data:/var/lib/mysql
db-data
是一个在宿主机和容器间共享的数据卷名,/var/lib/mysql
是它在容器内的挂载点。
-
网络 (
networks
):networks: - fastgpt
- 定义容器间的网络连接,
fastgpt
是一个自定义网络,确保服务间可以互相发现和通信。
- 定义容器间的网络连接,
使用 Docker Compose
- 启动服务:
docker-compose up
,这会根据 yml 文件中的定义启动所有服务。 - 停止服务:
docker-compose down
,这不仅停止所有服务,还会删除网络和默认情况下创建的所有容器。