使用Docker及docker-compose完成快速的项目私有化部署

本文目录

    • 零、前言
    • 一、搭建基础环境
    • 二、配置Docker参数
    • 三、登录到私有仓库
    • 四、准备连接程序
    • 五、编写docker-compose
    • 附一、Dockerfile编写简单介绍
    • 附二、docker-compose.yml常用命令简单介绍

零、前言

看网上好像一直没有docker-compose简单易懂的教程,于是在一顿探索之后,写了本教程,欢迎沟通。

ps:没有dockerfile基础或docker-compose基础的,可以先看附录一和附录二哦~

本次演示的私有化部署的项目,是基于Redis、RabbitMQ、Mysql及一个需要连接这三个服务的程序编写的。

一、搭建基础环境

首先需要linux环境的操作系统,然后下载基础环境,需要下载docker及docker-compose工具。
一般使用yum命令,将工具下载即可,感觉下载速度慢的,可以更换yum的数据源为国内的数据源。

贴几个国内的源地址:
	网易163:
		https://mirrors.163.com/.help/CentOS7-Base-163.repo
	阿里云:
		http://mirrors.aliyun.com/repo/Centos-7.repo

二、配置Docker参数

Docker中有一个TCP服务,可对外提供访问,默认端口为2375,我们需要将其打开,编辑文件/usr/lib/systemd/system/docker.service。

这里需要区分一下你docker的版本号:

假如你的docker版本为1.13.1,则需在ExecStart中增加-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock 。如下图所示:
使用Docker及docker-compose完成快速的项目私有化部署_第1张图片
其他版本的docker,则需在ExecStart 的最后面,增加-H tcp://0.0.0.0:2375。如下图所示:
使用Docker及docker-compose完成快速的项目私有化部署_第2张图片
然后我们重启docker,开启防火墙中的2375端口。

三、登录到私有仓库

而后,我们需要登录到私有仓库,来确保我们的基础服务的版本是我们稳定想要的,并且可以在我们在给客户部署时,提高我们镜像下载的速度。可以选择阿里云的私有仓库,也可以直接选择DockerHub。
我这里是选择了阿里云的私有仓库。
登录到阿里云控制台后,在产品与服务中找到容器镜像服务。如下图:
使用Docker及docker-compose完成快速的项目私有化部署_第3张图片
我们可以先选择镜像加速器,将我们的服务器的docker服务配置加速器,使用加速器可以提升获取Docker官方镜像的速度,阿里云会为每位用户提供一个加速器地址。里面针对常用操作系统的配置都有说明,在这里就不赘述了。如下图:
使用Docker及docker-compose完成快速的项目私有化部署_第4张图片
我们可以在命名空间选项卡中,创建一个新的命名空间。而后,在镜像仓库中,可以提前创建好镜像仓库,创建完成后选择管理,在基本信息中,我们可以看到,如何将镜像从你的服务器上传到阿里云的镜像仓库。如下图:
使用Docker及docker-compose完成快速的项目私有化部署_第5张图片

我们按照它的操作指南,先在服务器中登录docker仓库,然后pull取本次服务所需要的三个镜像。我下载的版本是:

docker.io/mysql:3.6.35
docker.io/rabbitmq:3.6.6-management
docker.io/redis:5.0.2

而后,将他们重新打tag,下面的 a0 是我下载的mysql的IMAGE ID的简写,你也可以写全,也可以写docker.io/mysql:3.6.35

docker tag a0 registry.cn-hangzhou.aliyuncs.com/privatization/mysql:5.6.35

然后在docker images中,就可以看到有两个相同IMAGE ID的镜像,其中一个就是你刚刚打tag的docker镜像了。
在这里插入图片描述
我们再执行同样的操作,将我们的RabbitMQ和Mysql也打上新的tag。

docker tag c74 registry.cn-hangzhou.aliyuncs.com/privatization/rabbitmq:3.6.6
docker tag 5958 registry.cn-hangzhou.aliyuncs.com/privatization/redis:5.0.2

最后,我们将docker push到镜像仓库中。

docker push registry.cn-hangzhou.aliyuncs.com/privatization/mysql:5.6.35
docker push registry.cn-hangzhou.aliyuncs.com/privatization/redis:5.0.2
docker push registry.cn-hangzhou.aliyuncs.com/privatization/rabbitmq:3.6.6

