一、Docker
概念:
Docker 是一个开源的容器化平台,它允许开发者将应用程序及其所有依赖项打包到一个可移植的容器中。这些容器可以在任何支持 Docker 的环境中运行,确保了应用在不同环境中的一致性和可重复性。
作用:
- 提供了轻量级、隔离的运行环境,使得应用之间互不干扰。
- 实现快速部署和扩展,提高开发、测试和生产环境的效率。
二、Dockerfile
概念:
Dockerfile 是一个文本文件,用于定义如何构建 Docker 镜像。它包含一系列指令,告诉 Docker 如何安装软件包、配置环境变量、复制文件等操作,以创建一个特定的镜像。
作用:
- 自动化镜像构建过程,确保每次构建的一致性。
- 方便团队协作,开发者可以共享 Dockerfile 来构建相同的开发环境。
三、Docker Compose
概念:
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用 YAML 文件来描述一组相关的容器服务,包括服务的镜像、端口映射、环境变量、依赖关系等。
作用:
- 简化多容器应用的部署和管理,通过一个命令可以启动、停止和管理整个应用的所有容器。
- 方便开发和测试环境的搭建,快速启动多个相互关联的服务。
区别:
- 功能范围:
- Docker 是整个容器化平台,提供了运行容器的核心功能。
- Dockerfile 专注于定义单个镜像的构建过程。
- Docker Compose 则用于管理多个相关容器组成的应用。
- 使用场景:
- Docker 适用于单个容器的创建、运行和管理。
- Dockerfile 用于构建自定义镜像,特别是在需要特定软件配置或开发环境的情况下。
- Docker Compose 主要用于部署复杂的多服务应用,如微服务架构。
- 文件类型:
- Docker 是一个命令行工具和运行时环境。
- Dockerfile 是一个文本文件,遵循特定的指令格式。
- Docker Compose 使用 YAML 格式的配置文件。
Docker
一、容器管理
docker run
:创建并启动一个新的容器。- 示例:
docker run -it ubuntu:latest /bin/bash
,这会以交互模式启动一个基于最新版 Ubuntu 镜像的容器,并在容器内打开一个 bash 终端。
- 示例:
docker ps
:列出正在运行的容器。- 可以使用
-a
选项列出所有容器,包括已停止的。
- 可以使用
docker stop
:停止一个正在运行的容器。- 示例:
docker stop <容器 ID 或容器名称>
。
- 示例:
docker start
:启动一个已停止的容器。docker restart
:重启一个容器。docker rm
:删除一个容器。- 可以使用
-f
选项强制删除正在运行的容器,但可能会导致数据丢失。
- 可以使用
二、镜像管理
docker pull
:从镜像仓库拉取一个镜像。- 例如:
docker pull ubuntu:latest
拉取最新版的 Ubuntu 镜像。
- 例如:
docker images
:列出本地已有的镜像。docker rmi
:删除一个本地镜像。
三、其他常用命令
docker exec
:在运行中的容器内执行命令。- 示例:
docker exec -it <容器 ID 或容器名称> /bin/bash
,在容器内打开一个新的 bash 终端。
- 示例:
docker inspect
:查看容器或镜像的详细信息。docker logs
:查看容器的日志输出。docker cp
:在容器和本地文件系统之间复制文件。- 例如:
docker cp <容器 ID>:<容器内路径> <本地路径>
将容器内的文件复制到本地,反之亦然。
- 例如:
docker build
:根据 Dockerfile 构建一个新的镜像。- 通常在包含 Dockerfile 的目录下执行该命令。
docker network
:管理 Docker 网络。可以创建、列出、删除网络等操作。docker volume
:管理 Docker 卷,用于持久化数据。可以创建、列出、删除卷等操作。
Dockerfile
一、基础指令
FROM
:指定基础镜像。- 示例:
FROM ubuntu:latest
,表示以最新版的 Ubuntu 镜像为基础来构建新镜像。
- 示例:
RUN
:在构建镜像时执行命令。- 可以是单个命令,如
RUN apt-get update
;也可以是多个命令组合,例如RUN apt-get update && apt-get install -y python3
。
- 可以是单个命令,如
COPY
:将本地文件或目录复制到镜像中。COPY src dest
,其中src
是本地源路径,dest
是镜像中的目标路径。
ADD
:功能类似于COPY
,但更强大,可以自动解压缩文件(如.tar.gz)。ADD myfile.tar.gz /app/
,将压缩文件复制到镜像中的/app/
目录并解压缩(如果是可识别的压缩格式)。
二、配置指令
WORKDIR
:设置工作目录。WORKDIR /app
,后续的指令将在/app
目录下执行。
ENV
:设置环境变量。ENV MY_VARIABLE value
,设置名为MY_VARIABLE
的环境变量为value
。
EXPOSE
:声明容器在运行时监听的端口。EXPOSE 8080
,表示容器将监听 8080 端口,但这并不实际打开端口,只是起到声明作用,实际开放端口还需要在运行容器时使用-p
参数。
三、容器启动指令
CMD
:指定容器启动时要运行的命令和参数。CMD ["python", "app.py"]
,容器启动时将运行python app.py
。如果在运行容器时指定了其他命令,会覆盖CMD
的设置。
ENTRYPOINT
:设置容器的入口点,类似于CMD
,但不会被运行容器时指定的命令覆盖,而是将指定的命令作为参数传递给入口点。ENTRYPOINT ["python"]
,当运行容器时,比如docker run myimage myscript.py
,实际上会执行python myscript.py
。
项目结构
假设我们有一个 Spring Boot 项目,结构如下:
myspringbootapp/
├── src/
│ └── main/
│ ├── java/
│ │ └── com/example/demo/
│ │ ├── DemoApplication.java
│ │ └──... other Java classes...
│ └── resources/
│ ├── application.properties
│ └──... other resource files...
├── pom.xml
└── Dockerfile
Spring Boot 应用代码(DemoApplication.java)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Dockerfile
# 使用 OpenJDK 8 作为基础镜像
FROM openjdk:8-jdk-alpine
# 设置工作目录
WORKDIR /app
# 复制项目的 JAR 文件到镜像中
COPY target/myspringbootapp.jar.
# 暴露应用运行的端口(假设你的 Spring Boot 应用使用默认的 8080 端口)
EXPOSE 8080
# 运行应用
CMD ["java", "-jar", "myspringbootapp.jar"]
构建和运行镜像
在项目目录中,确保你的 Spring Boot 项目已经成功打包成一个 JAR 文件(可以使用 Maven 或 Gradle 进行打包)。
打开终端,执行以下命令构建镜像:
docker build -t myspringbootapp.
运行容器:
docker run -p 8080:8080 myspringbootapp
现在你可以通过访问 http://localhost:8080
(假设你的 Spring Boot 应用有一个默认的 HTTP 接口)来测试你的应用是否在 Docker 容器中正常运行。
docker-compose
-
up
:创建并启动一组服务。 -
down
:停止并删除容器、网络、卷等资源。 -
ps
:列出正在运行的容器。 -
restart
:重启服务。 -
logs
:查看服务的日志。使用 Docker Compose
创建一个
docker-compose.yml
文件:version: '3' services: myspringbootapp: build:. ports: - "8080:8080"
在项目目录中执行以下命令启动应用:
docker-compose up -d
以下是一个使用docker-compose
来部署 MySQL、Redis、Nacos、Seata 和 Jenkins 的示例:
version: '3'
services:
mysql:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: your_password
ports:
- "3306:3306"
redis:
image: redis:latest
ports:
- "6379:6379"
nacos:
image: nacos/nacos-server:latest
ports:
- "8848:8848"
seata:
image: seataio/seata-server:latest
ports:
- "8091:8091"
jenkins:
image: jenkins/jenkins:latest
ports:
- "8080:8080"
要使用这个配置文件,可以将上述内容保存为docker-compose.yml
文件,然后在命令行中执行以下命令:
启动服务:
docker-compose up -d
停止服务:
docker-compose down
查看服务状态:
docker-compose ps
请注意,这只是一个简单的示例,实际部署中可能需要根据具体情况调整配置,例如设置环境变量、挂载卷以持久化数据等。同时,确保你的系统满足运行这些服务的要求,并且已经安装了docker-compose
工具。