docker compose使用

原文鏈接:https://www.li-rui.top/2018/11/04/docker/docker-compose%E4%BD%BF%E7%94%A8/

看到一篇很不錯的docker-compose使用總結,轉載一下,
原文地址:https://www.li-rui.top/2018/11/04/docker/docker-compose%E4%BD%BF%E7%94%A8/

docker compose使用

理解

compose就是把多個容器匯聚到一塊兒形成一個容器組來提供服務,體現了微服務的思想。

如何使用

1.常用命令

#指定yml文件和項目名稱
docker-compose -f docker-compose.yml -p dongodng up -d
#進行所需的服務鏡像構建
docker-compose build
#打印出詳細的config文件
docker-compose config
#創建容器但是不運行
docker-compose create
#停掉服務,刪除容器,不刪除鏡像
docker-compose down
#接受服務之間的互動事件,如進行健康檢查等
docker-compose events
#對某個容器執行命令
docker-compose exec 容器名稱 命令
#對某個服務查看日誌
docker-compose logs -ft mysql
#查看服務狀態
docker-compose ps
#重啓服務
docker-compose restart/start/stop [服務名稱]
#運行某個服務
docker-compose run [服務名稱]
#查看服務中使用的鏡像
docker-compose images [服務名稱]
#強制停止容器,刪除
docker-compose kill
#刪除停止的容器
docker-compose rm
定義出容器鏡像的Dockerfile
#想要重啓單個服務容器
#先進行停掉服務
docker-compose stop test1
#然後刪除容器
docker-compose rm
#再次啓動該服務
docker-compose up -d  test1

2.定義出容器鏡像的Dockerfile

定義出Dockerfile以後就可以方便的創建鏡像

3.啓動compose

#-d爲保持後臺啓動
docker-compose up -d

安裝compose

curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x  /usr/local/bin/docker-compose

docker-compose.yml配置

1.基本概念

一個docker-compose.yml需要定義出services, networks 和volumes。這三者和容器操作的對應關係如下:

compose中 docker中
services docker container create
networks docker network create
volumes docker volume create

compose中還可以使用環境變量

compose現在存在三個版本的文件格式,在配置文件的第一行就要指定所用的版本

version: '3'
services:
  webapp:
    build: ./dir

2.services主要配置

使用Dockerfile來構建鏡像
version: '3'
services:
  webapp:
    #使用buid字段來通過Dockerfile構建鏡像
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
    container_name: my-web-container
    #容器內目錄映射
    devices:
      - "/dev/ttyUSB0:/dev/ttyUSB0"
    #指定自定義dns
    dns: 8.8.8.8
    #覆蓋入口
    entrypoint: /code/entrypoint.sh
container_name

配置容器名稱

container_name: my-web-container
depends_on容器依賴

配置容器名稱

container_name: my-web-container
depends_on容器依賴

web服務啓動之前會啓動db和redis,只是會等待啓動,而不是等db和redis服務可以正常提供後再啓動web比如命令
docker-compose up web

version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
    
  redis:
    image: redis
  db:
    image: postgres
環境變量
version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
    #引入環境變量文件
    env_file: .env
    #直接給出環境變量
    environment:
      RACK_ENV: development
      SHOW: 'true'
      SESSION_SECRET:
    #暴露出端口,僅僅供容器之間訪問,link的容器訪問,沒有和宿主機綁定
    expose:
      - "3000"
      - "8000"
健康檢查

compose中的健康檢查主要和Dockerfile中的一樣,只是這個在容器外邊執行

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3
  start_period: 40s
指定服務所用的image

可以指定的格式

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
日誌記錄
services:
  some-service:
    image: some-service
    logging:
      #記錄驅動json-file syslog none
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"
network

網絡模式

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

要加入的網絡

services:
  some-service:
    networks:
     - some-network
     - other-network

