Docker容器化todaytaxi服务
Date: 2017-6-30
Author: 祝军
1. 背景
因为云环境暂时不可用,必需要迁移todaytaxi系统使用到的整个服务栈。考滤到后期服务迁移能够更加方便、快捷,于是在本次迁移过程中使用了docker容器技术。
2. 服务栈
TodayTaxi服务依赖的服务有:mysql, redis elasticsearch。所以容器化时,需要将服务栈里所有服务都容器化。
3. Docker安装
宿主机使用Centos7。Docker安装文档参见官方:
https://docs.docker.com/engine/installation/linux/docker-ce/centos/
我这里安装的版本:
[root@localhost ~]# docker -v
Docker version 17.03.1-ce, build c6d412e
为方便容器之后的网络通信,使用docker使用swarm模式运行。启动swarm模式:
docker swarm init
启动后,运行docker info 会看到swarm已经激活了。
Swarm: active
NodeID: ihzl625ib1vxsxu0cumshiy9s
Is Manager: true
ClusterID: ybv87ylrtcr672rou83b3q2ct
Managers: 3
Nodes: 3
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 3
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Root Rotation In Progress: false
Node Address: 192.168.8.16
Manager Addresses:
192.168.8.12:2377
192.168.8.14:2377
192.168.8.16:2377
3.1. Swarm高可用
Swarm模式下,官方建议使用3台或5台做为manager结点
[root@vm_8_16 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ihzl625ib1vxsxu0cumshiy9s * vm_8_16 Ready Active Leader
j21ujzlrlsdm7v1uy8k0zl4ad vm_8_14 Ready Active Reachable
s6ec604wyrnwm2p0mj3hiubnc vm_8_12 Ready Active Reachable
4. TodayTaxi server容器制作
4.1. 编译好todaytaxi服务发布包
todaytaxi-boot-0.0.1-SNAPSHOT-package.tar.gz
4.2. 编写Dockerfile文件
FROM openjdk:8-jre
MAINTAINER zhujun
ADD todaytaxi*.tar.gz /opt/
RUN chmod a+x /opt/todaytaxi/bin/startup.sh
VOLUME /opt/todaytaxi/log
EXPOSE 8080
ENTRYPOINT ["/opt/todaytaxi/bin/startup.sh"]
4.3. 生成docker镜像
[root@localhost server]# docker build -f todaytaxiserver.Dockerfile -t zhujun/todaytaxi:1.0 .
这里使用zhujun/todaytaxi:1.0将镜像存到本地使用。
5. 服务栈编排
5.1. todaytaxi-compose.yml编排文件
version: '3'
services:
redis:
image: redis:3.0
volumes:
- /var/todaytaxi/redis/data:/data
deploy:
restart_policy:
condition: on-failure
ports:
- 6379:6379
mysql:
image: mysql:5.7
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=todaytaxi123456
volumes:
- /var/todaytaxi/mysql/data:/var/lib/mysql
deploy:
restart_policy:
condition: on-failure
elasticsearch:
image: elasticsearch:5.4
ports:
- 9200:9200
- 9300:9300
volumes:
- /var/todaytaxi/elasticsearch/data:/usr/share/elasticsearch/data
- /var/todaytaxi/elasticsearch/config:/usr/share/elasticsearch/config
deploy:
restart_policy:
condition: on-failure
todaytaxiserver:
image: zhujun/todaytaxi:1.0
environment:
- server.address=0.0.0.0
- spring.datasource.url=jdbc:mysql://mysql:3306/todaytaxi?useSSL=false&useUnicode=true&characterEncoding=UTF8
- spring.datasource.password=todaytaxi123456
- redis.host=redis
- redis.pass=
- es.search.ip=elasticsearch
ports:
- 8080:8080
depends_on:
- redis
- mysql
- elasticsearch
volumes:
- /var/todaytaxi/server/log:/opt/todaytaxi/todaytaxi/log
deploy:
restart_policy:
condition: on-failure
5.2. Mysql容器化注意事项
使用/var/todaytaxi/mysql/data:/var/lib/mysql将数据文件持久化到宿主机;
宿主机中mount到容器的对应目录应该先创建好;
3306端口可暴露出来,方便数据维护;
在容器启动后,初始化数据库和数据;
5.3. Elasticsearch容器化注意事项
9300端口默认不能外访问,需要将配置文件从宿主机映射到容器,修改配置文件中transport.host: 0.0.0.0
问题:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
在/etc/sysctl.conf中增加
vm.max_map_count=262144
运行sysctl -p
5.4. Todaytaxi容器化注意事项
8080端口作映射宿主机后,使用netstat命令无法看到,重启docker service解决
5.4.1. 问题:todaytaxiserver容器无法初始化mysql连接池
描述:The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
排查过程:
使用docker exec -it todaytaxiserver /bin/bash 命令进入todaytaxiserver容器内部,ping mysql可以ping通。使用 curl mysql:3306 发现mysql端口也是通的。之前排查很久,以为是todaytaxi进程问题(走了几天弯路)。在容器内手动启动进程,发现正常启动。
无意中发现,默认执行startup.sh的命令为 /bin/sh -c。怀疑是shell环境问题。
解决方案如下:
1) 在bin/startup.sh头部加:
#!/bin/bash
2) 修改dockerfile中ENTRYPOINT 为数组方式:
之前:ENTRYPOINT /opt/todaytaxi/bin/startup.sh
现在:ENTRYPOINT ["/opt/todaytaxi/bin/startup.sh"]
6. 容器栈启动和服务重启
启动:
[root@localhost ~]# docker stack deploy -c todaytaxi-compose.yml todaytaxi
查看服务:
[root@localhost ~]# docker service ls
ID NAME MODE REPLICAS IMAGE
ewcc6k184mf7 todaytaxi_todaytaxiserver replicated 1/1 zhujun/todaytaxi:1.0
r9m6wnq0nw1h todaytaxi_redis replicated 1/1 redis:3.0
wig0e9p86lz1 todaytaxi_mysql replicated 1/1 mysql:5.7
zh8tjrr0w4ef todaytaxi_elasticsearch replicated 1/1 elasticsearch:5.4
查看任务:
[root@vm_8_16 ~]# docker stack ps todaytaxi
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
mwco3dgyhz5h todaytaxi_todaytaxiserver.1 192.168.8.16:5000/zhujun/todaytaxi:1.0 vm_8_12 Running Running 5 days ago
1xmxjmqraoc6 todaytaxi_elasticsearch.1 elasticsearch:5.4 vm_8_14 Running Running 5 days ago
wk8km9c95ptu todaytaxi_mysql.1 192.168.8.16:5000/libaray/mysql:5.7.18 vm_8_14 Running Running 5 days ago
v3vbzvnzqjq8 todaytaxi_redis.1 redis:3.0 vm_8_16 Running Running 5 days ago
重启服务:
使用docker kill杀掉对应容器,服务会自己重启。
7. Docker跟踪问题相关命令
docker logs :查看容器日志
docker service logs:查看服务日志
docker exec -it 容器 /bin/bash :进入正在运行的容器内部