DockerDeskTop+DockerCompose一键部署(Mac)

守听  金牌会员 | 2025-2-13 18:26:27 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 978|帖子 978|积分 2934

业务背景

代码仓库
项目写好了,其中必要使用到一些中间件,考虑使用Docker来进行部署,但一个个初始化容器太慢了,以是考虑使用DockerCompose来指定镜像一键进行部署。
当然小编使用的是mac,但手上并没有服务器,当然愿意折腾的可以使用virtualBox安装Linux镜像,在当地搭建一个虚拟机来运行。
这篇文章重要来讲讲在mac情况下,使用 Docker DeskTop 来一键部署必要的情况
标准流程:

  • idea配置ssh直接利用长途服务器,而且在服务器上安装并开发docker

    • 可以看这篇文章:IDEA+Docker一键部署项目_intellij idea docker开发java项目-CSDN博客

  • 在项目Pom文件中集成Docker插件,一键将项目镜像打包并部署到长途服务器上。

    • 可以看这篇文章:Maven一键部署Springboot到Docker仓库

  • docker拉取所需镜像,编写dockercompose
  • dockercompose中涉及到的配置文件必要自界说(nginx)并上传到服务器上,使用dockerfile编写脚本进行上传

    • 留意dockercompose中也要写挂载的配置文件地点

   留意服务器必要包含底子镜像,dockercompose指定镜像才能生效,同理配置文件地点也是要有效的
  DockerDeskTop

起首由于Mac的虚拟机情况太折磨人,尤其是M系列芯片之后,建议直接使用DockerDeskTop避免内耗。
起首docker desktop它其本质也是一个虚拟机,只不过它是透明的,我们在mac当地不能直接去访问或修改其下的文件,自由性就没有Linux那么高,但通常来说也不容易玩坏。
可以通过这个地点可以看到docker desktop的一些东西,它重要是用来存放镜像和容器的底层存储路径 :


  • ~/Library/Containers/com.docker.docker/Data/vms/0/
DockerDeskTop挂载宿主主机配置文件

在docker中有时间是必要挂载我们编写的配置文件,在虚拟机中只必要将配置文件找到,写在指令中即可,例如:
  1. docker run -d --name redis -p 6379:6379
  2. -v /etc/redis/data:/data
  3. -v /etc/redis/conf/redis.conf:/etc/redis/redis.conf
复制代码
但这里DockerDeskTop显然是无法这样做的,这里就是必要将mac当地(宿主主机)的配置文件地点来进行利用,其实利用也较为简单,必要在设置中将配置文件的地点设置为共享即可,之后就可以正常的在dockercompose中写入了,这里是参考代码:
  1. version: '3'
  2. services:
  3.   redis:
  4.     image: redis:7
  5.     container_name: redis
  6.     command: redis-server --appendonly yes
  7.     volumes:
  8.       - /mydata/redis/data:/data #数据文件挂载
  9.     ports:
  10.       - 6379:6379
  11.   nginx:
  12.     image: nginx:1.22
  13.     container_name: nginx
  14.     volumes:
  15.       - /Users/tomsmile/Desktop/mydata/nginx/conf/nginx.conf:/etc/nginx/nginx.conf  # 修改为宿主机的文件路径
  16.       - /Users/tomsmile/Desktop/mydata/nginx/html:/usr/share/nginx/html #静态资源根目录挂载
  17.       - /Users/tomsmile/Desktop/mydata/nginx/logs:/var/log/nginx #日志文件挂载
  18.     ports:
  19.       - 80:80
  20.   rabbitmq:
  21.     image: rabbitmq:3.9.11-management
  22.     container_name: rabbitmq
  23.     volumes:
  24.       - /mydata/rabbitmq/data:/var/lib/rabbitmq #数据文件挂载
  25.     ports:
  26.       - 5672:5672
  27.       - 15672:15672
  28.   elasticsearch:
  29.     image: elasticsearch:7.17.3
  30.     container_name: elasticsearch
  31.     environment:
  32.       - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
  33.       - "discovery.type=single-node" #以单一节点模式启动
  34.       - "ES_JAVA_OPTS=-Xms2g -Xmx2g" #设置使用jvm内存大小
  35.     volumes:
  36.       - /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
  37.       - /mydata/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
  38.     ports:
  39.       - 9200:9200
  40.       - 9300:9300
  41.     mem_limit: 4g  # 设置内存限制
  42.     cpu_shares: 512  # 设置 CPU 权重
  43.   logstash:
  44.     image: logstash:7.17.3
  45.     container_name: logstash
  46.     environment:
  47.       - TZ=Asia/Shanghai
  48.     volumes:
  49.       - /Users/tomsmile/Desktop/mydata/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf  # 修改为宿主机的文件路径
  50.     depends_on:
  51.       - elasticsearch #kibana在elasticsearch启动之后再启动
  52.     links:
  53.       - elasticsearch:es #可以用es这个域名访问elasticsearch服务
  54.     ports:
  55.       - 4560:4560
  56.       - 4561:4561
  57.       - 4562:4562
  58.       - 4563:4563
  59.   kibana:
  60.     image: kibana:7.17.3
  61.     container_name: kibana
  62.     links:
  63.       - elasticsearch:es #可以用es这个域名访问elasticsearch服务
  64.     depends_on:
  65.       - elasticsearch #kibana在elasticsearch启动之后再启动
  66.     environment:
  67.       - "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
  68.     ports:
  69.       - 5601:5601
