【Ubuntu24.04】服务部署(Docker)

目录

  • 0 背景
  • 1 安装和配置Docker
  • 2 配置服务环境
    • 2.1 安装MySQL
    • 2.2 安装Redis
  • 3 部署服务
  • 4 总结

0 背景

    你的多个服务都部署在了虚拟电脑上,并且它们运行得好好的,没有任何问题。现在你的计算机的状态是:一个Windows操作系统,Windows操作系统上安装了VirtualBox或者VMware之类的虚拟机软件,在虚拟机软件的帮助下,你安装了多台虚拟电脑,有些虚拟电脑上你只安装了数据库等组件,有些虚拟电脑上部署了你的微服务,这些虚拟电脑组合在一起形成了你的整个服务。
    当你的服务运行了一段时间之后,你发现好像哪里不对劲。有的虚拟电脑上的服务或组件被频繁地使用,不过也不是什么坏事,这正是你需要的。但是有的虚拟电脑上的服务却被访问得很少,甚至几乎没被访问过。
    这时你又开始思考,似乎用一个虚拟机给那些不被经常访问的服务来用有点浪费资源了,有没有更经济一点的方法呢?不对,被不被经常访问好像并不是你看不惯的原因,你看不惯的应该是这些虚拟机占用你的资源而没有被充分利用
    你终于明白了是什么地方不对劲了:这一个虚拟机上只部署一个服务太浪费资源了,一个虚拟电脑在安装时需要让你指定资源(内存,CPU,磁盘等),你最少得指定操作系统占用的空间,而一个操作系统要占几个G的磁盘,你的服务只是一个简单的服务,运行时峰值也就几百兆,而你需要使用到的操作系统的功能也不多,你就会想,怎么才能将这些用不到的功能去掉啊?
    另外,纵观整个服务,它们都运行在Linux系统上,尽管这些Linux系统发行版不同,但是它们的内核是一样的。如果有一种“提取公因式”的技术,它能让所有这些虚拟机内核都集中在一起,然后将提取了“公因式”后的服务或组件成为一种“插件”,当把“插件”插入有内核的系统上,它就可以工作,那就好了。
    还真有,于是你开始做接下来的事。

1 安装和配置Docker

    同样,一个脚本搞定

#!/bin/bash
sudo apt update
sudo apt upgrade -y
# 安装必要工具
sudo apt install apt-transport-https
# 配置apt下载源
# 使用阿里源
aliyun_src="https://mirrors.aliyun.com/docker-ce/linux/ubuntu/"
# curl是自带的,没必要安装
curl -fsSL "${aliyun_src}gpg" | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] ${aliyun_src} $(. /etc/os-release && echo "${VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 刷新源,这一步很重要
sudo apt update
# 通过apt安装docker
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 添加镜像源
# 创建目录
sudo mkdir -p /etc/docker# 写入配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://hub.crdz.gq","https://hub.littlediary.cn","https://docker.1panel.live","https://hub.xdark.top","https://docker.m.daocloud.io","https://docker.kejilion.pro","https://registry.dockermirror.com","https://docker.unsee.tech"]
}
EOF# 配置不加sudo使用docker
sudo usermod -aG docker "${USER}"
# 重启docker服务
sudo systemctl daemon-reload && sudo systemctl restart docker

2 配置服务环境

    使用Docker安装组件,就比在操作系统上直接安装要方便多了,而且又便于管理。下面仍然是以JDKMySQLRedis举例,实际上在Docker中,无论你想安装什么都是一样的命令,只需要给个组件名和版本号即可(当然还得有真实存在的镜像才行),非常方便,不过瓶颈往往在于镜像源。
    在上面的脚本中,笔者给出了写文章时还存活的镜像地址。不保证一直可用,失效的时候再去网上找找看,修改配置文件即可。

2.1 安装MySQL

    直接run即可,注意备份实例中的数据和配置,备份数据所在的文件夹需要保证存在

# 建立数据和备份文件所在的目录
sudo mkdir -p /data/mysql/data
sudo mkdir -p /data/mysql/conf
# 指定mysql实例运行的名字,端口号映射等
docker run --name mysql-8.4 \
-e MYSQL_ROOT_PASSWORD=your_own_password \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf:/etc/mysql/conf.d \
-d -p 3306:3306 mysql:8.4
# 需要进入

    MySQL8.4似乎不需要写任何配置文件就可正常使用。

