浅谈工作中常用应用软件本地docker化,一键部署它不香吗?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 浅谈工作中常用应用软件本地docker化,一键部署它不香吗?

背景

你是否有过这样的困惑?

常常需要本地电脑安装例如Mysql,Redis,RocketMQ,ES,Zookeeper, Nginx,Nacos 等等软件,耗时又费力。

  1. 1.每当更换电脑,或者重装系统的时候。
  2. 2.每当工作中,需要做些调优或者测试的时候,而这些软件服务一般都是运维或者DBA搭建的,自己甚至没有权限登录到服务器机器上查看,苦恼。
  3. 3.每当想学习,却被搭建基础环境折腾,无情的浪费时间。

所以,为了节约时间,我总结了用本地常用软件docker化,实现一键启动。是不是很香?

特别说明: 本文重点说明如何将软件docker化实战,本地宿主机和Docker服务通信问题,对于docker安装,docker,docker-compose 命令及用法基础知识不会讲解。


目标

  1. 1.各软件docker服务通过固定IP访问,不能每次重启docker服务IP都变化。
  2. 2.本机通过IP直接通信docker容器,而不是通过127.0.0.1 + 端口映射的方式。
  3. 3.支持多个服务一键部署,也支持单个服务一键部署。


实现步骤

  1. 1.创建网桥取名 app-network
docker network create --driver bridge  --subnet=172.30.1.0/24 --gateway=172.30.1.1 --opt "com.docker.network.bridge.name"="app-network" app-network

配置docker服务,都桥接到同一网桥app-network上

  1. 2.以mysql为例(其它服务类似)
version: '3.5'
services:
  db:
    image: hub.c.163.com/library/mysql:5.7
    restart: always
    container_name: "mysql_5_7"
    restart: always
    ports:
      - 3306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: root
    #command:
    volumes:
      - ./conf.d:/etc/mysql/mysql.conf.d
      - ./data:/var/lib/mysql
    networks:
        default:
          ipv4_address: 172.30.1.2
networks:
   default:
    external:
      name: app-network
  1. 其中: MYSQL_ROOT_PASSWORD 为root用户登录密码,指定IP: 172.30.1.2
  • ·编写docker-compose.yml文件
  • ·编写启动脚本 start.sh
#!/usr/bin/env bash
# 创建目录
mkdir -p ./conf.d
mkdir -p ./data
# 设置目录权限
chmod -R 777 ./conf.d
chmod -R 777 ./data
# 下载并启动容器,且为 后台 自动启动
docker-compose up -d
# 显示 mysql 容器
docker ps |grep mysql_5_7
  • ·启动mysql
tanyawendeMacBook-Pro:mysql bytearch$ sh ./start.sh 
mysql_5_7 is up-to-date
1be6fba30c7c   hub.c.163.com/library/mysql:5.7   "docker-entrypoint.s…"   7 hours ago   Up 7 hours   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mysql_5_7

·至此,mysql服务启动成功,一切很顺利,但是,宿主机(MAC电脑)ping不通容器

tanyawendeMacBook-Pro:mysql bytearch$ ping 172.30.1.2
PING 172.30.1.2 (172.30.1.2): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
Request timeout for icmp_seq 4
Request timeout for icmp_seq 5
Request timeout for icmp_seq 6
Request timeout for icmp_seq 7
Request timeout for icmp_seq 8
Request timeout for icmp_seq 9
  • ·尝试试了下阿里云CentOS系统,是可以ping通的。
[root@VM_0_14_centos ~]# ping 172.30.1.2
PING 172.30.1.2 (172.30.1.2) 56(84) bytes of data.
64 bytes from 172.30.1.2: icmp_seq=1 ttl=64 time=0.028 ms
64 bytes from 172.30.1.2: icmp_seq=2 ttl=64 time=0.021 ms
64 bytes from 172.30.1.2: icmp_seq=3 ttl=64 time=0.017 ms
64 bytes from 172.30.1.2: icmp_seq=4 ttl=64 time=0.027 ms
64 bytes from 172.30.1.2: icmp_seq=5 ttl=64 time=0.023 ms
64 bytes from 172.30.1.2: icmp_seq=6 ttl=64 time=0.023 ms
64 bytes from 172.30.1.2: icmp_seq=7 ttl=64 time=0.020 ms

