前面我们已经学会了在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要是能用好了,绝对是屠龙之技啊 -> 这不就乔峰:你们一起上吧