Docker Compose快速入门

Docker Compose

版本

  • docker 18.03
  • compose 1.21.2
    wget https://github.com/docker/compose/releases/download/1.21.2/docker-compose-linux-x86_64

命令

docker-compose up [-d]
docker-compose down
docker-compose start/restart/stop [service_name]

  1. 创建目录:**
    mkdir -p /opt/compose

  2. 在该目录下创建应用的目录,如 web

    • 创建Dockerfile
    • 编辑指令(FROM、RUN)
  3. 新建docker-compose.yml

    version: "0.1"
    services:
      ngx:
        build: ./web/
        ports:
          - "8888:80"
      redis:
        image: "hub.c.163.com/library/redis:latest"
    
  4. 运行构建
    docker-compose up -d
    -f 指定文件名,默认docker-compose.yml
    -d 后台运行

yml参数详解

build

指定包含构建上下文的路径
build: ./dir

或者作为一个对象:

build:
  context: ./dir
  dockerfile: Dockerfile-alternate
  args:
    name: value
  • context,包含Dockerfile文件的目录路径
  • dockerfile,备用Docker文件
  • args,添加构建镜像的参数,环境变量只能在构建过程中访问
#首先,在Dockerfile中指定要使用的参数:
ARG number
RUN echo "number: $number"

# 然后在args键下指定参数值
build:
  context: .
  args:
    number: "1234"

image

指定启动容器的镜像,可以是镜像仓库/标签或者镜像id
image: "hub.c.163.com/library/redis:latest"
image: "id"

同时指定image和build,则compose会通过build指定的目录构建容器镜像,而构建的镜像名为image中指定的镜像名和标签。

command

覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
command: ["bundle", "exec", "thin", "-p", "3000"]

volumes

挂载宿主机目录

volumes
  - ./data :/data
  - data_volume:/var/lib/mysql
volumes:
  - appdata:/usr/share/kibana/config

volumes:
  appdata:
    driver: local

links

链接到另一个服务中的容器
任何服务都可以以该服务的名称到达任何其他服务,实际上是通过设置/etc/hosts的域名解析,前提是多个服务容器在一个网络中可路由连通

links:
   - db:alias

external_links

链接外部容器(非compose管理)

external_links:
  - mysql_server:mysql

extra_hosts

添加hosts

extra_hosts:
  - "tracker:192.168.1.100"

expose

暴露端口,但不映射到宿主机,只被连接的服务访问

expose:
  - "3000"
  - "8000"

ports

暴露端口,宿主端口:容器端口,建议字符串格式

ports:
  - "3000"
  - "3000-3005"
  - "8000:8000"

environment

添加环境变量

environment:
  - SERVERID=SRV01

environment:
  TZ: Asia/Shanghai

springboot可通过${SERVERID:ifnull}读取变量值

注意:YAML布尔值(true,false,yes,no,on,off)必须用引号括起来,以便解析器将它们解释为字符串。

networks

services:
  app:
    networks:
      - api-net
networks:
  api-net: # 网络名称
    driver: custom-driver-1

默认网络

networks:
  default:
    driver: custom-driver-1

使用已存在网络

networks:
  default:
    external:
      name: existing-network

兼容性

修改yml文件后,需要先downup,否则不生效

测试
如果yml没有以下代码

version: "?"
services:

external_links&links会起作用,并且在hosts文件中会解析

如果存在,则external_links不起作用,links亦无作用

如配置新或已存在网络nw_default

networks:
  default: # 默认
    external:
      name: nw_default

结果:hosts中未解析,但仍可ping通services中任何服务

示例:

web:
  image: hub.c.163.com/library/java:8u111-jre
  container_name: web_api
  external_links:
    - mysql:mysql
  links:
    - redis
  volumes:
    - /home/projs/logs:/data/wwwlogs
    - /home/projs/api:/data/wwwroot/api
  ports:
    - "8081:8081"
  command: java -server -jar /data/wwwroot/api/jframe-web-api-1.0.jar --spring.profiles.active=pro
version: "3"
services:
  mysqld:
    image: hub.c.163.com/library/mysql
    container_name: mysqld
    volumes:
      - /home/data/mysql:/var/lib/mysql
      - /home/data/conf:/etc/mysql
    environment:
      MYSQL_ROOT_PASSWORD: zhenyi123
  web:
    image: hub.c.163.com/library/java:8u111-jre
    container_name: web_api
    volumes:
      - /home/projs/logs:/data/wwwlogs
      - /home/projs/api:/data/wwwroot/api
    ports:
      - "8081:8081"
    command: java -server -jar /data/wwwroot/api/jframe-web-api-1.0.jar --spring.profiles.active=pro
networks:
  default: # 默认
    external:
      name: docker-br1

案例

基于v3

version: "3"
services:
  redis:
    image: hub.c.163.com/library/redis
    container_name: redis
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /home/data/redis:/data
      
  mysql:
    image: hub.c.163.com/library/mysql
    container_name: mysql
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: jimai123
    ports:
      - "3306:3306"
    volumes:
      - /home/data/mysql:/var/lib/mysql
      - /home/data/config:/etc/mysql/conf.d

  app:
    image: hub.c.163.com/library/java:8u111-jre
    container_name: web_app
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
      resources:
        limits:
          cpus: '0.5'
          memory: 1024M
    environment:
      TZ: Asia/Shanghai
    links:
      - redis
      - mysql
    external_links:
      - fdfs_tracker:fdfs
    volumes:
      - /home/data/logs:/data/wwwlogs
      - /home/docker/app:/data/wwwroot/app
    ports:
      - "8082:8082"
    command: java -server -jar /data/wwwroot/app/jframe-web-app.jar --spring.profiles.active=pro
    
networks:
  default:
    external:
      name: docker-br0

Python

version: "3"
services:
  postdb:
    image: postgres:10
    environment:
      POSTGRES_DB: repay
      POSTGRES_USER: repay
      POSTGRES_PASSWORD: repay
      TZ: Asia/Shanghai
    ports:
      - "5432:5432"
    volumes:
      - ./pgdata:/var/lib/postgresql/data

  api:
    build: .
    environment:
      TZ: Asia/Shanghai
    working_dir: /api
    volumes:
      - ./api:/api
      - ./logs:/logs
    links:
      - postdb
    command: python app.py

  nginx:
    image: nginx
    links:
      - api
    environment:
      TZ: Asia/Shanghai
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ./www:/www
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值