2.2 安装Redis

    直接run即可

sudo mkdir -p /data/redis/data
sudo mkdir -p /data/redis/confdocker run --name redis-7.0.15 \
-v /data/redis/data:/data \
-v /data/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-d -p 6379:6379 redis:7.0.15

    其中,redis.conf的内容就是之前在操作系统上直接安装Redis时的配置文件,去掉注释后如下:

# bind 127.0.0.1 -::1
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
pidfile /run/redis/redis-server.pid
loglevel notice
logfile /var/log/redis/redis-server.log
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir /var/lib/redis
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128# 注意这里换成你自己的密码
requirepass {your_own_password}lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
aof-timestamp-enabled no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-listpack-entries 128
zset-max-listpack-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes

    在运行实例之前需要在/data/redis/conf/中创建这个文件,并取名为redis.conf

3 部署服务

    在将你的服务打成jar包之前,你应该在配置文件中将MySQLRedis的配置项写成环境变量的形式,这既保证信息不泄露,又方便配置管理

# 其它配置省略
spring:datasource:url: jdbc:mysql://${MYSQL_HOST}:3306/cl_db?useSSL=false&serverTimezone=UTCusername: ${MYSQL_USER}password: ${MYSQL_PASSWORD}data:redis:host: ${REDIS_HOST}port: 6379password: ${REDIS_PASSWORD}

    使用Docker的时候,部署服务往往使用Dockerfile,而Dockerfile往往是以某个JDK为基础镜像的,你可以想象成JDK和服务是绑定在一起的,一个服务对应一个JDK,下面给出一个Dockerfile示例:

# 从openjdk17开始构建
FROM openjdk:17
# 镜像信息
# LABEL author="XXX"
# LABEL date=""
# LABEL maintainer=""
# LABEL version="1.0.0-SNAPSHOT"
# LABEL description=""
# 跑一些命令
RUN mkdir -p /app
# 设置环境变量,这里也可以设置服务中具体会使用到的环境变量
ENV PATH="/app:${PATH}"
ENV MYSQL_HOST=mysql-8.4
ENV MYSQL_USER=root
ENV MYSQL_PASSWORD=your_password
ENV REDIS_HOST=redis-7.0.15
ENV REDIS_PASSWORD=your_password
# 指定工作目录
WORKDIR /app
# 将jar包复制进来(<src>相对于Dockerfile所在目录,<dest>相对于工作目录)
COPY your_service.jar .
# 暴露端口,记得加上你的服务的端口
EXPOSE 80 22 443 8080
# 入口
ENTRYPOINT ["java", "-jar", "/app/your_service.jar"]

    将jar包和Dockerfile放到同一个目录下,然后在这个目录下执行下面的命令将jar包打成镜像

docker build -t your_images_name:tag .

    新建Docker网络,将服务要使用到的组件连接到这个网络

docker network create your_network
docker network connect your_network mysql-8.4
docker network connect your_network redis-7.0.15

    然后将实例运行在这个网络上,这一步可以配置在配置文件中需要用到的环境变量,注意修改成自己的,而且不要忘了端口号,不然外部访问不了。这里指定的环境变量可以将Dockerfile中的环境变量覆盖掉。

docker run -p 65535:65535 \
--name your_service_name \
--network your_network \
-e MYSQL_HOST=mysql-8.4 \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=your_password \
-e REDIS_HOST=redis-7.0.15 \
-e REDIS_PASSWORD=your_password \
-d your_images_name:tag

    至此,服务部署成功。