通过查阅资料,究其原因如下:

  1. 1.Docker在Mac系统架构


docker在OSX的实现方式,是首先创建一个linux的虚拟机,在将docker放入到虚拟机中实现,而对于linux虚拟机,与OSX之间的通信,目前版本采用/var/run/docker.sock这种socket文件来通信,在OSX宿机中自然ping不通docker容器。


2.Docker 在Linux系统架构


docker是在linux内核容器基础上实现的,linux安装docker后,会创建一个为docker0的虚拟网卡,linux宿主机与docker容器之间的通信,通过docker0虚拟网卡进行。

所以对于Linux系统,到这就完成了!!!

那Mac怎么办?对于一个追求完美的程序员来说,这不能忍,必须血战到底。


Mac电脑与docker容器通信解决方案

经过多次尝试找到一种解决方案 (若有同学有其它更换办法,欢迎告知!)

  1. 1.Mac 通过 brew 安装 docker-connec
 brew install wenjunxiao/brew/docker-connector

    2.执行以下命令把 docker 的所有 bridge 网络都添加到路由中

docker network ls --filter driver=bridge --format "{{.ID}}" | xargs docker network inspect --format "route {{range .IPAM.Config}}{{.Subnet}}{{end}}" >> /usr/local/etc/docker-connector.conf

或者修改

/usr/local/etc/docker-connector.conf 

添加路由

route 172.30.1.0/24

3.配置完成,重启服务

sudo brew services start docker-connector

使用以下命令在 docker 端运行 wenjunxiao/mac-docker-connector,需要使用 host 网络,并且允许 NET_ADMIN,pull connector容器的作用是作为桥接

 docker run -it -d --restart always --net host --cap-add NET_ADMIN --name connector wenjunxiao/mac-docker-connector

5.大功告成

tanyawendeMacBook-Pro:docker-app bytearch$ ping 172.30.1.2
PING 172.30.1.2 (172.30.1.2): 56 data bytes
64 bytes from 172.30.1.2: icmp_seq=0 ttl=63 time=3.019 ms
64 bytes from 172.30.1.2: icmp_seq=1 ttl=63 time=3.751 ms
64 bytes from 172.30.1.2: icmp_seq=2 ttl=63 time=1.850 ms
64 bytes from 172.30.1.2: icmp_seq=3 ttl=63 time=3.992 ms
64 bytes from 172.30.1.2: icmp_seq=4 ttl=63 time=3.695 ms

其它

以上源码已经开源, 感兴趣同学可以移步查看。

Gitee:  https://gitee.com/bytearch_admin/docker-app.git

Github: https://github.com/bytearch/docker-app.git

目录结构如下:

.
├── README.md
├── install_network.sh
├── mac_connect_docker.md
├── mysql
│   ├── conf.d         //数据库配置文件
│   ├── data           //数据库data目录挂载,重启数据不丢失
│   ├── docker-compose.yml    
│   ├── start.sh       //启动脚本
│   └── stop.sh        //关闭脚本
├── redis
│   ├── conf
│   ├── data
│   ├── docker-compose.yml
│   ├── start.sh
│   └── stop.sh
├── rocketmq
│   ├── docker-compose.yml
│   ├── readme.md
│   ├── rmq
│   ├── rmqs
│   ├── start.sh
│   └── stop.sh
├── startAll.sh            //启动所有服务
├── stopAll.sh             //关闭所有服务
└── zookeeper
    ├── docker-compose.yml
    ├── start.sh
    ├── stop.sh
    ├── zoo1
    ├── zoo2
    └── zoo3

执行./startAll看看效果:


嗯,真香!要的就是这种效果!以后可以愉快地玩耍了!

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
5
分享
相关文章
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
161 91
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
72 44
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
91 28
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
58 23
docker部署apollo
docker部署apollo步骤
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
49 22
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
67 25
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
97 8
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