爲容器配置靜態IP,在compose中service name 和 container_name 默認會做服務發現,也就是說可以在容器container1裏面ping通container2和service2,hostname之間不會通。

version: "2.4"
services:
  service1:
    image: docker.li-rui.top/library/centos:7.5.1804
    container_name: container1
    domainname: domainname1
    hostname: hostname1
    mac_address: 02:42:ac:11:65:41
    networks:
      app_net:
        ipv4_address: 172.16.1.2
    
  service2:
    image: docker.li-rui.top/library/centos:7.5.1804
    container_name: container2
    domainname: domainname2
    hostname: hostname2
    mac_address: 02:42:ac:11:65:42
    networks:
      app_net:
        ipv4_address: 172.16.1.3
    
networks:
  app_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.0.0/16
          ip_range: 172.16.1.0/24
          gateway: 172.16.1.1
端口映射
#短語法
ports:
  - "3000"
  - "3000-3005"
  - "8000:8000"
  - "9090-9091:8080-8081"
  - "49100:22"
  - "127.0.0.1:8001:8001"
  - "127.0.0.1:5000-5010:5000-5010"
  - "6060:6060/udp"
#長語法
ports:
  #targer爲容器內的端口
  - target: 80
    published: 8080
    protocol: tcp
    mode: host
容器內的內核參數調整
sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0
#文件句柄數設置
ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000
容器的數據持久化
version: "3.2"
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      #長語法
      #target爲容器內的路徑
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/static
      #短語法
      - /opt/data:/var/lib/mysql
      - mydata:/var/lib/mysql

networks:
  webnet:

volumes:
  mydata:
重啓策略restart
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
volumes主要配置

這個是和services平級的字段,其所定義的volume可以被多個服務進行復用

docker中的數據庫存儲

在這裏插入圖片描述

compose中volumes使用的是Volume方式

下面例子可以讓數據庫的數據庫文件進行週期性備份

version: "3"

services:
  db:
    image: db
    #使用的是Volume方式
    volumes:
      - data-volume:/var/lib/db
  backup:
    image: backup-service
    volumes:
      - data-volume:/var/lib/backup/data

volumes:
  #使用的是Bind mounts方式
  data-volume:
driver
external

表示持久化存儲卷不受compose控制,compose啓動前就應該創建好

version: '2'

services:
  db:
    image: postgres
    volumes:
      - data:/var/lib/postgresql/data

volumes:
  data:
    external: true

3.networks主要配置

網絡查看
docker network ls
docker network inspect bridg

compose會在up的時候建立一個默認網絡

driver

可選有:bridge(默認) overlay host 或者 none

internal和external

如果要創建外部隔離的覆蓋網絡,您可以將此internal選項設置爲true

networks:
  harbor:
    #docker會創建網絡
    external: false

首先建立docker網絡

host_net=eth3
bri_name=pcp
bri_ip=172.16.1.119
docker_net=app_net

ip link add name $bri_name type bridge
ip link set $bri_name up
ip link set dev $host_net master $bri_name
ip addr add $bri_ip/16 dev $bri_name
 
docker network create --subnet=172.16.0.0/16 --gateway=$bri_ip -o com.docker.network.bridge.name=$bri_name $docker_net

docker compose使用創建的網絡

networks:
  outside:
    external: true
變量使用

可以使用${POSTGRES_VERSION}變量,如果POSTGRES_VERSION定義的話。

docker stack

介紹

docker stack可以直接使用docker-compose.yml文件而不用安裝docker-compose

使用區別

docker-compose -f docker-compose up
docker stack deploy -c docker-compose.yml somestackname

常用命令

Usage:  docker stack [OPTIONS] COMMAND
Manage Docker stacks
Options:
      --orchestrator string   Orchestrator to use (swarm|kubernetes|all)
Commands:
  deploy      Deploy a new stack or update an existing stack
  ls          List stacks
  ps          List the tasks in the stack
  rm          Remove one or more stacks
  services    List the services in the stack
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章