Docker-Compose一键部署

Docker-Compose一键部署

[TOC]

Docker 网络模式


关于 docker 网络模式,有时间会另出一篇博客详细介绍,或者在该博客下继续补充。


docker 容器所在的网络比较特殊,多容器一键部署的时候需要格外注意一下网络问题。

docker 有四种自带的网络,也支持自定义网络。

  • host模式。容器将不用构建自己的虚拟网卡,而是直接使用宿主机的ip和端口,但是弊端是不能绑定多个实例,否则 ip 会冲突。

  • none模式。关闭容器的网络功能。

  • bridge模式。有点类似 VMware 的桥接模式,是默认模式。该模式会为每个容器动态分配、设置一个专属于自己的虚拟 ip,一般是 172.xxx.xxx.xxx,网关默认是 172.xxx.xxx.1。并将容器连接到一个虚拟网桥,通过网桥以及配置的 NAT 映射表与宿主机通信。相当于是在宿主机上又建立了一个内网。

  • container模式。容器也不用构建自己的虚拟网卡,而是和一个指定的容器共享网卡。

一键部署

通过 docker-compose.yml 来实现一键部署。

拿本项目的例子来说

version: "3"
services:
  server:
    image: gitgiter/baobaozhuan_server:latest
    depends_on:
      - db
      - redis
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "8080:8080"
    networks:
      - webnet
  db:
    # image: mysql:5.7.25
    image: gitgiter/baobaozhuan_db:latest
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 300M
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: SYSU_baobaozhuan2019
      PMA_HOST: mysql
    networks:
      - webnet
  nginx:
    image: nginx:1.12.2
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    volumes:
      - /etc/nginx:/etc/nginx
    ports:
      - "80:80"
      - "443:443"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "9999:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
  redis:
    image: redis:5.0.2
    ports:
      - "6379:6379"
    volumes:
      - "/home/docker/data:/data"
    deploy:
      placement:
        constraints: [node.role == manager]
    command: redis-server --appendonly yes
    networks:
      - webnet
networks:
  webnet:

version 指定 docker-compose.yml 的语法版本。2 和 3 大部分是相同的,不过 2 支持容器自定义静态 ip,3 好像就改成支持动态 ip 了,但是可以通过 service 的名字拿到对方的动态 ip。另外就是 2 不支持 deploy 关键字。

services 指定要部署的服务。下一级的键值都是服务名,如这里的 server,db 等。假如 server 要访问 db,可以通过 http://db:3306 来访问,这个 db 就取代了 db 容器的动态 ip。这样做的原因是,一般 server 都是通过一个具体的 ip 去访问 db,但由于 docker 网络模式导致一个容器中使用 localhost 或 127.0.0.1 只能访问自己所在的容器,是无法访问到另外一个容器的,需要用特定的容器 ip,就是前面提到的 172.xxx.xxx.xxx,但是这个 ip 是动态分配的,而配置文件中 ip 是得写死的,也就说明基于该配置文件构建的 server,也是只知道根据配置文件中写死的 ip 去访问。而每次通过 docker-compose up 启动服务时,生成的都是新的容器,这些新容器的 ip 是会变的。这样通过在配置文件中将 ip 写成 db 开头的 url,在实际请求的时候 server 就会自己去拿到对应的动态 ip 再进行访问。

image 指定服务基于的镜像。

ports 指定端口映射规则。

volumes 指定要挂载的文件。可以将宿主机的文件挂载到容器中,一般是配置文件。

deploy 指定部署时的一些特性。

  • replicas 指定副本数量
  • resource 指定资源限制,包括 cpu,内存等
  • restart-policy 可以规定服务重启的条件,一般是服务异常停止后重启。

environment 指定容器的环境变量。

network 配置网络。默认是 bridge 模式,也可以自定义网络。

depends-on 指定服务依赖。有些服务可能需要别的服务先启动后才能正常启动,比如我们的 server 就需要 db 和 redis 先启动,才能正常启动。

另外,image 可以用 build 替代,两者不能同时存在,image 是通过现有镜像进行构建,这个镜像可以在本地或者远程。build 可以通过指定 Dockerfile 的位置来模仿 docker build 生成新的镜像。

至此,万事具备,只欠一句:

# 在 docker-compose.yml 的同目录运行
docker-compose up