Docker — 跨平台和环境摆设

十念  金牌会员 | 2024-11-4 02:07:32 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

Docker 是一个开源的容器化平台,通过将应用程序和其依赖打包在一个轻量级、独立的容器中,可以或许跨平台和环境摆设。
1. Docker 基本概念



  • 镜像 (Image):Docker 镜像是一个只读模板,包含运行应用程序所需的代码、库、依赖和环境配置。镜像类似于一个模板,可以用来创建容器。
  • 容器 (Container):容器是镜像的一个运行实例,它可以运行一个或多个进程,且具有隔离性。容器的生命周期短暂,可以随时启动、停止或销毁。
  • Dockerfile:Dockerfile 是一组指令文件,用来定义镜像的构建过程。开发者可以通过 Dockerfile 编写应用及其依赖环境的打包脚本。
  • 仓库 (Repository):Docker 镜像的存储位置,类似于代码的版本控制体系。镜像可以推送到仓库中供其他用户下载使用。Docker Hub 是一个公共仓库,提供了大量的官方和社区镜像。
2. Docker 的优势



  • 轻量级:Docker 使用体系级别的假造化,而非假造机,不须要完整的操纵体系,容器启动速度更快,占用资源更少。
  • 环境一致性:Docker 容器包含应用运行所需的全部环境配置,确保在不同环境中行为一致,减少了环境配置不一致导致的问题。
  • 快速摆设与扩展:Docker 支持快速摆设和缩放,可以在几秒钟内启动多个实例,适合大规模应用的摆设和扩展。
  • 便于 CI/CD:Docker 与 DevOps 流程无缝集成,支持持续集成、交付和摆设。
3. Docker 安装

安装参考Docker官方文档,地址如下:https://docs.docker.com/engine/install/centos/
3.1 卸载旧版

首先假如体系中已经存在旧的Docker,则先卸载:
  1. yum remove docker \
  2.     docker-client \
  3.     docker-client-latest \
  4.     docker-common \
  5.     docker-latest \
  6.     docker-latest-logrotate \
  7.     docker-logrotate \
  8.     docker-engine \
  9.     docker-selinux
复制代码
3.2 配置Docker的yum库

首先要安装一个yum工具
  1. sudo yum install -y yum-utils device-mapper-persistent-data lvm2
复制代码
安装成功后,实验命令,配置Docker的yum源:
  1. sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  2. sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
复制代码
更新yum,建立缓存
  1. sudo yum makecache fast
复制代码
3.3 安装Docker

末了,实验命令,安装Docker
  1. yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
复制代码
3.4 启动和校验

  1. # 启动Docker
  2. systemctl start docker
  3. # 停止Docker
  4. systemctl stop docker
  5. # 重启
  6. systemctl restart docker
  7. # 设置开机自启
  8. systemctl enable docker
  9. # 执行docker ps命令,如果不报错,说明安装启动成功
  10. docker ps
复制代码
4. Docker 基本使用

Docker本身包含一个后台服务,我们可以利用Docker命令告诉Docker服务,帮助我们快速摆设指定的应用。Docker服务摆设应用时,首先要去搜索并下载应用对应的镜像,然后根据镜像创建并答应容器,应用就摆设完成了。
4.1 Docker 命令


默认环境下,每次重启假造机我们都须要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:
  1. # Docker开机自启
  2. systemctl enable docker
  3. # Docker容器开机自启
  4. docker update --restart=always [容器名/容器id]
复制代码
4.2 Docker摆设MySQL服务示例

  1. docker run -d \                                 # 以后台模式启动容器(detached mode)。
  2.   --name mysql \                                # 将容器命名为 "mysql",便于管理。
  3.   -p 3306:3306 \                                # 将主机的 3306 端口映射到容器的 3306 端口,方便本地主机访问 MySQL 服务。
  4.   -e TZ=Asia/Shanghai \                         # 设置容器的时区为上海时间(Asia/Shanghai),以确保时间一致。
  5.   -e MYSQL_ROOT_PASSWORD=123 \                  # 设置 MySQL root 用户的密码为 "123"(实际环境中应使用复杂密码)。
  6.   -v ./mysql/data:/var/lib/mysql \              # 挂载本地数据目录到容器的 MySQL 数据目录,以持久化存储数据库数据。
  7.   -v ./mysql/conf:/etc/mysql/conf.d \           # 挂载本地配置目录到容器的 MySQL 配置目录,以便加载自定义配置文件。
  8.   -v ./mysql/init:/docker-entrypoint-initdb.d \ # 挂载本地初始化脚本目录到容器,容器启动时将执行目录中的脚本。
  9.   mysql                                         # 使用官方 MySQL 镜像。
