为啥要用Docker?
为啥要用Docker?这要从目前软件行业的痛点来讲起
· 软件更新发布及部署低效,过程繁琐且需要人工介入
· 环境一致性难以保证
· 不同环境之间迁移成本太高
既然docker那么火那么热,那我们不妨学习一下如何构建自己的docker镜像
通过dockerFile构建自己的镜像
# 基于java镜像创建新镜像
FROM java:8
# 作者
MAINTAINER 杨汉奇
#在容器内创建创建目录,创建的目录之后需要挂载到宿主机外,实现持久化
RUN mkdir -p /demo/data /demo/logs /demo/config /demo/avatar/custom /demo/jar/config
#将jar包添加到容器中并更名为demo.jar
ADD demo.jar /demo/jar/demo.jar
# 启动容器运行的命令
ENTRYPOINT ["nohup","java","-jar","-Dspring.config.location=/demo/jar/config/application.properties","-Duser.timezone=GMT+8","/demo/jar/demo.jar","&"]
#容器对外暴露的端口,比如运行tomcat是8080,则暴露8080端口
EXPOSE 8080
1,编写dockerFile文件,文件内容如上
2,在jar所在目录运行一下命令构建镜像
docker build -t (dockerFile路径) (镜像名称:版本号) . 例如:docker build -t /demo/dockerFile demo:test . [不要缺少最后的点号]
最好构建的镜像可以push到远程仓库,避免部署人员重新进行繁琐的构建镜像
通过docker-stack 方式启动容器
version: '3'
services:
#jar包镜像
demo:
image: demo:test
ports:
- 8080:8080
networks:
#加入的网络名称
- demo_netword
tty: true
command:
- /bin/bash
- -c
- |
tail -f /etc/profile
volumes:
#静态资源挂载到宿主机
- /home/demo/data:/demo/avatar/custom
#系统日志挂载到宿主机
- /home/demo/logs:/demo/logs
#启动配置,启动会运行/home/demo/jar/config的application.properties文件
- /home/demo/config:/demo/jar/config
environment:
#设置环境变量
- BASE_HOST=xxx.xxxx
deploy:
#构建多少个容器,(分布式:访问都是同个IP,docker实现自动分配)
replicas: 3
placement:
#指定在管理节点部署
constraints: [node.role == manager]
depends_on:
- demo_redis
- demo_mysql
- demo_rabbitmq
#nginx服务
demo_nginx:
image: nginx:1.19.2
ports:
- 80:80
networks:
- demo_netword
volumes:
#指定读取的nginx.conf配置
- /home/demo/nginx/nginx.conf:/etc/nginx/nginx.conf
#读取静态文件的目录挂载
- /home/demo/data:/var/www/html/upload
deploy:
placement:
#指定在管理节点部署
constraints: [node.role == manager]
depends_on:
- demo
#redis服务
demo_redis:
image: redis:5.0
ports:
- 6379:6379
networks:
- demo_netword
#设置密码123456,开启持久化,并设置重启数据不丢失
command: redis-server --requirepass 123456 --appendonly yes --save ""
volumes:
#上面开启了持久化,只是在容器内持久化,需要挂载到宿主机才能实现真正持久化
- /home/demo/redis/data:/data
deploy:
placement:
#指定在管理节点部署
constraints: [node.role == manager]
#mysql服务
demo_mysql:
image: mysql:5.7
ports:
- 3306:3306
networks:
- demo_netword
environment:
#最好使用此设定时区,其它静像也可以使用
- TZ=CST-8
- MYSQL_ROOT_PASSWORD=123456
#可以加--default-time-zone='+8:00'设定时区
command: --character-set-server=utf8
--collation-server=utf8_general_ci
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
#挂载mysql文件目录,实现持久化
- /home/demo/mysql:/var/lib/mysql
deploy:
placement:
constraints: [node.role == manager]
#rabbitmq服务
demo_rabbitmq:
image: rabbitmq:3.7.7-management
ports:
- 4369:4369
- 5671:5671
- 5672:5672
- 15671:15671
- 15672:15672
- 25672:25672
networks:
- demo_netword
volumes:
#本地文件目录
- /home/demo/rabbitmq/pwd:/var/lib/rabbitmq
environment:
- RABBITMQ_DEFAULT_VHOST=my_vhost
- RABBITMQ_DEFAULT_USER=test
- RABBITMQ_DEFAULT_PASS=test
deploy:
placement:
constraints: [node.role == manager]
networks:
#指定加入的docker网络
demo_netword:
external: true
1,编写好docker-stack.yml文件
2,执行以下命令运行运行docker容器
docker stack deploy -c (yml文件) (名称) 例如:docker stack deploy -c docker-stack.yml mydockerdemo
查看docker集群运行情况
docker service ls
停止某个docker集群
docker stack rm mydockerdemo
docker集群还提供滚动更新机制,生成环境更新用户再也无感了,但是前提是开启了多个容器副本
指定某个镜像更新到某个容器
docker service update --image demo:test1 mydockerdemo_demo (如果名字不清楚,可以通过docker service ls查看需要更新容器的名字)