再登录到阿里云控制台中,就可以看到我们刚刚上传的镜像了。
使用Docker及docker-compose完成快速的项目私有化部署_第6张图片
使用Docker及docker-compose完成快速的项目私有化部署_第7张图片
至此,基础镜像的上传到此为止。

四、准备连接程序

我预先编写了一个连接Mysql、Redis、RabbitMQ的程序。这种基础程序就不详细介绍了,简单来说,就是对外提供了三个接口,监听了一个RabbitMQ的队列。
针对Mysql的两个接口,一个接口查询所有用户信息,一个接口插入用户信息。
针对Redis的一个接口,插入用户后,通过用户id去redis中取出用户信息,并返回。
针对RabbitMQ的队列,队列收到信息,在日志和控制台中输出。

而后,在idea中,下载docker工具(你也可以不下载,使用maven也是可以实现的,就是需要在pom文件中,对build里面进行一定的修改),我是下载了Alibaba Cloud Toolkit,插件的下载就不放图了,File->settings->plugins->Marketplace中搜索Alibaba Cloud Toolkit,下载安装重启即可。
安装完成后,在settings中,选择如下图所示的选项卡,填写阿里云提供的AKI和AKS。
使用Docker及docker-compose完成快速的项目私有化部署_第8张图片
再在docker选项卡下,选择TCP Connection,填写你的服务器ip:2375,点击右下角的Test Connection,测试一下连接。
使用Docker及docker-compose完成快速的项目私有化部署_第9张图片
接下来编写dockerfile,在项目目录中,创建一个dockerfile。

FROM openjdk:8-jre													#基础镜像
WORKDIR /															#工作目录
ADD target/demo-0.0.4.jar demo.jar									#拷贝文件(会自动解压)
EXPOSE 17002														#对外提供的服务端口
CMD java -jar -Dspring.config.location=/data/conf/demo.yml demo.jar #容器启动时执行的命令

安装完Alibaba Cloud Toolkit,在Tools中会多出Alibaba Cloud这么一个选项,如下图选择 Deploy to ACR。
使用Docker及docker-compose完成快速的项目私有化部署_第10张图片
指定项目目录、dockerfile文件位置、版本号(以上三个一般都会自动填写),选择命名空间,选择要上传到哪个镜像仓库,没打成jar包的,可以在最下面,Before launch处,选择加号,用maven先进行打包。
使用Docker及docker-compose完成快速的项目私有化部署_第11张图片
都做完后,点击run,就会自动打包,将jar包通过docker的2375上传到你的服务器中,然后再通过你的服务器,上传到阿里云私有仓库中。正常的话,上传完成,会在阿里云镜像服务中出现你所上传版本的镜像。如下图所示
使用Docker及docker-compose完成快速的项目私有化部署_第12张图片

五、编写docker-compose

docker-compose是个yml的文件,所以我们需要根据yml的规则来编写,我们可以指定docker-compose的networks,这样,假如你用多个docker-compose.yml启动服务,那么这些服务在同一网络中可相互通讯。你也可以用一个docker-compose.yml文件启动所有服务,只需要在程序遇到错误是restart=always就可以了,不写networks,在启动docker-compose时会自动生成一个networks,接下来就是我编写的docker-compose。

version: '3'										#指定docker-compose的版本,不同版本下面的语句可能不同
services:
  db:												#自定义服务名称,
    image: registry.cn-hangzhou.aliyuncs.com/privatization/mysql:5.6.35		#基础镜像
    container_name: mydb							#容器名称,
    environment:
      NAME: "db"
      MYSQL_ROOT_PASSWORD: "123456"					#mysql的root密码
    ports:
      - "13306:3306"								#对外开放的端口
    volumes:
      - "/data/docker-compose/mysql:/data"			#服务对外的映射文件夹
      - "/data/docker-compose/my.cnf:/etc/my.cnf"	#指定你想要mysql的配置文件,也可以不指定,就会到默认位置去查找
      - "/data/docker-compose/init:/docker-entrypoint-initdb.d/" #docker-entrypoint-initdb.d文件夹为mysql初始化会执行里面的sql文件,我在里面放置了创建表、添加随机数据的sql语句。
    restart: always									#遇到错误自动重启

  redis:
    image: registry.cn-hangzhou.aliyuncs.com/privatization/redis:5.0.2
    container_name: myredis
    environment:
      NAME: "redis"
    ports:
      - "26379:6379"
    command: redis-server /etc/redis.conf			#redis的启动命令,密码在配置文件中指定
    volumes:
      - "/data/docker-compose/redis:/data"
      - "/data/docker-compose/redis.conf:/etc/redis.conf"
    restart: always

  rabbitmq:
    image: registry.cn-hangzhou.aliyuncs.com/privatization/rabbitmq:3.6.6
    container_name: myrabbitmq
    environment:
      NAME: "rabbitmq"
      RABBITMQ_DEFAULT_USER: 'test'
      RABBITMQ_DEFAULT_PASS: 'test123'  
    ports:
      - "25672:5672"
      - "35672:15672"
    restart: always
    volumes:
      - "/data/docker-compose/rabbitmq:/data"
      - "/data/docker-compose/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf"
      - "/data/docker-compose/rabbit.json:/data/rabbit.json"
    
	demo:
    image: registry.cn-hangzhou.aliyuncs.com/privatization/demo:0.0.4
    container_name: demo
    depends_on:										#依赖服务,依赖上面的db、redis、rabbitmq
      - db
      - redis
      - rabbitmq
    environment:
      NAME: "demo"
    ports:
      - "17002:17002" 
    volumes:
      - "/data/docker-compose/demo:/data"
    restart: always

