Docker — 跨平台和环境部署

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,则先卸载:

yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine \docker-selinux 

3.2 配置Docker的yum库

首先要安装一个yum工具

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

安装成功后,执行命令,配置Docker的yum源:

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

更新yum,建立缓存

sudo yum makecache fast

3.3 安装Docker

最后,执行命令,安装Docker

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3.4 启动和校验

# 启动Docker
systemctl start docker# 停止Docker
systemctl stop docker# 重启
systemctl restart docker# 设置开机自启
systemctl enable docker# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

4. Docker 基本使用

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

4.1 Docker 命令

默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:

# Docker开机自启
systemctl enable docker# Docker容器开机自启
docker update --restart=always [容器名/容器id]

4.2 Docker部署MySQL服务示例

docker run -d \                                 # 以后台模式启动容器(detached mode)。--name mysql \                                # 将容器命名为 "mysql",便于管理。-p 3306:3306 \                                # 将主机的 3306 端口映射到容器的 3306 端口,方便本地主机访问 MySQL 服务。-e TZ=Asia/Shanghai \                         # 设置容器的时区为上海时间(Asia/Shanghai),以确保时间一致。-e MYSQL_ROOT_PASSWORD=123 \                  # 设置 MySQL root 用户的密码为 "123"(实际环境中应使用复杂密码)。-v ./mysql/data:/var/lib/mysql \              # 挂载本地数据目录到容器的 MySQL 数据目录,以持久化存储数据库数据。-v ./mysql/conf:/etc/mysql/conf.d \           # 挂载本地配置目录到容器的 MySQL 配置目录,以便加载自定义配置文件。-v ./mysql/init:/docker-entrypoint-initdb.d \ # 挂载本地初始化脚本目录到容器,容器启动时将执行目录中的脚本。mysql                                         # 使用官方 MySQL 镜像。

镜像的名称不是随意的,而是要到DockerRegistry中寻找,镜像运行时的配置也不是随意的,要参考镜像的帮助文档,这些在DockerHub网站或者软件的官方网站中都能找到。

4.3 Dockerfile制作镜像

镜像的来源有两种:

(1)直接去DockerRegistry下载

(2)基于官方基础镜像自己制作

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。

而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档:

https://docs.docker.com/engine/reference/builder/

例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下:

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

然后,执行命令,构建镜像:

# 使用 Docker 从指定目录中的 Dockerfile 构建镜像
docker build -t docker-demo:1.0 /root/demo# 参数说明:
# docker build                # Docker 命令,用于从 Dockerfile 构建镜像
# -t docker-demo:1.0          # 使用 -t 参数为镜像指定名称和标签(版本号)
#   docker-demo               # 镜像的名称,用于标识构建出的镜像
#   1.0                       # 镜像的版本号(tag),用于区分不同版本,格式为 <镜像名>:<版本号>
# /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的命令如下:

docker run -d \                                 # 以后台模式启动容器(detached mode)。--name mysql \                                # 将容器命名为 "mysql",便于管理。-p 3306:3306 \                                # 将主机的 3306 端口映射到容器的 3306 端口,方便本地主机访问 MySQL 服务。-e TZ=Asia/Shanghai \                         # 设置容器的时区为上海时间(Asia/Shanghai),以确保时间一致。-e MYSQL_ROOT_PASSWORD=123 \                  # 设置 MySQL root 用户的密码为 "123"(实际环境中应使用复杂密码)。-v ./mysql/data:/var/lib/mysql \              # 挂载本地数据目录到容器的 MySQL 数据目录,以持久化存储数据库数据。-v ./mysql/conf:/etc/mysql/conf.d \           # 挂载本地配置目录到容器的 MySQL 配置目录,以便加载自定义配置文件。-v ./mysql/init:/docker-entrypoint-initdb.d \ # 挂载本地初始化脚本目录到容器,容器启动时将执行目录中的脚本。mysql                                         # 使用官方 MySQL 镜像。

如果用docker-compose.yml文件来定义,就是这样:

