Docker进阶一 使用dockerfile构建服务

前面我们已经学会了在linux下安装软件,也发现了docker能极大的帮助我们快速完成工作,但想必也被那冗长的docker run命令困扰。一个两个还好,若是微服务生产环境下几百上千的服务节点,也这样手工维护的的话,恐怕死的不知道怎么死的。学习是为了实战,幸得大佬指点,开始了学习dockerfile的过程

本文笔者还在学习初始阶段,实例完成度也不高,仅供参考

首先了解dockerfile是什么

dockerfile可以类比为java开发的pom文件,通过配置文件的方式编写需要安装部署的镜像(docker compose语法),使用docker stack命令一键完成多个服务(服务组)的部署。

一.准备:

本文环境:centos7

安装需要部署的镜像,其实只要知道镜像名称就行,如果本地没有镜像,docker会自动去远端拉取

docker pull [redis  |  rabbitmq:management  |  jenkins/jenkins  |  season/fastdfs  |  nginx]

二.创建网关

相当于在虚拟机内部隔离一块独立的空间提供服务,只能通过指定的网关访问

docker network create --driver overlay app        :创建一个名为app、驱动为overlay、作用域为swarm的网络

docker network ls                                               :查看网络

如果出现docker datastore for scope "global" is not initialized错误,通过以下命令解决

docker run swarm create
docker swarm init

三.编辑运行环境程序的yml文件

3.1创建目录

此处为了演示和学习,目录全部在root下自行创建

在root下创建docker,dockerfile.yml文件放在此处运行

在docker里分别创建static,nginx,jenkins_home,fastdfs_home文件夹。在fastdfs_home里创建tracker_data,storage_data文件夹

3.2编写yml文件

此处配置文件使用的是docker compose V3语法,运行java程序所需要启动提供的服务

version: "3.1"
  
services:

  redis:
    image: docker.io/redis:latest
    command: redis-server --requirepass redis
    restart: always
    ports:
      - 6379:6379
    networks:
      - app

  rabbitmq:
    image: docker.io/rabbitmq:management
    restart: always
    ports:
      - 5672:5672
      - 15672:15672
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin
    networks:
      - app
      
  jenkins:
    image: docker.io/jenkins/jenkins:latest
    restart: always
    ports:
      - 8085:8080
      - 50000:50000
    volumes:
      - /var/jenkins_home:/root/docker/jenkins_home
    networks:
      - app  
      
  tracker:
    image: docker.io/season/fastdfs:latest
    command: sh tracker.sh
    restart: always
    ports:
      - 22122:22122
    network_mode: host  
    volumes:
      - ~/tracker_data:/root/docker/fastdfs_home/tracker_data 
    networks:
      - app
      
  storage:
    image: docker.io/season/fastdfs:latest
    command: sh storage.sh
    environment:
      - GROUP_NAME=group1
      - TRACKER_IP=47.102.43.84:22122
    ports:
      - 8083:8080
      - 23000:23000      
    volumes:
      - ~/storage_data:/root/docker/fastdfs_home/storage_data
      - ~/store_path:/root/docker/fastdfs_home/storage_path      
    networks:
      - app     

  nginx:
    image: docker.io/nginx
    restart: always
    ports:
    - 80:80
    - 443:443
    volumes:
    - ./nginx/nginx.conf:/root/docker/nginx/nginx.conf
    - ./nginx/conf.d:/root/docker/nginx/conf.d
    - ./static:/root/docker/static #静态资源访问
    networks:
      - app 
    
      
networks:
  app:
    external:
      name: app

四.使用docker stack 运行docker镜像

将编辑好的文件命名为app.yml,上传到docker目录中,命令窗口cd进入该目录

docker stack deploy -c app.yml app        :使用stack的方式根据配置文件部署启动docker

docker stack ls                                             :   查看运行的堆

docker stack ps app                                     :查看app里运行的堆

如下图:

结果大家都看到啦,就redis和rabbitmq成功运行了,其他都报错了而且在不停的重试,报的错也看不全,而且我也不知道去哪儿看,应该是yml配置的问题了,具体的配置还要根据官方文档慢慢试了。

测试:

在浏览器输入ip:15672访问rabbitmq控制台,输入admin/admin看能否访问

五.编写项目jar的dockerfile

FROM maven:3.6.0-jdk-8-alpine
EXPOSE 8080

VOLUME /tmp
ADD ./target/xxx.jar /admin.jar
ENV TIME_ZONE Asia/Shanghai
RUN bash -c 'touch /admin.jar' \
    && echo "${TIME_ZONE}" > /etc/timezone \
    && ln -snf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime

ENTRYPOINT ["java","-jar","/admin.jar"]

此处是dockerfile 文件,将我们指定的target目录下的jar打成admin.jar镜像

在linux中安装svn和maven,将上述编辑好的Dockerfile文件放入项目根目录下,和src、target、pom在同一目录下。

编写项目的yml文件,同启动redis一样,此处将获取admin镜像,并将其发布为一个服务,将该文件命名为stack-admin放在java目录下。

version: "3.1"

services:
        
    gt_admin:
      image: admin:v1
      deploy:
        mode: replicated
        replicas: 1
      environment:
        - spring.profiles.active=beta
      ports:
        - 8081:8081   
      volumes:
        - /root/service/file:/root/service/file

编写启动配置文件

cd /java
svn update

cd /java/gt-parent
mvn clean install -Dmaven.test.skip=true  

cd /java/gt-admin
docker build -t admin:v1 .

cd /java
docker stack deploy -c stack-admin.yml admin

该文件第一句代码更新线上代码,第二句代码将线上代码打包,第三句代码调用之前的dockerfile文件用admin.jar创建一个名为admin:v1的镜像,第四句代码时调用前面创建的yml文件,将admin:v1镜像发布为一个服务。

 

六.总结

慢慢学吧,这配置文件实在是不好搞。不过dockerfile要是能用好了,绝对是屠龙之技啊 -> 这不就乔峰:你们一起上吧

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值