复制代码
  留意在部署es的时间,最好是能在compose文件中指明其内存,否则可能启动失败,当然也可能必要在docker-desktop中为资源添加更多空间
  额外阐明,假如要在docker中部署mysql5.7,可能出现镜像拉取失败的题目:
mac m2 arm64 docker安装mysql 5.7_macbook m2安装mysql5.7-CSDN博客
  1. docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d  mysql:5.7 --lower_case_table_names=1
复制代码
  参数顺序一定要对,–lower_case_table_names=1要加在镜像名背面,镜像名前面是参数,背面是mysql配置,否则会报错
  dockercompose写法:
  1. version: '3'
  2. services:
  3.   mysql:
  4.     image: mysql:5.7
  5.     container_name: mysql
  6.     command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  7.     restart: always
  8.     environment:
  9.       MYSQL_ROOT_PASSWORD: root #设置root帐号密码
  10.     ports:
  11.       - 3306:3306
  12.     volumes:
  13.       - /mydata/mysql/data:/var/lib/mysql #数据文件挂载
  14.       - /mydata/mysql/conf:/etc/mysql #配置文件挂载
  15.       - /mydata/mysql/log:/var/log/mysql #日志文件挂载
复制代码
宿主主机路径 /mydata/mysql/data 被映射到 容器内部路径 /var/lib/mysql。
容器内的数据将会存储在宿主主机上对应的路径上。
   假如有的配置文件并不必要挂载自界说编写的配置文件,可以使用 /mydata/mysql/data 这个地点,留意 /mydata必要在DockerDeskTop 中的共享文件中进行额外添加
/mydata:实际上并不是直接对应宿主主机的物理地点,这里是DockerDeskTop自身映射的地点,必要也必要我们额外进行添加
  Docker文件存放地点:


  • 在Docker中,当地的镜像文件都存放在哪里? - 黄嘉波 - 博客园
  • Docker学习笔记之在 Windows 和 Mac 中使用 Docker - 时光飞逝,逝者如斯 - 博客园
测试宿主文件挂载到docker中:Docker Desktop中安装Redis并挂载配置文件_docker desktop 挂载当地文件夹-CSDN博客
  1. Error response from daemon: Mounts denied:
  2. The path /mydata/rabbitmq/data is not shared from the host and is not known to Docker.
  3. You can configure shared paths from Docker -> Preferences... -> Resources -> File Sharing.
复制代码
题目形貌:在Mac系统下,实验让系统根目录下的文件与容器内文件进行映射时报错。
办理方案:在设置中,将路径设置为共享即可

继docker-maven-plugin插件的使用,下面简单讲讲在Mac上踩的坑
小编使用的是dockerdesktop来使用docker,以是一切配置都是在dockerdesktop中进行。
docker配置

在mac的idea中配备docker,并不必要额外配置什么,只必要勾选 docker for mac 即可使用