复制代码
镜像的名称不是随意的,而是要到DockerRegistry中探求,镜像运行时的配置也不是随意的,要参考镜像的帮助文档,这些在DockerHub网站或者软件的官方网站中都能找到。
4.3 Dockerfile制作镜像

镜像的来源有两种:
(1)直接去DockerRegistry下载
(2)基于官方底子镜像本身制作
由于制作镜像的过程中,须要逐层处理和打包,比较复杂,所以Docker就提供了主动打包镜像的功能。我们只须要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去实验即可。
而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档:
https://docs.docker.com/engine/reference/builder/

例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下:
  1. # 基础镜像
  2. FROM openjdk:11.0-jre-buster
  3. # 设定时区
  4. ENV TZ=Asia/Shanghai
  5. RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
  6. # 拷贝jar包
  7. COPY docker-demo.jar /app.jar
  8. # 入口
  9. ENTRYPOINT ["java", "-jar", "/app.jar"]
复制代码
然后,实验命令,构建镜像:
  1. # 使用 Docker 从指定目录中的 Dockerfile 构建镜像
  2. docker build -t docker-demo:1.0 /root/demo
  3. # 参数说明:
  4. # docker build                # Docker 命令,用于从 Dockerfile 构建镜像
  5. # -t docker-demo:1.0          # 使用 -t 参数为镜像指定名称和标签(版本号)
  6. #   docker-demo               # 镜像的名称,用于标识构建出的镜像
  7. #   1.0                       # 镜像的版本号(tag),用于区分不同版本,格式为 <镜像名>:<版本号>
  8. # /root/demo                  # 指定 Dockerfile 所在的目录路径,Docker 将在该目录中查找名为 Dockerfile 的文件
复制代码
4.4 网络

Java项目每每须要访问其它各种中央件,例如MySQL、Redis等。放在同一个网络中,我们的容器之间能相互访问。

4.5 Docker Compose

Docker Compose 是一个工具,答应用户定义并运行多个容器服务。通过编写 docker-compose.yml 文件,用户可以轻松地配置应用的多个服务并管理它们。
稍微复杂的项目,会有各种各样的其它中央件,须要摆设的东西许多。假如手动的逐一摆设,就太麻烦了。
而Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速摆设。它答应用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。
举例来说,用docker run摆设MySQL的命令如下:
  1. docker run -d \                                 # 以后台模式启动容器(detached mode)。
  2.   --name mysql \                                # 将容器命名为 "mysql",便于管理。
  3.   -p 3306:3306 \                                # 将主机的 3306 端口映射到容器的 3306 端口,方便本地主机访问 MySQL 服务。
  4.   -e TZ=Asia/Shanghai \                         # 设置容器的时区为上海时间(Asia/Shanghai),以确保时间一致。
  5.   -e MYSQL_ROOT_PASSWORD=123 \                  # 设置 MySQL root 用户的密码为 "123"(实际环境中应使用复杂密码)。
  6.   -v ./mysql/data:/var/lib/mysql \              # 挂载本地数据目录到容器的 MySQL 数据目录,以持久化存储数据库数据。
  7.   -v ./mysql/conf:/etc/mysql/conf.d \           # 挂载本地配置目录到容器的 MySQL 配置目录,以便加载自定义配置文件。
  8.   -v ./mysql/init:/docker-entrypoint-initdb.d \ # 挂载本地初始化脚本目录到容器,容器启动时将执行目录中的脚本。
  9.   mysql                                         # 使用官方 MySQL 镜像。
复制代码
假如用docker-compose.yml文件来定义,就是如许:
  1. # Docker Compose 配置文件,版本为 3.8
  2. version: "3.8"
  3. # 定义多个服务
  4. services:
  5.   # 定义 MySQL 服务
  6.   mysql:
  7.     # 使用官方的 MySQL 镜像
  8.     image: mysql
  9.     # 指定容器名称
  10.     container_name: mysql
  11.     # 映射主机和容器的端口
  12.     ports:
  13.       - "3306:3306"  # 将主机的 3306 端口映射到容器的 3306 端口
  14.     # 设置环境变量
  15.     environment:
  16.       TZ: Asia/Shanghai  # 设置容器的时区为亚洲/上海
  17.       MYSQL_ROOT_PASSWORD: 123  # 设置 MySQL 根用户的密码为 123
  18.     # 挂载主机目录到容器中,用于持久化数据和自定义配置
  19.     volumes:
  20.       - "./mysql/conf:/etc/mysql/conf.d"  # 挂载本地的配置文件夹到容器的 MySQL 配置目录
  21.       - "./mysql/data:/var/lib/mysql"     # 挂载本地的数据文件夹到容器的 MySQL 数据目录
  22.     # 指定网络配置
  23.     networks:
  24.       - new  # 将此服务连接到名为 new 的网络
  25. # 定义网络
  26. networks:
  27.   new:
  28.     name: cyt  # 指定网络的名称为 cyt
