3 服务编排前奏 - Docker容器化

 

服务Docker化

搭建Docker仓库,存image

搭建高可用的集群环境,优雅的调度程序


服务的Docker化

把服务放在一个合适的运行环境里面

运行环境,又叫基础镜像

套路(Java为例)

  1. 现在docker hub中寻找合适的镜像(搜Java)
  2. docker pull openjdk:7-jre
  3. docker run -it --entrypoint bash openjdk:7-jre
    1. run个container起来
  4. 把服务部署到镜像里(写DockerFile)
  5. 经常变的东西不能写死到镜像里,否则一旦变更就需要重新构建这个镜像
    1. 如数据库的访问地址,需要提出去而不是在配置文件里写死
    2. localhost应该写成变量的形式
  6. 把要部署的服务打包成一个文件,xxx.jar
  7. 把jar包放到docker里:写DockerFile
FROM openjdk:7-jre # 指定基础image 
MAINTAINER xxx xxx@xxx.com # 作者信息


COPY target/xxx.jar /容器路径/xxx-service.jar # 把xxx.jar拷贝到容器中的指定目录下


ENTRYPOINT ["java", "-jar", "/容器路径/xxx-service.jar"] # 把服务跑起来

说明:

  1. ENTRYPOINT

    1. 格式和 RUN 指令格式一样,分为 exec 格式和 shell 格式

    2. 目的和 CMD 一样,都是在指定容器启动程序及参数。


编译成image:`docker build -t 自定义image名字(如:user-service:latest) .`
启动image:`docker run -it user-service:latest --mysql.address=192.168.x.x`
  • --mysql.address是为容器配置变量值
  • IP地址通过ipconfig查看

Python服务写镜像

DockerFile.base

FROM python:3.6
MAINTAINER xxx xxx@xxx.com


RUN pip install thrift

说明:

  1. 需要自己把thrift模块做进去 `docker build -t python-base:lastest -f Docker.base .`


DockerFile

FROM python-base:latest
MAINTAINER xxx xxx@xxx.com


ENV PYTHONPATH / # 把python的索引加到环境变量里
COPY message /message # 直接拷贝文件夹到根目录


ENTRYPOINT ["python", "/message/message_service.py"]

编译:`docker build -t message-service:latest .`

运行:`docker run -it message-service:lastest`


Docker服务之间的通讯

通讯方案:

  1. 直接通讯:通过容器的IP和PORT访问服务
    1. 用的少,Docker的IP不稳定,重启之类的操作可能会导致IP发生变化
  2. Container把端口映射给主机,通过访问主机的端口访问到容器的端口
  3. Docker-link机制,link到一个容器之后,可以直接通过名字访问该容器了

方案选择:自己构建的image,使用方案3,原生image,使用方案2

使用docker-compose描述关系

docker-compose.yml

version: '3'


services:
  message-service:
    image: message-service:latest


  user-service:
    image: user-service:lastest
    command:
    - "--mysql-address=192.168.1.7"


  user-edge-service:
    image: user-edge-service:latest
    links: # 这个container依赖的container们
    - user-service
    - message-service
    command:
    - "--redis.address=192.168.1.7"
    ports: 
    - 8080:8080 # 做和主机的端口映射 - 仅为示例


运行:

  1. 首先运行基础服务,如mysql、redis
  2. docker-compose up -d
    1. 后台运行
说明:
  1. 如user-edge-service配置之后,若要访问message-service,可直接通过类似 http://message-service:8888/xxxx 的url访问到改容器
    1. 可以把container名作为host,以访问该容器

搭建Docker镜像仓库

私有仓库:走内网,安全、快

公共仓库:hub.docker.com

公共仓库镜像上传

docker tag zookeeper:3.5 imooc/zookeeper:3.5 # 打tag
docker login ......
docker push imooc/zookeeper:3.5 # 可push成功


私有仓库

基础配置

docker pull registry:2 # 下载仓库搭建镜像
docker run -d -p 5000:5000 registry:2 # 运行镜像
# 做测试
docker tag zookeeper:3.5 localhost:5000/zookeeper:3.5
docker push localhost:5000/zookeeper:3.5
docker pull localhost:5000/zookeeper:3.5

问题:

  1. 只能配置在一台机器,不能做跨机器
  2. 没有可视化界面

harbor配置

项目:地址

方法:

  1. 下载一个最新的release的offline-install包,做线下安装
  2. 解压,cd到harbor中,有个harbor.cfg文件,描述对harbor的配置
  3. vim barbor.cfg
    1. 修改hostname = hub.xxx.com:port
  4. 非mac系统已经可以跑了
    1. mac系统:vim docker-compose.yml修改的挂载点
      1. 改所有的volumes,都放到可读目录下
      2. 把80:80端口都改成8080:80
  5. ./install.sh

推送image

修改DockerFile的FROM字段,为推送后的私有镜像地址路径