开启长途API

Windows、Mac、Linux中Docker开启长途访问API(2375端口)以及各种坑 - (App Store/公众号/小程序:分享录)
试了下在mac的dockerdesktop中直接修改deamon.json并不能开启,还会导致报错:

后续实验将其设置修改为User,也不行,而且这种情势还必要重新指定docker的情况变量位置

后续通过下载镜像socat,并开启容器来实现开启长途API
  1. docker pull alpine/socat
复制代码
  1. docker run -d --name=socat --restart=always \
  2. -p 2375:2375 \
  3. -v /var/run/docker.sock:/var/run/docker.sock \
  4. alpine/socat \
  5. tcp-listen:2375,fork,reuseaddr unix-connect:/var/run/docker.sock
复制代码
测试(输入本机ip地点):
  1. curl http://192.168.8.86:2375/version
复制代码

至此docker的配置完成,接下来是代码插件配置
docker-maven-plugin

重要就是修改地点为指定服务器的地点,下面是一个示例文件:
  1. <build>
  2.         <plugins>
  3.             <plugin>
  4.                 <groupId>org.springframework.boot</groupId>
  5.                 <artifactId>spring-boot-maven-plugin</artifactId>
  6.             </plugin>
  7.             <plugin>
  8.                 <groupId>io.fabric8</groupId>
  9.                 <artifactId>docker-maven-plugin</artifactId>
  10.                 <version>${docker.maven.plugin.version}</version>
  11.                 <executions>
  12.                     <!--如果想在项目打包时构建镜像添加-->
  13.                     <execution>
  14.                         <id>build-image</id>
  15.                         <phase>package</phase>
  16.                         <goals>
  17.                             <goal>build</goal>
  18.                         </goals>
  19.                     </execution>
  20.                 </executions>
  21.                 <configuration>
  22.                     <!-- Docker 远程管理地址-->
  23.                     <dockerHost>${docker.host}</dockerHost>
  24.                     <images>
  25.                         <image>
  26.                             <!--定义镜像名称-->
  27.                             <name>mall-tiny/${project.name}:${project.version}</name>
  28.                             <!--定义镜像构建行为-->
  29.                             <build>
  30.                                 <!--定义基础镜像-->
  31.                                 <from>openjdk:8</from>
  32.                                 <args>
  33.                                     <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
  34.                                 </args>
  35.                                 <!--定义哪些文件拷贝到容器中-->
  36.                                 <assembly>
  37.                                     <!--定义拷贝到容器的目录-->
  38.                                     <targetDir>/</targetDir>
  39.                                     <!--只拷贝生成的jar包-->
  40.                                     <descriptorRef>artifact</descriptorRef>
  41.                                 </assembly>
  42.                                 <!--定义容器启动命令-->
  43.                                 <entryPoint>["java", "-jar","-Dspring.profiles.active=prod","/${project.build.finalName}.jar"]</entryPoint>
  44.                                 <!--定义维护者-->
  45.                                 <maintainer>macrozheng</maintainer>
  46.                             </build>
  47.                         </image>
  48.                     </images>
  49.                 </configuration>
  50.             </plugin>
  51.         </plugins>
  52.     </build>
复制代码


  • 相关配置阐明:

    • executions.execution:此处配置了在maven打包应用时构建docker镜像;
    • image.name:用于指定镜像名称,mall-tiny是仓库名称,                                                               p                                     r                                     o                                     j                                     e                                     c                                     t                                     .                                     n                                     a                                     m                                     e                                              为镜像名称,                                          {project.name}为镜像名称,                           project.name为镜像名称,{project.version}为镜像标署名称;
    • dockerHost:打包后上传到的docker服务器地点;
    • build.from:该应用所依赖的底子镜像,此处为openjdk;
    • entryPoint:docker容器启动时执行的下令,可以使用-Dspring.profiles.active=prod指定应用配置文件;
    • assembly:界说哪些文件拷贝到容器中;
    • assembly.targetDir:界说拷贝到容器的目录;
    • assembly.descriptorRef:只拷贝生成的jar包;
    • maintainer:界说项目的维护者。

  • 添加application-prod.yml配置文件,只是将之前的数据库地点的localhost改为了db;
   可以把docker中的容器看作独立的虚拟机,mall-tiny-docker访问localhost自然会访问不到mysql,docker容器之间可以通过指定好的服务名称db进行访问,至于db这个名称可以在运行mall-tiny-docker容器的时间指定。
  1. server:
  2.   port: 8080
  3. spring:
  4.   datasource:
  5.     url: jdbc:mysql://db:3306/mall_tiny?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
  6.     username: root
  7.     password: root