复制代码

编写好docker-compose.yml文件,就可以摆设项目了。常见的命令:
  1. # 启动所有, -d 参数是后台启动
  2. docker compose up -d
复制代码
5. 摆设示例

项目阐明:


  • cyt:后端代码
  • cyt-portal:用户端的前端代码
  • cyt-admin:管理端的前端代码
5.1 逐个摆设

5.1.1 摆设Java项目


注意:host采用了mysql作为地址,刚好是我们的mysql容器名,只要两者在一个网络,就肯定能相互访问。
首先将项目打包;
将项目目录下的Dockerfile和/target目录下的.jar一起上传到假造机的root目录。
  1. # 1.首先通过命令创建一个网络
  2. docker network create cytnet
  3. # 1.构建项目镜像,不指定tag,则默认为latest
  4. docker build -t cyt.
  5. # 2.创建并运行容器,并通过--network将其加入hmall网络,这样才能通过容器名访问mysql
  6. docker run -d --name cyt --network cytnet -p 8080:8080 cyt
复制代码
5.1.2 摆设前端

将前端代码拷贝到nginx的html目录下,在nginx.conf配置文件,完成对html下的两个静态资源目录做署理。
将整个nginx目录上传到假造机的/root目录下
  1. docker run -d \
  2.   --name nginx \
  3.   -p 18080:18080 \
  4.   -p 18081:18081 \
  5.   -v /root/nginx/html:/usr/share/nginx/html \
  6.   -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
  7.   --network hmall \
  8.   nginx
复制代码
5.2 DockerCompose一键摆设

编写docker-compose.yml文件
  1. version: "3.8"  # 定义 Docker Compose 文件的版本
  2. services:
  3.   # MySQL 数据库服务
  4.   mysql:
  5.     image: mysql  # 使用官方 MySQL 镜像
  6.     container_name: mysql  # 设置容器名称为 "mysql"
  7.     ports:
  8.       - "3306:3306"  # 将主机的 3306 端口映射到容器的 3306 端口
  9.     environment:
  10.       TZ: Asia/Shanghai  # 设置容器的时区为亚洲/上海
  11.       MYSQL_ROOT_PASSWORD: 123  # 设置 MySQL 的 root 用户密码
  12.     volumes:
  13.       - "./mysql/conf:/etc/mysql/conf.d"  # 挂载自定义配置文件目录到容器中
  14.       - "./mysql/data:/var/lib/mysql"  # 持久化存储 MySQL 数据库的数据
  15.       - "./mysql/init:/docker-entrypoint-initdb.d"  # 初始化 SQL 脚本目录
  16.     networks:
  17.       - cyt-net  # 连接到名为 "cyt-net" 的自定义网络
  18.   # Java 应用服务(cyt)
  19.   cyt:
  20.     build:
  21.       context: .  # 设置构建上下文为当前目录
  22.       dockerfile: Dockerfile  # 指定构建 Java 应用的 Dockerfile 文件
  23.     container_name: cyt  # 设置容器名称为 "cyt"
  24.     ports:
  25.       - "8080:8080"  # 将主机的 8080 端口映射到容器的 8080 端口
  26.     networks:
  27.       - cyt-net  # 连接到自定义网络 "cyt-net"
  28.     depends_on:
  29.       - mysql  # 设置依赖关系:确保 MySQL 容器在 cyt 容器之前启动
  30.   # Nginx 反向代理服务
  31.   nginx:
  32.     image: nginx  # 使用官方 Nginx 镜像
  33.     container_name: nginx  # 设置容器名称为 "nginx"
  34.     ports:
  35.       - "18080:18080"  # 将主机的 18080 端口映射到容器的 18080 端口(可以根据需要修改)
  36.       - "18081:18081"  # 将主机的 18081 端口映射到容器的 18081 端口(可以根据需要修改)
  37.     volumes:
  38.       - "./nginx/nginx.conf:/etc/nginx/nginx.conf"  # 挂载自定义 Nginx 配置文件
  39.       - "./nginx/html:/usr/share/nginx/html"  # 挂载静态文件目录到 Nginx 容器中
  40.     depends_on:
  41.       - cyt  # 设置依赖关系:确保 cyt 容器在 nginx 容器之前启动
  42.     networks:
  43.       - cyt-net  # 连接到自定义网络 "cyt-net"
  44. # 定义自定义网络
  45. networks:
  46.   cyt-net:
  47.     name: cyt  # 将自定义网络命名为 "cyt"
复制代码
在终端中运行以下命令,Docker Compose 会读取 docker-compose.yml 文件并启动配置的服务
  1. # 启动所有, -d 参数是后台启动
  2. docker compose up -d
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表