4 总结

    本文介绍了Docker的安装以及使用Docker来部署服务。如果有多个服务,只需要先将jar包打成镜像,然后根据镜像创建实例即可。不过,美中不足的一点是JDK17镜像有点大,有471MB,有兴趣的可以自己尝试优化。(笔者拉了一个78MBubuntu:24.04的镜像,然后下载jdk17的安装包传到实例里面安装,最后将这个实例打成镜像,有580MB。。。)
    部署服务到这里就结束了,可以看到比起最初的手动安装,Docker简化了很多操作,并且使服务和环境方便维护了,当然还有很多很强大的部署和管理服务的工具,比如docker-composek8s等,但笔者认为作为一个开发者无需去走一遍这些服务部署的实操,只需要在开发中会使用命令即可(当然还得看具体的开发有没有用到这些工具)。
    这样,就可以只使用一个虚拟电脑,然后在上面安装Docker来部署和管理你的服务了。当然关于Docker还有很多细节这篇文章没有提到,不过部署服务的模式和基本操作差不多就这样。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UI自动化测试中公认最佳的设计模式-POM

一、概念 什么是POM&#xff1f; POM是PageObjectModule&#xff08;页面对象模式&#xff09;的缩写&#xff0c;其目的是为了Web UI测试创建对象库。在这种模式下&#xff0c;应用涉及的每一个页面应该定义为一个单独的类。类中应该包含此页面上的页面元素对象和处理这些元…

L14.【LeetCode笔记】返回倒数第k个节点

目录 1.题目 2.分析 思路 代码 提交结果 1.题目 面试题 02.02. 返回倒数第 k 个节点 实现一种算法&#xff0c;找出单向链表中倒数第 k 个节点。返回该节点的值。 注意&#xff1a;本题相对原题稍作改动 示例&#xff1a; 输入&#xff1a; 1->2->3->4->5 和 …

linux-进程间通信

进程的通信是两个或多个进程实现数据的交互&#xff0c;让不同的进程看到同一份资源&#xff0c;而这份资源是由操作系统创建管理的。如果让其中一个进程来提供的话会破坏该进程的独立性&#xff0c;因为这个进程内部的数据可以被其他进程看到&#xff0c;那这个独立性就遭到了…

基于阿里云服务器部署静态的website

目录 一&#xff1a;创建服务器实例并connect 二&#xff1a;本地文件和服务器share 三&#xff1a;关于IIS服务器的安装预配置 四&#xff1a;设置安全组 五&#xff1a;建站流程 六&#xff1a;关于备案 一&#xff1a;创建服务器实例并connect 创建好的服务器实例在云…

Java算法OJ(10)哈希表练习

目录 1.前言 2.正文 2.1俩数之和 2.2无重复字符的最长子串 2.3罗马数字转整数 2.4整数转罗马数字 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来分享几道哈希表相关的练习题&#xff0c;操作比较基础但是思想比较重要&#xff0c;另外有许多思路与解法都是学习参照题解…

二叉树:堆的建立和应用

在建立堆之前&#xff0c;我们要知道什么是树和二叉树 树 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个结点组成的一个具有层次关系的集合&#xff0c;之所以把它叫做树&#xff0c;是因为它长得像一棵倒挂的树&#xff0c;也就是根在上面&…

oracle的静态注册和动态注册

oracle的静态注册和动态注册 静态注册&#xff1a; 静态注册 : 指将实例的相关信息手动告知 listener 侦 听 器 &#xff0c; 可以使用netmgr,netca,oem 以及直接 vi listener.ora 文件来实现静态注册&#xff0c;在动态注册不稳定时使用&#xff0c;特点是&#xff1a;稳定&…

postgresql按照年月日统计历史数据