复制代码
其中在pom文件中配置的和dockerFile实际上是差不多的,两种方式都可以用来实现打包项目的镜像jar包,dockerFile是最为传统的方式,它是由用户起首使用maven对项目进行打包(留意使用此方式必要将pom文件关于docker-maven-plugin的代码进行注释),之后将打好的jar包放置在dockerFile的同级目录下,点击运行即可推至长途服务器上的docker。

更多介绍–docker-maven-plugin

代码仓库:GitHub - macrozheng/mall-learning at dev-v2
还在手动部署SpringBoot应用?试试这个自动化插件! | mall学习教程
docker-maven-plugin不仅可以利用镜像,还可以利用容器,乃至可以直接在pom文件中指明挂载的位置,例如下面指令:
  1. docker run -p 8080:8080 --name mall-tiny-fabric \
  2. --link mysql:db \
  3. -v /etc/localtime:/etc/localtime \
  4. -v /mydata/app/mall-tiny-fabric/logs:/var/logs \
  5. -d 192.168.3.101:5000/mall-tiny/mall-tiny-fabric:0.0.1-SNAPSHOT
复制代码
在pom文件中可以这样写:
  1. <!--定义容器启动行为-->
  2. <run>
  3.     <!--设置容器名,可采用通配符-->
  4.     <containerNamePattern>${project.artifactId}</containerNamePattern>
  5.     <!--设置端口映射-->
  6.     <ports>
  7.         <port>8080:8080</port>
  8.     </ports>
  9.     <!--设置容器间连接-->
  10.     <links>
  11.         <link>mysql:db</link>
  12.     </links>
  13.     <!--设置容器和宿主机目录挂载-->
  14.     <volumes>
  15.         <bind>
  16.             <volume>/etc/localtime:/etc/localtime</volume>
  17.             <volume>/mydata/app/${project.artifactId}/logs:/var/logs</volume>
  18.         </bind>
  19.     </volumes>
  20. </run>
复制代码
当然照旧建议使用dockerCompose来同一订定,可读性也比较高
docker启动容器

在docker中启动打包的项目镜像,留意要指定mysql的服务要和配置文件中也要保持同等,这里是用服务名称来进行启动,db是启动的mysql容器。


  • 使用docker下令启动:
  1.   docker run -p 3307:3306 --name mysql \
  2.   -v /mydata/mysql/log:/var/log/mysql \
  3.   -v /mydata/mysql/data:/var/lib/mysql \
  4.   -v /mydata/mysql/conf:/etc/mysql \
  5.   -e MYSQL_ROOT_PASSWORD=root  \
  6.   -d mysql:5.7
复制代码


  • 假如遇到mysql容器无法启动的情况,可以先删除容器,再使用如下下令启动(该下令只是删除了mysql配置文件挂载的那行下令);
  1.   docker run -p 3306:3306 --name mysql \
  2.   -v /mydata/mysql/log:/var/log/mysql \
  3.   -v /mydata/mysql/data:/var/lib/mysql \
  4.   -e MYSQL_ROOT_PASSWORD=root  \
  5.   -d mysql:5.7
复制代码


  • 进入运行mysql的docker容器:
  1. docker exec -it mysql /bin/bash
复制代码


  • 使用mysql下令打开客户端:
  1. mysql -uroot -proot --default-character-set=utf8
复制代码



  • 修改root帐号的权限,使得任何ip都能访问:
  1. grant all privileges on *.* to 'root'@'%';
复制代码



  • 创建mall数据库:
  1. create database mall_tiny character set utf8;
复制代码


  • 将mall_tiny.sql文件拷贝到mysql容器的/目录下:
  1. docker cp /mydata/mall_tiny.sql mysql:/
