Docker问题

为什么使用docker #

Docker 是一个高效的轻量级容器化解决方案,**可以让应用程序快速部署,安全运行,并且使其更容易跨环境迁移和管理。**Docker 可以为应用程序提供一个可复用的容器,从而可以在同一操作系统中和不同操作系统中部署应用,实现跨平台应用开发。它可以简化应用程序的部署,提高性能,确保应用程序的完整性和可靠性,以及降低运行和管理环境的成本。

优势:

  • 节约资源:通过分割物理机的硬件资源,将其抽象出来,在需要的时候为不同的容器提供资源,这样就能减小磁盘和内存的开销;
  • 轻量级:Docker容器本身只有几百兆的大小,而且不需要安装宿主操作系统,能够极大地缩小应用程序启动时间;
  • 灵活性:Docker支持跨平台的部署,可以更灵活的部署应用程序和微服务;
  • 弹性:Docker可以更加简单的增加节点,并能够实现服务的弹性扩容和缩容;
  • 安全性:根据容器隔离,可以避免恶意攻击,提高应用程序的安全性;
  • 可重复性:docker容器可以在任何地方重复利用,从而大大减少了管理时间和成本;
  • 可移植性:Docker容器可以在开发环境和生产环境之间更加容易的移植。

有了docker为啥还要k8s? #

Docker是一个容器编排工具,可以帮助我们管理应用程序。但是,如果想要管理大量的容器,就需要更为强大的编排工具,而 Kubernetes(K8s)就是这样一个工具。

K8s 由多个容器组成,并且能够自动检测、部署和扩缩容,它提供了资源管理、服务发现、多租户支持等功能,从而管理和调度大量容器,让整个编排更加高效、可靠、稳定。因此,K8s不仅仅是让Docker容器能够更好的运行,而且它可以用于管理任何容器化的部署。

容器与虚拟机的区别是什么? #

虚拟机是基于硬体的多个客户操作系统,由虚拟机监视器实现。 容器是应用程序级构造,并模拟共享单个内核的多个虚拟环境。

虚拟机包含操作系统的完整副本,包括内核及所有驱动和应用,因此占用更多的磁盘空间和内存。

容器在操作系统层面进行虚拟化,共享宿主机的操作系统内核。容器由容器引擎(如 Docker)管理,所有容器可以运行在单一的操作系统实例上。

Docker File是什么?它通常包含哪些指令? #

Dockerfile 是一个文本文件,用于自动化地构建 Docker 镜像。Dockerfile 定义了从基础镜像开始,按步骤配置环境和部署应用所需要的所有命令。

# 使用 Java 11 官方镜像作为基础镜像
FROM openjdk:11-jdk

# 设置维护者信息
LABEL maintainer="hollis@hollis.com"

# 环境变量,可以设置默认的环境变量用于应用配置
ENV SPRING_PROFILES_ACTIVE=prod \
    JAVA_OPTS="-Xmx512m -Xms256m"

# 设置容器内的工作目录
WORKDIR /app

# 将 jar 包复制到工作目录
COPY target/my-spring-boot-app.jar my-app.jar

# 指定对外暴露的端口号
EXPOSE 8080

# 容器健康检查,定期检查应用是否响应
HEALTHCHECK --interval=1m --timeout=3s \
  CMD curl -f http://localhost:8080/actuator/health || exit 1

# 使用 ENTRYPOINT 和 CMD 以提供默认执行命令,同时允许覆盖参数
ENTRYPOINT ["java", "-jar", "my-app.jar"]
CMD ["--server.port=8080"]

# 在构建或部署前执行额外的命令
ONBUILD RUN echo "Built a new image based on Java Spring Boot Application"

FROM - 设置基础镜像,每个 Dockerfile 至少需要一条 FROM 指令作为镜像的基础。

FROM openjdk:11-jdk

LABEL - 添加元数据到镜像,如作者、版本、描述等。

LABEL maintainer="hollis@hollis.com"

ENV - 设置环境变量。

ENV SPRING_PROFILES_ACTIVE=prod \

​    JAVA_OPTS="-Xmx512m -Xms256m"

WORKDIR - 为 RUN, CMD, ENTRYPOINT, COPY 和 ADD 设置工作目录。

WORKDIR /app

ADD 和 COPY - 将文件从构建环境复制到镜像。COPY 是推荐的方法,因为它更透明。ADD 除了复制本地文件还可以直接解压缩和从URL下载。

COPY target/my-spring-boot-app.jar /app/my-app.jar

EXPOSE - 声明容器运行时监听的端口。

EXPOSE 8080

HEALTHCHECK - 告诉 Docker 如何测试容器以检查它是否仍在运行。

HEALTHCHECK --interval=1m --timeout=3s \

  CMD curl -f http://localhost:8080/actuator/health || exit 1 

ENTRYPOINT - 配置容器启动时运行的命令,允许将容器作为可执行文件。

ENTRYPOINT ["java", "-jar", "my-app.jar"]

CMD - 提供容器默认的执行命令。每个 Dockerfile 只能有一个 CMD 指令,如果列出多个,只有最后一个会生效。

CMD ["--server.port=8080"]

ONBUILD - 为镜像添加将在之后基于该镜像的 Dockerfile 中触发的触发器指令。

ONBUILD RUN echo "Built a new image based on Java Spring Boot Application"

RUN - 执行命令并创建新的镜像层,常用于安装软件包。

RUN echo "Built a new image based on Java Spring Boot Application"

VOLUME - 创建挂载点来持久化数据或与其他容器共享数据。

VOLUME /var/cache/nginx

USER - 设置运行容器时的用户名或 UID。

USER nginx

ARG - 定义构建时的变量,可用于传递动态数据如代理服务器、版本标签等。

ARG VERSION=1.0

docker常用命令有哪些? #

docker run:启动一个新的容器

docker ps:列出正在运行的容器

docker ps -a:列出所有容器

docker stop: 停止正在运行的容器

docker start: 启动已停止的容器

docker rm:删除容器

docker images: 列出本地镜像

docker pull:从镜像仓库拉取或更新指定的镜像

docker build: 使用 Dockerfile 构建镜像

docker logs :查看日志

docker logs -f :实时跟踪日志输出docker logs –tail 50 :查看最新的50行日志

docker logs –since 30m :查看最近30分钟的日志

docker compose? #

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过使用一个 YAML 文件来配置应用服务,给予Docker Compose 我们就可以通过一个单独的命令来创建和启动所有服务。可以大大的简化配置环境的复杂度。

利用Docker Compose ,可以实现以下常见功能:

  • 服务定义:可以在一个文件中定义一组相互关联的服务(如数据库、后端应用、前端应用等),这些服务将被同时管理。
  • 一键部署:通过一个简单的命令 docker-compose up,可以同时启动或停止所有定义的服务。
  • 环境隔离:每个项目可以使用单独的隔离环境,通过在不同的项目中使用不同的 Docker Compose 文件来实现。
  • 简化配置:通过 YAML 文件配置服务,使得配置过程标准化且易于理解和维护。