# Docker Compose 配置文件,版本为 3.8
version: "3.8"# 定义多个服务
services:# 定义 MySQL 服务mysql:# 使用官方的 MySQL 镜像image: mysql# 指定容器名称container_name: mysql# 映射主机和容器的端口ports:- "3306:3306"  # 将主机的 3306 端口映射到容器的 3306 端口# 设置环境变量environment:TZ: Asia/Shanghai  # 设置容器的时区为亚洲/上海MYSQL_ROOT_PASSWORD: 123  # 设置 MySQL 根用户的密码为 123# 挂载主机目录到容器中,用于持久化数据和自定义配置volumes:- "./mysql/conf:/etc/mysql/conf.d"  # 挂载本地的配置文件夹到容器的 MySQL 配置目录- "./mysql/data:/var/lib/mysql"     # 挂载本地的数据文件夹到容器的 MySQL 数据目录# 指定网络配置networks:- new  # 将此服务连接到名为 new 的网络# 定义网络
networks:new:name: cyt  # 指定网络的名称为 cyt

编写好docker-compose.yml文件,就可以部署项目了。常见的命令:

# 启动所有, -d 参数是后台启动
docker compose up -d

5. 部署示例

项目说明:

  • cyt:后端代码

  • cyt-portal:用户端的前端代码

  • cyt-admin:管理端的前端代码

5.1 逐个部署

5.1.1 部署Java项目

注意:host采用了mysql作为地址,刚好是我们的mysql容器名,只要两者在一个网络,就一定能互相访问。

首先将项目打包;

项目目录下的Dockerfile/target目录下的.jar一起上传到虚拟机的root目录。

# 1.首先通过命令创建一个网络
docker network create cytnet# 1.构建项目镜像,不指定tag,则默认为latest
docker build -t cyt.# 2.创建并运行容器,并通过--network将其加入hmall网络,这样才能通过容器名访问mysql
docker run -d --name cyt --network cytnet -p 8080:8080 cyt

5.1.2 部署前端

将前端代码拷贝到nginx的html目录下,在nginx.conf配置文件,完成对html下的两个静态资源目录做代理。

将整个nginx目录上传到虚拟机的/root目录下

docker run -d \--name nginx \-p 18080:18080 \-p 18081:18081 \-v /root/nginx/html:/usr/share/nginx/html \-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \--network hmall \nginx

5.2 DockerCompose一键部署

编写docker-compose.yml文件

version: "3.8"  # 定义 Docker Compose 文件的版本services:# MySQL 数据库服务mysql:image: mysql  # 使用官方 MySQL 镜像container_name: mysql  # 设置容器名称为 "mysql"ports:- "3306:3306"  # 将主机的 3306 端口映射到容器的 3306 端口environment:TZ: Asia/Shanghai  # 设置容器的时区为亚洲/上海MYSQL_ROOT_PASSWORD: 123  # 设置 MySQL 的 root 用户密码volumes:- "./mysql/conf:/etc/mysql/conf.d"  # 挂载自定义配置文件目录到容器中- "./mysql/data:/var/lib/mysql"  # 持久化存储 MySQL 数据库的数据- "./mysql/init:/docker-entrypoint-initdb.d"  # 初始化 SQL 脚本目录networks:- cyt-net  # 连接到名为 "cyt-net" 的自定义网络# Java 应用服务(cyt)cyt:build: context: .  # 设置构建上下文为当前目录dockerfile: Dockerfile  # 指定构建 Java 应用的 Dockerfile 文件container_name: cyt  # 设置容器名称为 "cyt"ports:- "8080:8080"  # 将主机的 8080 端口映射到容器的 8080 端口networks:- cyt-net  # 连接到自定义网络 "cyt-net"depends_on:- mysql  # 设置依赖关系:确保 MySQL 容器在 cyt 容器之前启动# Nginx 反向代理服务nginx:image: nginx  # 使用官方 Nginx 镜像container_name: nginx  # 设置容器名称为 "nginx"ports:- "18080:18080"  # 将主机的 18080 端口映射到容器的 18080 端口(可以根据需要修改)- "18081:18081"  # 将主机的 18081 端口映射到容器的 18081 端口(可以根据需要修改)volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"  # 挂载自定义 Nginx 配置文件- "./nginx/html:/usr/share/nginx/html"  # 挂载静态文件目录到 Nginx 容器中depends_on:- cyt  # 设置依赖关系:确保 cyt 容器在 nginx 容器之前启动networks:- cyt-net  # 连接到自定义网络 "cyt-net"# 定义自定义网络
networks:cyt-net:name: cyt  # 将自定义网络命名为 "cyt"

