七叶笔记 » golang编程 » 云原生:如何用docker compose来管理容器

云原生:如何用docker compose来管理容器

为什么需要 docker Compose

我们使用 Docker 的时候,首先定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而 微服务架构 的应用系统一般包含若干个微服务,每个 微服务 一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。

使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于管理和运行多个容器的工具。本文将会介绍Docker Compose的安装和使用。

安装 Docker Compose

安装 Docker Compose 可以通过下面命令自动下载适应版本的 Compose,并为安装脚本添加执行权限

 sudo curl -L  -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose  

查看安装是否成功。

 docker-compose -v  

Docker Compose的使用

首先打包项目,获得 jar 包 docker-demo-0.0.1-SNAPSHOT.jar。在 jar 包所在路径创建 Dockerfile 文件,添加以下内容。

 FROM  java :8
VOLUME /tmp
ADD docker-demo-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]  

在 jar 包所在路径下创建文件 docker-compose.yml,添加以下内容。

 version: '2' # 表示该 Docker-Compose 文件使用的是 Version 2 file
services:
  docker-demo:  # 指定服务名称
    build: .  # 指定 Dockerfile 所在路径
    ports:    # 指定 端口映射 
      - "9000:8761"  

在 docker-compose.yml 所在路径下执行以下命令,Docker Compose 就会自动构建镜像并使用镜像启动容器。

 docker-compose up
docker-compose up -d            //后台启动并运行容器  

浏览器访问 即可访问微服务接口。

Docker Compose 常用命令

  • ps :列出所有运行容器
 docker-compose ps  
  • logs :查看服务日志输出
 docker-compose logs  
  • port :打印绑定的公共端口,如下输出 eureka 服务 8761 端口所绑定的公共端口
 docker-compose port eureka 8761  
  • build :构建或者重新构建服务
 docker-compose build  
  • start :启动指定服务已存在的容器
 docker-compose start eureka  
  • stop :停止已运行的服务的容器
 docker-compose stop eureka  
  • rm :删除指定服务的容器
 docker-compose rm eureka  
  • up :构建、启动容器
 docker-compose up  
  • kill :通过发送 SIGKILL 信号来停止指定服务的容器
 docker-compose kill eureka  
  • scale :设置指定服务运行容器的个数,以 service=num 形式指定
 docker-compose scale user=3 movie=3  
  • run :在一个服务上执行一个命令
 docker-compose run web bash  

docker-compose.yml 属性

Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)。

Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例。

  • version :指定 docker-compose.yml 文件的写法格式
  • services :多个容器集合
  • build :配置构建时,Compose 会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定 Dockerfile 参数
 build: ./dir
---------------
build:
    context: ./dir
    dockerfile: Dockerfile
    args:
        buildno: 1  
  • command :覆盖容器启动后默认执行的命令
 command: bundle exec thin -p 3000
----------------------------------
command: [bundle,exec,thin,-p,3000]  
  • dns :配置 dns 服务器,可以是一个值或列表
 dns: 8.8.8.8
------------
dns:
    - 8.8.8.8
    - 9.9.9.9  
  • dns_search :配置 DNS 搜索域,可以是一个值或列表
 dns_search: example.com
------------------------
dns_search:
    - dc1.example.com
    - dc2.example.com  
  • environment 环境变量 配置,可以用数组或字典两种方式
 environment:
    RACK_ENV: development
    SHOW: 'ture'
-------------------------
environment:
    - RACK_ENV=development
    - SHOW=ture  
  • env_file :从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量
 env_file: .env
---------------
env_file:
    - ./common.env  
  • expose :暴露端口,只将端口暴露给连接的服务,而不暴露给主机
 expose:
    - "3000"
    - "8000"  
  • image :指定服务所使用的镜像
 image: java  
  • network_mode :设置网络模式
 network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"  
  • ports :对外暴露的端口定义,和 expose 对应
 ports:   # 暴露端口信息  - "宿主机端口:容器暴露端口"
- "8763:8763"
- "8763:8763"  
  • links :将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
 links:    # 指定服务名称:别名 
    - docker-compose-eureka-server:compose-eureka  
  • volumes :卷挂载路径
 volumes:
  - /lib
  - /var  
  • logs :日志输出信息
 --no-color          单色输出,不显示其他颜.
-f, --follow        跟踪日志输出,就是可以实时查看日志
-t, --timestamps    显示时间戳
-- tail               从日志的结尾显示,--tail=200  

至此,我们就对Docker Compose的用法有了一个基本的了解。不过 Docker-Compose只能管理当前主机的Docker,也就是说不能去启动其他主机上的 Docker容器

Docker Swarm 是一款用来管理多主机上的Docker容器的工具,可以负责帮你启动容器,监控容器状态,如果容器的状态不正常它会帮你重新启动一个新的容器来提供服务,同时也提供服务之间的负载均衡,这些事情都是Docker-Compose 是做不到的。

Kubernetes 它本身的角色定位是和Docker Swarm 是一样的,是 谷歌公司 根据自身的多年的运维经验研发的一款容器管理平台,Docker Swarm则是由Docker 公司研发的。

实际上这两年Kubernetes已经成为了很多大公司的默认使用的容器管理技术,而Docker Swarm已经在这场与Kubernetes竞争中已经逐渐失势,如今容器管理领域已经开始已经逐渐被Kubernetes一统天下了。

相关文章