3 服务编排前奏 - Docker容器化
Mon, Nov 12, 2018
服务Docker化
搭建Docker仓库,存image
搭建高可用的集群环境,优雅的调度程序
服务的Docker化
把服务放在一个合适的运行环境里面
运行环境,又叫基础镜像
套路(Java为例)
- 现在docker hub中寻找合适的镜像(搜Java)
- docker pull openjdk:7-jre
- docker run -it --entrypoint bash openjdk:7-jre
- run个container起来
- 把服务部署到镜像里(写DockerFile)
- 经常变的东西不能写死到镜像里,否则一旦变更就需要重新构建这个镜像
- 如数据库的访问地址,需要提出去而不是在配置文件里写死
- localhost应该写成变量的形式
- 把要部署的服务打包成一个文件,xxx.jar
- 把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"] # 把服务跑起来 |
说明:
ENTRYPOINT
格式和
RUN
指令格式一样,分为exec
格式和shell
格式目的和
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 |
说明:
- 需要自己把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服务之间的通讯
通讯方案:
- 直接通讯:通过容器的IP和PORT访问服务
- 用的少,Docker的IP不稳定,重启之类的操作可能会导致IP发生变化
- Container把端口映射给主机,通过访问主机的端口访问到容器的端口
- 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 # 做和主机的端口映射 - 仅为示例 |
运行:
- 首先运行基础服务,如mysql、redis
- docker-compose up -d
- 后台运行
说明:
- 如user-edge-service配置之后,若要访问message-service,可直接通过类似 http://message-service:8888/xxxx 的url访问到改容器
- 可以把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 |
问题:
- 只能配置在一台机器,不能做跨机器
- 没有可视化界面
harbor配置
项目:地址
方法:
- 下载一个最新的release的offline-install包,做线下安装
- 解压,cd到harbor中,有个harbor.cfg文件,描述对harbor的配置
- vim barbor.cfg
- 修改hostname = hub.xxx.com:port
- 非mac系统已经可以跑了
- mac系统:vim docker-compose.yml修改的挂载点
- 改所有的volumes,都放到可读目录下
- 把80:80端口都改成8080:80
- mac系统:vim docker-compose.yml修改的挂载点
- ./install.sh
推送image
修改DockerFile的FROM字段,为推送后的私有镜像地址路径