在终端中运行以下命令,Docker Compose 会读取 docker-compose.yml 文件并启动配置的服务

# 启动所有, -d 参数是后台启动
docker compose up -d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/6543.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

qt QFocusEvent详解

1、概述 QFocusEvent是Qt C框架中的一个事件类&#xff0c;它专门用于处理与焦点变化相关的事件。在图形用户界面&#xff08;GUI&#xff09;编程中&#xff0c;焦点事件是不可或缺的一部分&#xff0c;它们允许开发者在控件获取或失去焦点时执行特定的操作。QFocusEvent通常…

高性能分布式缓存Redis-高级应用篇章

一、发布订阅 Redis提供了发布订阅功能&#xff0c;可以用于消息的传输 Redis的发布订阅机制包括三个部分&#xff0c;publisher&#xff0c;subscriber和Channel 发布者和订阅者都是Redis客户端&#xff0c;Channel则为Redis服务器端。 发布者将消息发送到某个的频道&…

使用Python Flask实战构建Web应用

Python Flask是一个轻量级的Web框架&#xff0c;它简单易用、灵活性高&#xff0c;适用于构建各种规模的Web应用。本文将介绍如何使用Python Flask框架来实战构建一个简单的Web应用&#xff0c;并展示其基本功能和特性。 第一部分&#xff1a;搭建开发环境 在开始之前我们需要…

dockerfile 和 docker compose

目录 1.dockerfile和docker compose区别 主要区别 目的&#xff1a; 格式&#xff1a; 使用场景&#xff1a; 2.Dockerfile 2.1基本格式 2.2模块解析 2.3例子 3.docker compose 3.1安装 3.2格式 3.3执行 1.dockerfile和docker compose区别 Dockerfile 和…

如何安全的使用助听器?

安全使用助听器是非常重要的&#xff0c;以下是一些关键的建议和注意事项&#xff0c;以确保您或您的家人能够正确且安全地使用助听器&#xff1a; 1. 遵循专业指导 •在初次佩戴前&#xff0c;请务必咨询专业的听力师或医生。他们会根据您的听力状况和个人需求来调整助听器的…

VMWare安装以后虚拟机NAT模式时网卡down问题

安装完成VMware后&#xff0c;安装linux虚拟机&#xff0c;网络模式为NAT模式&#xff0c;用来联网&#xff0c;但是发现虚拟机的网卡状态一直是down的。 service network restart 会报错 解决办法如下&#xff1a; ctlaltdelete打开任务管理->服务->打开服务->找到…

Springcloud高校选课管理系统-计算机毕业设计源码27115

摘 要 随着信息技术的快速发展和高校信息化建设的深入推进&#xff0c;选课管理系统作为高校教育信息化建设的重要组成部分&#xff0c;其重要性和紧迫性日益凸显。传统的选课管理系统往往采用单体架构&#xff0c;存在系统耦合度高、可维护性差、扩展性不强等问题&#xff0c;…

Java项目实战II基于Spring Boot高校教师科研管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着高等教育的快速发展和科研活动的日…

Markdown快速上手(typora)

一级标题~六级标题 可以选中文本在这里直接设置&#xff0c;后面也有快捷键&#xff0c;也可以使用其语法&#xff0c;一个#&#xff0c;对应一级标题&#xff0c;两个#&#xff0c;对应二级标题&#xff0c;等。 我这里使用Ctrl1没生效是因为快捷键冲突&#xff0c;也需要注意…

更快更强 | HP15加热台新品!Max温度350度,200度只需60秒!30~150W功率可调,恒温加热和回流焊双模式!