1.按照日 SELECT a.time,COALESCE(b.counts,0) as counts from ( SELECT to_char ( b, YYYY-MM-DD ) AS time FROM generate_series ( to_timestamp ( 2024-06-01, YYYY-MM-DD hh24:mi:ss ), to_timestamp ( 2024-06-30, YYYY-MM-DD hh24:mi:ss ), 1 days ) AS b GROUP BY tim…

调试器 gdb/cgdb 的使用

一. touch mycode.c vim mycode.c cgdb 下载 Ubuntu&#xff1a;sudo apt-get install -y cgdb Centos: sudo yum install -y cgdb Linux 下我们编译好的代码无法直接调试 g/gcc 默认的工作模式是release模式 程序要调试&#xff0c;必须是debug模式&#xff0c;编译时…

通过DataWorks实现MaxCompute跨项目迁移

本文为您介绍如何配置不同MaxCompute项目并实现数据迁移。 背景信息 本文使用的被迁移的原始项目为教程《简单用户画像分析&#xff08;MaxCompute版&#xff09;》中的WorkShop2023项目&#xff0c;您需要再创建一个迁移目标项目&#xff0c;用于存放原始项目的表、资源、配置…

【Linux】安装cuda

一、安装nvidia驱动 # 添加nvidia驱动ppa库 sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update# 查找推荐版本 sudo ubuntu-drivers devices# 安装推荐版本 sudo apt install nvidia-driver-560# 检验nvidia驱动是否安装 nvidia-smi 二、安装cudatoolkit&…

Vue.js 学习总结(14)—— Vue3 为什么推荐使用 ref 而不是 reactive

前言 ref 和 reactive 是 Vue3 中实现响应式数据的核心 API。ref 用于包装基本数据类型&#xff0c;而 reactive 用于处理对象和数组。尽管 reactive 似乎更适合处理对象&#xff0c;但 Vue3 官方文档更推荐使用 ref。 我的想法&#xff0c;ref就是比reactive好用&#xff0c;…

ctfshow-Misc入门(1-16)

misc1 查看图片得到flag misc2 1、打开文本&#xff0c;发现以“塒NG”开头 3、修改文件格式为png格式 4、查看图片&#xff0c;得到flag *遇到的问题&#xff1a;无法直接修改后缀名 *解决方法&#xff1a;需要点击文件夹&#xff0c;然后点击查看&#xff0c;将文件拓…

自动驾驶概念

1.线控底盘 由五大系统构成&#xff1a;线控转向、线控制动系统、线控换挡、线控油门踏板以及线控悬架。 2.自动驾驶分级 L1级别&#xff0c;也被称作驾驶支援阶段。在这一阶段&#xff0c;车辆系统能够根据驾驶环境来辅助驾驶者进行方向盘操作或减速操作中的一项&#xff0c…

【C】错误的变量定义导致sprintf()‌输出错误

问题描述 刚刚写一个用AT指令透传相关的函数&#xff0c;需要用到sprintf()‌拼接字符串。 结果发现sprintf()‌拼接出来的内容是错误的&#xff0c;简化后的代码如下&#xff1a; const char AT_CIPSEND_FIX_LENGTH_HEADER[11] "ATCIPSEND"; // 错误的&#xff0…

【Pytest+Yaml+Allure】实现接口自动化测试框架

一、框架思想 requestsyamlpytestallure实现接口自动化框架。结合数据驱动和分层思想&#xff0c;将代码与数据分离&#xff0c;易维护&#xff0c;易上手。使用yaml编写编写测试用例&#xff0c;利用requests库发送请求&#xff0c;使用pytest管理用例&#xff0c;allure生成…

内网渗透横向移动1

1.信息收集 &#xff08;1&#xff09;判断域控 shell net time /domain shell ping OWA2010CN-God.god.org &#xff08;2&#xff09;主机探测 浏览探测->网络探测 主机列表显示&#xff1a; &#xff08;3&#xff09;域用户收集&#xff1a; shell net user /domain…

C++初阶——类和对象(下)

目录 1、再探构造函数——初始化列表 2、类型转换 3、static成员 4、友元 5、内部类 6、匿名对象 7、对象拷贝时编译器的优化(了解) 1、再探构造函数——初始化列表 1. 构造函数初始化除了使用函数体内赋值&#xff0c;还有一种方式——初始化列表&#xff0c; 初始化列…

数据指标与标签在数据分析中的关系与应用

导读&#xff1a;分享数据指标体系的文章很多&#xff0c;但讲数据标签的文章很少。实际上&#xff0c;标签和指标一样&#xff0c;是数据分析的左膀右臂&#xff0c;两者同样重要。实际上&#xff0c;很多人分析不深入&#xff0c;就是因为缺少对标签的应用。今天系统的讲解下…

Exploring Prompt Engineering: A Systematic Review with SWOT Analysis

文章目录 题目摘要简介方法论背景相关工作评估结论 题目 探索快速工程&#xff1a;基于 SWOT 分析的系统评价 论文地址&#xff1a; https://arxiv.org/abs/2410.12843 摘要 在本文中&#xff0c;我们对大型语言模型 (LLM) 领域的提示工程技术进行了全面的 SWOT 分析。我们强…