复制代码


  • 将sql文件导入到数据库:
  1. use mall_tiny;
  2. source /mall_tiny.sql;
复制代码

启动项目
项目推至本机的docker下之后,可以通过长途服务器的ip进行测试访问(留意必要打开80端口),这里小编使用本机测试,在同一个局域网内是能够访问的,但超出这个范围的就不能访问成功。

思考下为什么长途服务器部署好项目,就可以在任何地方进行访问,而这里我通过本机部署的项目为什么不能做到任何地方都访问呢?
其实重要涉及到 网络访问控制 和 防火墙设置 这两块
Docker 的默认网络模式–bridge,容器会毗连到一个虚拟的桥接网络,容器之间可以通过虚拟网桥通信,但容器外的呆板(包括同一局域网内的其他呆板)默认是无法直接访问容器的端口的。
dockerFile常用语法:

  1. FROM         # 基础镜像,当前新镜像是基于哪个镜像的
  2. MAINTAINER   # 镜像维护者的姓名混合邮箱地址
  3. RUN          # 容器构建时需要运行的命令
  4. EXPOSE       # 当前容器对外保留出的端口
  5. WORKDIR      # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
  6. ENV          # 用来在构建镜像过程中设置环境变量
  7. ADD          # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  8. COPY         # 类似ADD,拷贝文件和目录到镜像中!
  9. VOLUME       # 容器数据卷,用于数据保存和持久化工作
  10. CMD          # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
  11. ENTRYPOINT   # 指定一个容器启动时要运行的命令!和CMD一样
  12. ONBUILD      # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发
复制代码
  1. # 该镜像需要依赖的基础镜像
  2. FROM openjdk:8
  3. # 将当前目录下的jar包复制到docker容器的/目录下
  4. ADD mall-tiny-docker-1.0-SNAPSHOT.jar /mall-tiny-docker-1.0-SNAPSHOT.jar
  5. # 声明服务运行在8080端口
  6. EXPOSE 8080
  7. # 指定docker容器启动时运行jar包
  8. ENTRYPOINT ["java", "-jar","-Dspring.profiles.active=prod","/mall-tiny-docker-1.0-SNAPSHOT.jar"]
  9. # 指定维护者的名字
  10. MAINTAINER macrozheng
复制代码
ADD

用于复制文件,格式:
  1. ADD <src> <dest>
复制代码
示例:
  1. # 将当前目录下的mall-tiny-docker.jar包复制到docker容器的/目录下
  2. ADD mall-tiny-docker.jar /mall-tiny-docker.jar
复制代码
ENTRYPOINT

指定docker容器启动时执行的下令,格式:
  1. ENTRYPOINT ["executable", "param1","param2"...]
复制代码
示例:
  1. # 指定docker容器启动时运行jar包
  2. ENTRYPOINT ["java", "-jar","/mall-tiny-docker.jar"]
复制代码
ENV

用于设置情况变量,格式:
  1. ENV <key> <value>
复制代码
示例:
  1. # mysql运行时设置root密码
  2. ENV MYSQL_ROOT_PASSWORD root
复制代码
EXPOSE

声明必要袒露的端口(只声明不会打开端口),格式:
  1. EXPOSE <port1> <port2> ...
复制代码
示例:
  1. # 声明服务运行在8080端口
  2. EXPOSE 8080
复制代码
FROM

指定所需依赖的底子镜像,格式:
  1. FROM <image>:<tag>
复制代码
示例:
  1. # 该镜像需要依赖的openjdk的镜像
  2. FROM openjdk:8
复制代码
MAINTAINER

指定维护者的名字,格式:
  1. MAINTAINER <name>
复制代码
示例:
  1. MAINTAINER macrozheng
复制代码
RUN

在容器构建过程中执行的下令,我们可以用该下令自界说容器的行为,好比安装一些软件,创建一些文件等,格式:
  1. RUN <command>
  2. RUN ["executable", "param1","param2"...]
复制代码
示例:
  1. # 在容器构建过程中需要在/目录下创建一个mall-tiny-docker.jar文件
  2. RUN bash -c 'touch /mall-tiny-docker.jar'
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表