正点原子HP15加热台更快更强&#xff01;最高温度可达350度&#xff0c;200度只需60秒&#xff01;30~150W功率可调&#xff0c;恒温加热和回流焊双模式&#xff01; HP15是正点原子全新推出的迷你恒温加热台&#xff0c;设备支持30~150W功率可调&#xff0c;在150W功率下从室温…

【点云网络】 pointnet 和 pointnet++

这两个网络都是斯坦福大学的一个团队提出的 我先先看一下pointnet的网络架构,这个网络比较经典&#xff0c;是2016年提出的&#xff1a; PointNet 是一个专门用于点云数据处理的神经网络。它的设计目的是直接操作不规则的点云数据&#xff0c;而无需将点云数据转换为规则网格或…

分布式——BASE理论

简单来说&#xff1a; BASE&#xff08;Basically Available、Soft state、Eventual consistency&#xff09;是基于CAP理论逐步演化而来的&#xff0c;核心思想是即便不能达到强一致性&#xff08;Strong consistency&#xff09;&#xff0c;也可以根据应用特点采用适当的方…

FPGA实战篇:Moore/Mealy状态机

什么是状态机&#xff1f; 状态机是根据当前输入信号和自身当前所处状态来改变输出逻辑的一种逻辑系统&#xff0c;目前它也被抽象应用于软件设计当中&#xff0c;本文从硬件设计角度来解释状态机&#xff0c;使用Verilog语言来抽象描述并实现状态机。 状态机类型 状态分为两…

influxdb与LSM-TREE

一、什么是LSM-TREE 在一些写多读少的场景&#xff0c;为了加快写磁盘的速度&#xff0c;提出使用日志文件追加顺序写&#xff0c;加快写的速度&#xff0c;减少随机读写。但是日志文件只能遍历查询。不支持随机查询&#xff0c;提出使用LSM-TREE。除了利用磁盘顺序写之外&…

Mac保护电池健康,延长电池使用寿命的好方法

使用Mac的过程中&#xff0c;如何延长电池的使用寿命是大家非常关心的问题&#xff0c;而养成一个良好的充电习惯能够有效的延长电池的使用寿命 避免过度充电和过度放电能够有效的保护电池&#xff0c;因此长时间的充电与长时间放点都不可取&#xff0c;但是在日常的使用过程中…

AutosarMCAL开发——基于EB ResourceM模块

目录 一、ResourceM模块的作用以及原理1.ResourceM模块的作用2.单核系统运行原理a.上电复位b.启动代码执行c.应用程序加载d.应用程序执行 3.代码执行过程4.内存分配a.地址空间划分b.具体地址分配c.示例说明 4.多核系统运行原理a.MCU架构 二、EB配置介绍三、总结 一、ResourceM模…

【LeetCode】返回链表的中间结点、删除链表的倒数第 N 个结点

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f31c;钱塘江上潮信来&#xff0c;今日方知我是我&#x1f31b; 1.返回链表的中间结点 题目&#xff1a;给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0…

Netty篇(学习前言)

目录 一、为什么使用Netty 1. Netty编程相比NIO编程的优势 2. Netty 相比其它网络应用框架的优势 二、让我们走进Netty 1. 简介 2. 设计目标 3. 主要特点 4. Netty的作者 5. Netty 的地位 6. Netty 的优势 五、Netty版本说明 六、Netty架构设计 1. 线程模型基本介绍…

Ceph 学习指南 集群部署【 cephadm 】

文章目录 引言初识 Server SANServer SAN 和传统存储对比 Ceph 概述Ceph 的架构设计Ceph 的特点Ceph 块存储Ceph 文件系统Ceph 对象存储Ceph 介绍 Ceph 集群部署配置 aliyun 源配置时间同步配置 hosts 文件安装 docker配置免密登录ceph 集群部署ceph1 配置安装 python3安装 cep…

Linux篇(常见入门命令)

目录 一、开启终端 二、Linux命令格式 1. 什么是Linux 的命令&#xff1f; 三、Linux下的命令补全 四、切换用户 五、uname&#xff1a;查看操作系统信息 六、ls&#xff1a;查看目录下文件 1. 用法一 2. 用法二 3. 用法三 七、pwd&#xff1a;显示当前路径 八、cd&…