当前位置: 首页 > news >正文

搭建内网开发环境(一)|基于docker快速部署开发环境

引言

最近因需要搭建一套简易版的纯内网的开发环境,服务器采用 centos8.0,容器化技术采用 docker 使用 docker-compose 进行容器编排。
该系列教程分为两大类:

  • 软件安装和使用,这类是开发环境常用的软件部署和使用,涉及到的应用有:
    • docker
    • nexus
    • gitea
    • mysql
    • redis
    • minio
  • 应用部署实战:通过实战将开发好的程序部署到搭建好的开发环境中

docker

安装

对于 docker 的安装分为两种情形,一种是服务器能够访问外网,这种安装比较简单,一种是不能访问外网,对于纯内网安装,需要提前准备好安装文件,复制到内网服务器上。

在线安装

  1. 卸载旧版本
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
  1. 设置 docker 仓库,方便安装和更新 docker,由于官方的源比较慢,可以使用第三方的源
# 安装所需要的软件包# 使用官方源
sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo
# 阿里云第三方源
sudo yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 清华大学第三方源
sudo yum-config-manager \--add-repo \https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
  1. 安装 docker enginer
    1. 安装最新版本

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

  1. 指定版本安装
    1. 查看版本号:yum list docker-ce --showduplicates | sort -r

image.png

  2. 选择版本号进行安装:`sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io`
  1. 启动 docker
    1. 启动命令:systemctl start docker
    2. 查看是否启动成功,通过 docker info 命令输出 docker 版本信息则安装成功

image.png

  1. 卸载 docker
    1. 删除安装包

yum remove docker

  1. 删除镜像、容器等相关文件

rm -rf /var/lib/docker

离线安装

如果服务器没有外网的情况下,如果通过在线直接获取安装包,这种情况下需要先将安装包准备好上传到服务器在进行安装。

下载安装包
  1. 进入官网下载页面进行选择对应的版本下载,页面链接https://download.docker.com/linux/static/stable/x86_64/

image.png