基础镜像的服务,这样基本就可以启动起来了,我们可以先测试一下,在docker-compose.yml所在的文件夹,执行docker-compose up

PS:别忘了修改上面映射文件夹的位置、创建你映射的文件夹、MYSQL建库建表的SQL语句
PSS:别忘了修改或创建你的配置文件
PSSS:docker-compose -d up可以使其在后台执行,docker-compose down会停止并删除docker-compose.yml创建的所有容器

由于rabbitmq需要有vhost和user等信息,所以我们预先在之前搭建好的rabbitmq中 (测试你写的程序的时候创建的MQ),导出配置信息,如下图,会保存成一个json。
使用Docker及docker-compose完成快速的项目私有化部署_第13张图片
而后在我们新启动的rabbitmq中,导入刚刚的那个json文件。(别忘了预先开启防火墙端口哦~)
使用Docker及docker-compose完成快速的项目私有化部署_第14张图片
配置导入完成后,linux的控制台会输出demo程序启动成功的语句 (为了直观展示,所以我在启动docker-compose的时候没有选择-d,并且demo程序的运行信息我选择输出到了控制台)

而后,进行测试我们的程序是否真的连接上基础服务了。
首先,在postman等工具,测试两个Mysql的接口,服务user/${user_id},显示如下图。可以确认数据为我们预先插入的数据。
使用Docker及docker-compose完成快速的项目私有化部署_第15张图片
然后再测试redis的接口,结果如下图,可以看到,我插入后的数据返回了。
使用Docker及docker-compose完成快速的项目私有化部署_第16张图片
为确保正确,可以再去Redis Desktop Manager之类的工具中查看数据是否已插入。
使用Docker及docker-compose完成快速的项目私有化部署_第17张图片
最后,我们测试RabbitMQ是否连接正常,我们去RabbitMQ的管理界面,找到绑定的Queue中,publish一条数据,如下图。
使用Docker及docker-compose完成快速的项目私有化部署_第18张图片
在点击完publish后,linux的控制台输出了如下图所示的收到的数据。
使用Docker及docker-compose完成快速的项目私有化部署_第19张图片
至此,简单的使用Docker及docker-compose完成私有化服务部署的讲解,就告一段落了。

附一、Dockerfile编写简单介绍

		基础镜像			FROM openjdk:8-jre
		工作目录			WORKDIR /
		将包添加到镜像	ADD demo-0.0.4.jar demo.jar
		需开发端口		EXPOSE 17002
		启动执行命令		CMD java -jar -Dspring.config.location=/data/conf/demo.yml demo.jar

附二、docker-compose.yml常用命令简单介绍

up
	-d 在后台运行服务容器
	–no-recreate如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
	-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
	-f 指定使用的Compose模板文件
down
	停用移除所有容器以及网络相关
stop
	-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
bulid
	构建(重新构建)项目中的服务容器。
	-m, –memory MEM为构建的容器设置内存大小
	–force-rm 删除构建过程中的临时容器
pull
	拉取服务依赖的镜像。
	–ignore-pull-failures,忽略拉取镜像过程中的错误
	–parallel,多个镜像同时拉取
	–quiet,拉取镜像过程中不打印进度信息
run
	在指定服务上执行一个命令。
scale
	设置指定服务运行的容器个数。通过service=num的参数来设置数量

你可能感兴趣的:(Docker,docker,后端,容器)