Docker容器化todaytaxi服务

Docker容器化todaytaxi服务

Date: 2017-6-30

Author: 祝军

 

1. 背景

因为云环境暂时不可用,必需要迁移todaytaxi系统使用到的整个服务栈。考滤到后期服务迁移能够更加方便、快捷,于是在本次迁移过程中使用了docker容器技术。

 

2. 服务栈

 服务栈

TodayTaxi服务依赖的服务有:mysql, redis elasticsearch。所以容器化时,需要将服务栈里所有服务都容器化。

 

3. Docker安装

宿主机使用Centos7Docker安装文档参见官方:

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) 修改dockerfileENTRYPOINT 为数组方式:

之前: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 :进入正在运行的容器内部

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值