安装
  1. 解压安装包:tar -zxvf docker-20.10.9.tgz
  2. 安装到 /usr/bin/:mv /docker/* /usr/bin/
  3. 创建 docker 服务
    1. 编辑 /etc/systemd/system/docker.service,内容如下
[Unit]
Description=Docker Service
After=network.target
[Service]
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -S HUP $MAINPID
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
  1. 重启 docker 加载配置文件,并设置开启启动
    1. 重启:sudo systemctl daemon-reload && sudo systemctl restart docker
    2. 设置开机启动:sudo systemctl enable docker
  2. 查看docker是否启动成功,使用命令 systemctl status docker

设置镜像源

  1. 编辑 /etc/docker/daemon.json 文件,添加阿里云镜像源,内容如下:
{
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}
  1. 重启 docker 使配置生效

sudo systemctl daemon-reload && sudo systemctl restart docker

纯内网如何下载镜像

如果是纯内网部署,且还搭建好私服(这个在后续的教程中会演示)如何获取 docker 镜像呢?
首先需要将部门需要的镜像提前准备好(后期部署好 docker 私服后可从私服下载镜像)先从一台外网机器下载好所需要的镜像,并导出镜像,发送到内网服务上,再在内网服务器上加载镜像到 docker 中;具体步骤如下:

  1. 在外网机器下载好需要的镜像文件
# 拉取 mysql 镜像
docker pull mysql:8.4.2
# 拉取 redis 镜像
docker pull redis:latest
# 拉取 minio 镜像
docker pull minio/minio:latest 
# 拉取 nexus 镜像
docker pull sonatype/nexus3:latest
# 拉取 gitea 镜像
docker pull gitea/gitea:latest
  1. 导出镜像文件
# 导出 mysql 镜像
docker save -o mysql.tar mysql:8.4.2
# 导出 redis 镜像
docker save -o redis.tar redis:latest
# 导出 minio 镜像
docker save -o minio.tar minio/minio:latest
# 导出 nexus3 镜像
docker save -o nexus3.tar sonatype/nexus3:latest
# 导出 mysql 镜像
docker save -o gitea.tar gitea/gitea:latest
  1. 发送到内网服务器

使用命令或者 FTP 工具将镜像文件拷贝到内网服务器

  1. 内网服务器加载镜像
# 加载 mysql 镜像
docker load -i mysql.tar
# 加载 redis 镜像
docker load -i redis.tar 
# 加载 minio 镜像
docker load -i minio.tar 
# 加载 nexus3 镜像
docker load -i nexus3.tar 
# 加载 mysql 镜像
docker load -i gitea.tar

docker-compose

简介

docker-compose 是 docker 官方的开源项目,用于定义和运行多个容器应用程序的工具,它允许用户通过 YAML 文件来配置应用程序服务,并通过 docker-compose 命令来启动、停止和管理整个应用程序。
docker-compsoe 简化了容器应用程序之间的部署和管理过程,使得开发者可以快速的搭建应用,并且可以应用在不同的系统环境中,减少配置错误带来的问题。

安装

在线安装

  1. 执行安装命令

sudo curl -L "[https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-$(uname](https://github.com/docker/compose/releases/tag/v2.29.1) -s)-$(uname -m)" -o /usr/bin/docker-compose

  1. 如需要安装其他版本的请替换上述命令的 v2.29.1 为想要的版本号,查看版本请前往https://github.com/docker/compose/releases
  2. 赋予可执行权限

sudo chmod +x /usr/bin/docker-compose

  1. 通过 docker-compose 验证是否安装成功

离线安装

  1. 下载安装包

点击前往官方下载安装文件,进入 https://github.com/docker/compose/releases,选择合适的版本进行下载
image.png

  1. 安装
    1. 将文件命名为 docker-compose 并将文件移动到 /usr/bin 中

sudo mv docker-compose-linux-x86_64 /usr/bin/docker-compose

  1. 赋予可执行权限

sudo chmod +x /usr/bin/docker-compose

  1. 通过 docker-compose 验证是否安装成功

image.png

卸载

通过 rm /usr/bin/docker-compose删除

常用命令

docker-compose 的常用命令格式为 docker-compose [OPTIONS] COMMAND,docker-compose 的命令与 docker 的命令非常相似,常用的命令有

  1. docker-compose up

用于根据指定文件创建和启动容器,如果没有指定文件默认为当前目录下的 docker-compose.yml 文件,常用的参数有:

参数说明
-f指定 compose 编排文件
-d后台执行
–force-recreate强制重新创建容器,即使未发生改动
–no-recreate如果容器存在,不重新创建,不能与–force-recreate 同时使用
–remove-orphans删除没有在 compose 文件中定义的容器
–build在启动容器前构建镜像
–no-build不自动构建镜像
–no-start创建服务后不启动
–scale将服务实例扩容到指定数量,会覆盖在 compose 文件中设置该选项
  1. docker-compose down

用于停止和删除容器、网络和卷,常用的参数有

参数说明
–rmi string删除服务关联的镜像,可选的参数有 all 删除所有镜像,local 删除本地镜像
-v, --volumes删除 compose 中声明的卷
–remove-orphans删除未在 compose 文件定义的容器
  1. docker-compose ps

查看由 docker-compose 管理的容器,默认使用当前目录下的 docker-compose.yml 文件可通过-f 指定 compose 文件,默认只显示正在运行的容器,可通过 docker-compose ps -a 查看所有容器

  1. docker-compose stats

查看对应 compose 文件管理的容器资源使用情况,默认查看正在运行的容器,通过 -a 参数查看所有

  1. docker-compose cp

在容器和宿主机之间复制文件

  1. 容器文件复制到宿主机

docker compose cp [OPTIONS] SERVICE:SRC_PATH DEST_PATH|-

  1. 宿主机文件复制到容器

docker compose cp [OPTIONS] SRC_PATH|- SERVICE:DEST_PATH

  1. docker-compose exec

在正在运行的容器中执行命令,格式为:docker compose exec [OPTIONS] SERVICE COMMAND [ARGS...]

  1. docker-compose start

启动对应 compose 文件对应的服务

  1. docker-compose restart

重启对应 compose 文件对应的服务

  1. docker-compose stop

停止对应 compose 文件对应的服务

实战 docker-compose 部署 mysql 、redis

mysql 和 redis 是常用的开发应用软件,本系列教程的后续多个应用也依赖于 mysql 和 redis,如果是纯内网可参考上述教程准备好镜像,在本教程后续会搭建 docker 私服,则不需要手动加载镜像

  1. 创建目录用于卷挂载
    1. mysql
      1. /opt/mysql/data:存放 mysql 数据
      2. /opt/mysql/conf.d/:存放 mysql 配置
      3. my.cnf 文件
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8
default-storage-engine=INNODB
sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
max_allowed_packet=7096M
lower_case_table_names=1
  1. redis
    1. /opt/redis/data:存放 redis 数据
    2. /opt/redis/config:存放 redis 配置
    3. /opt/redis/logs:存放 redis 日志
    4. redis.conf 文件
################################## NETWORK #####################################
port 6379
tcp-keepalive 300
################################# GENERAL #####################################
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
################################ SNAPSHOTTING  ################################
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
################################# REPLICATION #################################
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
################################## SECURITY ################################################################ LAZY FREEING ####################################
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
############################## APPEND ONLY MODE ###############################
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes
################################ LUA SCRIPTING  ###############################
lua-time-limit 5000
notify-keyspace-events ""
############################### ADVANCED CONFIG ###############################
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-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
########################### ACTIVE DEFRAGMENTATION #######################
jemalloc-bg-thread yes
  1. 创建网络:docker network create env-net
  2. 编写 docker-compose.yml
version: "3.8"networks:env-net:driver: bridge
services:db:image: mysql:8.4.2restart: on-failurecontainer_name: mysqlenvironment:- TZ=Asia/Shanghai- MYSQL_ROOT_PASSWORD=root- INSTALL4J_ADD_VM_PARAMS=-Xms128m -Xmx1024m -XX:MaxDirectMemorySize=512m- MYSQL_USER=gitea- MYSQL_PASSWORD=gitea- MYSQL_DATABASE=giteaports:- "3306:3306"networks:- env-netvolumes:- /opt/mysql/data/:/var/lib/mysql/- /opt/mysql/conf.d/my.cnf:/etc/mysql/my.cnfprivileged: trueredis:image: redis:latestcontainer_name: redisrestart: on-failureports:- "6379:6379"command:redis-server /etc/redis/redis.confvolumes:- /opt/redis/data:/data- /opt/redis/config/redis.conf:/etc/redis/redis.conf- /opt/redis/logs:/logsnetworks:- env-netprivileged: true
  1. 启动,通过 sudo docker-compose up -d 启动,等待服务部署
  2. 查看是否部署成功,通过 docker-compose ps 查看容器状态

结语

本文介绍了 docker 和 docker-compose 在线和离线的两种方式,以及 docker-compose 的常见命令,最后实操如何利用 docker-compose 部署 mysql 和 redis。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ES高级查询Query DSL查询详解、term术语级别查询、全文检索、highlight高亮
  • 学习日志8.14--ALC(Access Control List)访问控制列表
  • 一分钟学会Linux交换分区
  • 【Python深度学习】图像分割经典网络:U-Net
  • 官方招募 | 仓颉语言三方库社区建设全速启航,全球开发者、技术大神只等您!
  • 掌握CSS的时间之旅::past和:future伪类的探索与应用
  • AI工作流:低代码时代的革新者,重塑手机问答类应用生态
  • 【微信小程序】自定义组件 - 数据监听器
  • Qt Creator安装配置指南
  • 【运维项目经历|041】上云项目-物理机迁移到阿里云
  • 【秋招笔试】8.18大疆秋招(第三套)-三语言题解
  • Zotero 常用插件介绍
  • USRP:Link 22 战术数据链
  • Linux随记(十一)(部署flink-1.16.3、jdk-11.0.19、zookeeper-3.4.13、kafka_2.12-2.2.2)
  • 怎样把经典CAD工具栏调出来
  • 深入了解以太坊
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • ECMAScript入门(七)--Module语法
  • IP路由与转发
  • Linux Process Manage
  • mysql 数据库四种事务隔离级别
  • Promise面试题,控制异步流程
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • SpiderData 2019年2月23日 DApp数据排行榜
  • spring + angular 实现导出excel
  • 安卓应用性能调试和优化经验分享
  • 从tcpdump抓包看TCP/IP协议
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 普通函数和构造函数的区别
  • 如何实现 font-size 的响应式
  • 如何在GitHub上创建个人博客
  • 深入浅出webpack学习(1)--核心概念
  • 网络应用优化——时延与带宽
  • 学习笔记:对象,原型和继承(1)
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # Maven错误Error executing Maven
  • #Ubuntu(修改root信息)
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • ${ }的特别功能
  • (11)MATLAB PCA+SVM 人脸识别
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (web自动化测试+python)1
  • (ZT)薛涌:谈贫说富
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)视频码率,帧率和分辨率的联系与区别
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • @Mapper作用
  • @拔赤:Web前端开发十日谈
  • @取消转义