Docker Compose安裝使用(轉)

 

 

Docker Compose

  • 前面我們使用 Docker 的時候,定義 Dockerfile 文件,然後使用 docker build、docker run 等命令操作容器。然而微服務架構的應用系統一般包含若干個微服務,每個微服務一般都會部署多個實例,如果每個微服務都要手動啓停,那麼效率之低,維護量之大可想而知使用 Docker Compose 可以輕鬆、高效的管理容器,它是一個用於定義和運行多容器 Docker 的應用程序工具
  • Docker 和 Compose兼容性看下圖:

           

Docker版本變化說明:

  • Docker從1.13.x版本開始,版本分爲企業版EE和社區版CE,版本號也改爲按照時間線來發布,比如17.03就是2017年3月。
  • Docker的linux發行版的軟件倉庫從以前的https://apt.dockerproject.org和https://yum.dockerproject.org變更爲目前的https://download.docker.com, 軟件包名字改爲docker-ce和docker-ee。

docker compose是什麼:

  • Compose是一個定義和管理多容器的工具,使用Python語言編寫。
  • 使用Compose配置文件描述多個容器應用的架構,比如使用什麼鏡像、數據卷、網絡、映射端口等;
  • 然後一條命令管理所有服務,比如啓動、停止、重啓等。

docker compose作用: 

  • 現在我們要部署django項目,需要 nginx+mysql+redis+nginx等
  • 我們需要開啓四個docker容器進行部署每一個組件,如果每個容器單獨管理太過於複雜,而且可能是給客戶部署項目
  • docker compose就是一個可以同時管理一個項目中的多個docker容器的工具,一鍵部署啓動

docker compose安裝:

  方法一:下載 並安裝docker compose

        

複製代碼
[root@linux-node1 ~]# curl -L https://github.com/docker/compose/releases/download/1.15.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

[root@linux-node1 ~]# chmod
+x /usr/local/bin/docker-compose        #或者 pip install docker-compose
複製代碼

  方法二:直接解壓安裝

unzip docker-compose-linux-x86_64.zip # 解壓後只有一個文件 docker-compose

chmod +x docker-compose

mv docker-compose /usr/bin/

YAML文件格式及編寫注意事項:

  • 注:docker-compose使用yaml文件對容器進行描述
  • YAML是一種標記語言很直觀的數據序列化格式,可讀性高。類似於XML數據描述語言,語法比XML簡單的很多。
  • YAML數據結構通過縮進來表示,連續的項目通過減號來表示,鍵值對用冒號分隔,數組用中括號括起來,hash用花括號括起來。

YAML文件格式注意事項:

  • 不支持製表符tab鍵縮進,需要使用空格縮進
  • 通常開頭縮進2個空格
  • 字符後縮進1個空格,如冒號、逗號、橫杆
  • 用井號註釋
  • 如果包含特殊字符用單引號引起來
  • 布爾值(true、false、yes、no、on、off)必須用引號括起來,這樣分析器會將他們解釋爲字符串。

compose配置:

複製代碼
# 字段                             描述

build       # 指定Dockerfile文件名構建鏡像上下文路徑   dockerfile   context image       # 指定鏡像 command      # 執行命令,覆蓋默認命令 container_name  # 指定容器名稱,由於容器名稱是唯一的,如果指定自定義名稱,則無法scale deploy       # 指定部署和運行服務相關配置,只能在Swarm模式使用 environment    # 添加環境變量 networks     # 加入網絡,引用頂級networks下條目 ports      # 暴露端口,與-p相同,但端口不能低於60 volumes     # 掛載宿主機路徑或命名卷,如果是命名卷在頂級volumes定義卷名稱 restart     # 重啓策略,默認no,always|on-failure|unless-staopped hostname    # 容器主機名
複製代碼

常用命令:

複製代碼
# 字段           描述
build       # 重新構建服務
ps        # 列出容器
up        # 創建和啓動容器
exec      # 在容器裏執行命令
scale      # 指定一個服務容器啓動數量
top        # 顯示容器進程
logs       # 查看容器輸出
down       # 刪除容器、網絡、數據卷和鏡像
stop       # 停止
start      # 啓動
restart    # 重啓服務

# 文章最後有詳細介紹
複製代碼

 

使用Docker Compose 一鍵部署LNMP網站平臺

  參考官方:https://docs.docker.com/compose/compose-file/

  項目地址:https://gitee.com/edushiyanlou/django-docker

一鍵部署LNMP文件結構

複製代碼
├── docker-compose.yml           # compose 的yml文件用於描述要構建的容器
├── mysql 
│   ├── conf
│   │   └── my.cnf               # my.cnf : mysql主配置文件 
│   └── data                     # data 數據目錄,當構建的時候會將mysql數據持久化到宿主機上
├── nginx
│   ├── Dockerfile               # 構建nginx容器的 Dockerfile 文件
│   ├── nginx-1.12.1.tar.gz
│   └── nginx.conf               # nginx的主配置文件
├── php
│   ├── Dockerfile               # 構建php容器的 Dockerfile 文件
│   ├── php-5.6.31.tar.gz
│   └── php.ini                 
└── wwwroot
    └── index.php                # 網站根目錄
複製代碼

docker-compose.yml

複製代碼
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 81:80
    networks:
      - lnmp
    volumes:
      - ./wwwroot:/usr/local/nginx/html

  php:
    hostname: php
    build:
      context: ./php
      dockerfile: Dockerfile
    networks:
      - lnmp
    volumes:
      - ./wwwroot:/usr/local/nginx/html

  mysql:
    hostname: mysql
    image: mysql:5.6
    ports:
      - 3306:3306
    networks:
      - lnmp
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
    command: --character-set-server=utf8
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: user
      MYSQL_PASSWORD: user123

networks:
  lnmp: 
複製代碼

mysql/conf/my.conf

複製代碼
[mysqld]
user=mysql
port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysql/mysql.pid
log_error=/var/log/mysql/error.log
character_set_server = utf8
max_connections=3600
複製代碼

nginx/Dockerfile

複製代碼
FROM centos:7
MAINTAINER www.aliangedu.com
RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel
ADD nginx-1.12.1.tar.gz /tmp

RUN cd /tmp/nginx-1.12.1 && \
    ./configure --prefix=/usr/local/nginx && \
    make -j 2 && \
    make install

RUN rm -rf /tmp/nginx-1.12.1* && yum clean all

COPY nginx.conf /usr/local/nginx/conf

WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["./sbin/nginx", "-g", "daemon off;"]
複製代碼

nginx/nginx.conf

複製代碼
FROM centos:7
MAINTAINER www.aliangedu.com
RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel
ADD nginx-1.12.1.tar.gz /tmp

RUN cd /tmp/nginx-1.12.1 && \
    ./configure --prefix=/usr/local/nginx && \
    make -j 2 && \
    make install

RUN rm -rf /tmp/nginx-1.12.1* && yum clean all

COPY nginx.conf /usr/local/nginx/conf

WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["./sbin/nginx", "-g", "daemon off;"]
[root@linux-node2 compose_lnmp]# cat nginx/nginx.conf 
user  root; 
worker_processes  auto; 

error_log  logs/error.log  info;

pid        logs/nginx.pid; 


events {
    use epoll; 
}

http {

    include       mime.types;
    default_type  application/octet-stream;

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log logs/access.log main;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen 80;
        server_name localhost;
        root html;
        index index.html index.php;

        location ~ \.php$ {
            root html;
            fastcgi_pass php:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
            include fastcgi_params;
        }
    }
}
複製代碼

php/Dockerfile

複製代碼
FROM centos:7
MAINTAINER www.aliangedu.com
RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel
ADD php-5.6.31.tar.gz /tmp/

RUN cd /tmp/php-5.6.31 && \
    ./configure --prefix=/usr/local/php \
    --with-config-file-path=/usr/local/php/etc \
    --with-mysql --with-mysqli \
    --with-openssl --with-zlib --with-curl --with-gd \
    --with-jpeg-dir --with-png-dir --with-iconv \
    --enable-fpm --enable-zip --enable-mbstring && \
    make -j 4 && \
    make install && \
    cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
    sed -i "s/127.0.0.1/0.0.0.0/" /usr/local/php/etc/php-fpm.conf && \
    sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf
COPY php.ini /usr/local/php/etc

RUN rm -rf /tmp/php-5.6.31* && yum clean all

WORKDIR /usr/local/php
EXPOSE 9000
CMD ["./sbin/php-fpm", "-c", "/usr/local/php/etc/php-fpm.conf"]
複製代碼

wwwroot/index.php

<?php phpinfo();?>

執行一鍵部署命令: 

docker-compose -f docker-compose.yml  up
docker-compose -f docker-compose.yml  up -d       # -d參數讓程序運行在後臺

說明:  

http://192.168.0.211:81/                  # 運行上面命令即可在頁面打開php頁面

注:如果想要使用其他頁面直接將 wwwroot中的index.php問價進行替換即可

對docker-compose.yml說明

  • 這裏定義了部署LNMP環境的三個容器,Nginx、php、mysql
  • 其中nginx和php使用我們自己定義的dockerfile從頭構建,mysql直接使用官方倉庫進行構建
複製代碼
version: '3'           # cocker compose版本號
services:              # 頂級配置文件
  nginx:               # 服務名,可以通過服務名對容器進行管理
    hostname: nginx              # docker容器主機名
    build:                       # 構建nginx 容器
      context: ./nginx           # 指定環境在當前目錄的 nginx文件夾中
      dockerfile: Dockerfile     # 指定使用nginx文件夾中的Dockerfile進行構建
    ports:             # 暴露端口
      - 81:80                    # 將宿主機的81端口映射到容器的80端口
    networks:          # 容器使用的網絡
      - lnmp
    volumes:           # 指定容器數據卷掛載在宿主機路徑
      - ./wwwroot:/usr/local/nginx/html

  php:
    hostname: php
    build:
      context: ./php
      dockerfile: Dockerfile
    networks:
      - lnmp
    volumes:
      - ./wwwroot:/usr/local/nginx/html

  mysql:
    hostname: mysql
    image: mysql:5.6                 # 直接引用mysql官方鏡像倉庫
    ports:
      - 3306:3306
    networks:
      - lnmp
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
    command: --character-set-server=utf8     # 接收mysql的命令,比如這裏設置mysql的字符集
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: user
      MYSQL_PASSWORD: user123

networks:
  lnmp:                             # 創建一個網絡
複製代碼

 

docker、docker-compose、docker swarm和k8s的區別

Docker-Compose

  • Docker-Compose 是用來管理你的容器的,想象一下當你的Docker中有成百上千的容器需要啓動,如果一個一個的啓動那得多費時間。
  • 有了Docker-Compose你只需要編寫一個文件,在這個文件裏面聲明好要啓動的容器,配置一些參數
  • 執行一下這個文件,Docker就會按照你聲明的配置去把所有的容器啓動起來,只需docker-compose up即可啓動所有的容器
  • 但是Docker-Compose只能管理當前主機上的Docker,也就是說不能去啓動其他主機上的Docker容器

Docker Swarm

  • Docker Swarm 是一款用來管理多主機上的Docker容器的工具,可以負責幫你啓動容器,監控容器狀態
  • 如果容器的狀態不正常它會幫你重新幫你啓動一個新的容器,來提供服務,同時也提供服務之間的負載均衡

Kubernetes

  • Kubernetes它本身的角色定位是和Docker Swarm 是一樣的,都是一個跨主機的容器管理平臺
  • k8s是谷歌公司根據自身的多年的運維經驗研發的一款容器管理平臺,而Docker Swarm則是由Docker 公司研發的。

核心作用快速迭代、服務自愈

 

項目環境介紹

docker-compose部署django+nginx+uwsgi+celery+redis+mysql 

項目圖解

 

項目目錄結構說明

項目地址https://gitee.com/edushiyanlou/django-docker

複製代碼
django-docker                ## 項目根路徑

│  .gitignore                    # git忽略不上傳的文件

│  docker-compose.yml            # docker-compose文件

│  Dockerfile                    # 部署django項目的dockerfile

│  README.md                     # 項目Readme說明

│  requirements.txt              # 項目必須要安裝的文件

│

├─nginx                      ## nginx容器配置文件

│  │  nginx.conf                 # /etc/nginx/nginx.conf配置文件

│  │

│  └─conf                        # /etc/nginx/conf.d配置nginx文件夾

│          default.conf

│

└─web                        ## 部署django項目的web容器

    │  manage.py

    │  uwsgi.ini                 # django項目的uwsgi配置文件 

    │

    ├─demoapp

    │  │  admin.py

    │  │  apps.py

    │  │  models.py

    │  │  tasks.py               # 配置celery任務文件

    │  │  tests.py

    │  │  urls.py

    │  │  views.py

    │  │  __init__.py

    │  │

    │  ├─migrations

    │  │      __init__.py        # 引入celery

    │  │

    │  └─templates

    │      └─demoapp

    │              celery_detail.html          # 查看具體celery執行結果頁面

    │              celery_index.html           # 查看對應celery任務頁面

    │              index.html                  # 項目主頁面

    │

    └─web

            celery.py           # celery配置文件

            settings.py

            urls.py

            wsgi.py

            __init__.py
複製代碼

 

項目文件說明

初始化一個django項目

  • 項目文件

 urls.py

複製代碼
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('', include('demoapp.urls')),
    path('admin/', admin.site.urls),
]
複製代碼

 demoapp/urls.py

複製代碼
from django.urls import path
from . import views

app_name = 'demoapp'

urlpatterns = [
    path('', views.index, name='index'),
    path('celery/', views.celery_index, name='celery_index'),
    path('celery/random_add/', views.random_add, name='celery_random_add'),
    path('celery/random_mul/', views.random_mul, name='celery_random_mul'),
    path('celery/random_xsum/', views.random_xsum, name='celery_random_xsum'),
]
複製代碼

 demoapp/views.py

複製代碼
import random
from django.shortcuts import render
from . import tasks


def index(request):
    context = {}
    return render(request, 'demoapp/index.html', context)


def celery_index(request):
    context = {}
    return render(request, 'demoapp/celery_index.html', context)


def random_add(request):
    a, b = random.choices(range(100), k=2)
    tasks.add.delay(a, b)
    context = {'function_detail': 'add({}, {})'.format(a, b)}
    return render(request, 'demoapp/celery_detail.html', context)


def random_mul(request):
    a, b = random.choices(range(100), k=2)
    tasks.mul.delay(a, b)
    context = {'function_detail': 'mul({}, {})'.format(a, b)}
    return render(request, 'demoapp/celery_detail.html', context)


def random_xsum(request):
    array = random.choices(range(100), k=random.randint(1, 10))
    tasks.xsum.delay(array)
    context = {'function_detail': 'xsum({})'.format(array)}
    return render(request, 'demoapp/celery_detail.html', context)
複製代碼
  • celery配置文件

 web/__init__.py

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ['celery_app']

 web/celery.py

複製代碼
import os
from celery import Celery

# 只要是想在自己的腳本中訪問Django的數據庫等文件就必須配置Django的環境變量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'web.settings')

# app名字
app = Celery('web')

# 配置celery
class Config:
    BROKER_URL = 'redis://redis:6379'  # redis://127.0.0.1:6379
    CELERY_RESULT_BACKEND = 'redis://redis:6379'

app.config_from_object(Config)
# 到各個APP裏自動發現tasks.py文件
app.autodiscover_tasks()
複製代碼

 demoapp/tasks.py

複製代碼
# Create your tasks here
from celery import shared_task


@shared_task
def add(x, y):
    return x + y


@shared_task
def mul(x, y):
    return x * y


@shared_task
def xsum(numbers):
    return sum(numbers)
複製代碼

nginx容器相關配置文件:

 django-docker\nginx\nginx.conf

複製代碼
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
複製代碼

 django-docker\nginx\conf\default.conf

複製代碼
server {
    listen                  80;
    server_name             localhost;
    charset                 utf-8;
    client_max_body_size    10M;

    location /static/ {
        alias   /django_static/;
    }

    location / {
        include     uwsgi_params;
        uwsgi_pass  web:8000;
    }
}
複製代碼

web向配置文件:

 django-docker\Dockerfile

複製代碼
FROM python:3
ENV PYTHONUNBUFFERED=1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# ADD . /code/
複製代碼

 django-docker\web\uwsgi.ini

複製代碼
[uwsgi]
socket=:8000
chdir=/code/web
module=web.wsgi:application
pidfile=/tmp/web-master.pid
master=True
vacuum=True
processes=1
max-requests=5000
複製代碼

docker-compose.yml文件:

 docker-compose.yml

 

複製代碼
version: '3'

services:
  mysql:
    image: mysql:5.7
    volumes:
      - ./mysql:/var/lib/mysql
    expose:
      - "3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=djangodocker
      - MYSQL_USER=django
      - MYSQL_PASSWORD=django

  nginx:
    image: nginx:alpine
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf:/etc/nginx/conf.d
      - ./web/staticfiles:/django_static
    ports:
      - "80:80"
    depends_on:
      - web

  redis:
    image: redis:alpine
    expose:
      - "6379"
    restart: always

  web:
    build: .
    # command: python manage.py runserver 0:8000
    # ports:
    #   - "8000:8000"
    command: uwsgi --ini uwsgi.ini
    working_dir: /code/web
    volumes:
      - .:/code
    expose:
      - "8000"
    depends_on:
      - mysql
      - redis

  celery:
    build: .
    command: celery -A web worker -l info
    working_dir: /code/web
    volumes:
      - .:/code
    depends_on:
      - mysql
      - redis
複製代碼

 

docker-compose.yml詳釋

 docker-compose.yml詳解:

複製代碼
version: '3'                       # cocker compose版本號

services:                          # 頂級配置文件

  mysql:                           # 服務名: 容器建通信、管理容器

    image: mysql:5.7               # 引入官方mysql鏡像

    volumes:

      - ./mysql:/var/lib/mysql         # 把當前文件夾下的 ./mysql文件夾掛載到docker容器 /var/lib/mysql 路徑下

    expose:

      - "3306"                        # 將當前容器的端口3306端口暴露給link到本容器的容器

    restart: always                   # 宿主機重啓自動拉起這個docker容器

    environment:

      - MYSQL_ROOT_PASSWORD=root             # mysql服務器root密碼root

      - MYSQL_DATABASE=djangodocker          # 創建數據庫 djangodocker

      - MYSQL_USER=django                    # 創建一個用戶 django

      - MYSQL_PASSWORD=django                # 用戶密碼爲django

  nginx:

    image: nginx:alpine

    volumes:

      - ./nginx/nginx.conf:/etc/nginx/nginx.conf

      - ./nginx/conf:/etc/nginx/conf.d

      - ./web/staticfiles:/django_static

    ports:

      - "80:80"                             # 綁定容器的80端口到主機的80端口

    depends_on:

      - web                                 # 必須先啓動web容器然才能啓動nginx容器

  redis:

    image: redis:alpine

    expose:

      - "6379"

    restart: always


  web:

    build: .

    # command: python manage.py runserver 0:8000

    # ports:

    #   - "8000:8000"

    command: uwsgi --ini uwsgi.ini             # 啓動uwsgi命令

    working_dir: /code/web                     # 項目工作路徑

    volumes:

      - .:/code                                # 將當前文件夾下所有文件掛載到容器的 /code 文件夾

    expose:

      - "8000"

    depends_on:                                # 必須mysql和reids容器啓動後才能啓動web容器

      - mysql

      - redis

  celery:

    build: .

    command: celery -A web worker -l info

    working_dir: /code/web

    volumes:

      - .:/code

    depends_on:

      - mysql

      - redis
複製代碼

相似指令比較

複製代碼
'''1. expose 與 ports 比較'''

# ports: 綁定容器的端口到主機的端口,這樣就可以在外網訪問docker容器的服務

# expose: 將當前容器的端口3暴露給link到本容器的容器,expose不會將端口暴露給主機


'''2. depends_on 與 links區別'''

# depends_on: 指定本容器啓動依賴的容器必須先啓動

# links: 保證容器如果ip變化也能訪問(基本已經棄用,因爲不使用link仍然可以通過容器名稱訪問)
複製代碼

build 可以指定包含構建上下文的路徑:

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

 

Compose常用服務配置參考

  • Compose文件是一個定義服務,網絡和卷的YAML文件。 Compose文件的默認文件名爲docker-compose.yml
  • 提示:您可以對此文件使用.yml或.yaml擴展名。 他們都工作。
  • 與docker運行一樣,默認情況下,Dockerfile中指定的選項(例如,CMD,EXPOSE,VOLUME,ENV)都被遵守,你不需要在docker-compose.yml中再次指定它們。
  • 同時你可以使用類似Bash的$ {VARIABLE} 語法在配置值中使用環境變量,有關詳細信息,請參閱變量替換
  • 本節包含版本3中服務定義支持的所有配置選項。

build

build 可以指定包含構建上下文的路徑:

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

或者,作爲一個對象,該對象具有上下文路徑和指定的Dockerfile文件以及args參數值:

複製代碼
version: '2'
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
複製代碼

webapp服務將會通過./dir目錄下的Dockerfile-alternate文件構建容器鏡像。 

如果你同時指定image和build,則compose會通過build指定的目錄構建容器鏡像,而構建的鏡像名爲image中指定的鏡像名和標籤。

build: ./dir
image: webapp:tag

這將由./dir構建的名爲webapp和標記爲tag的鏡像。

context

  • 包含Dockerfile文件的目錄路徑,或者是git倉庫的URL。 
  • 當提供的值是相對路徑時,它被解釋爲相對於當前compose文件的位置。 該目錄也是發送到Docker守護程序構建鏡像的上下文。

dockerfile

  • 備用Docker文件。Compose將使用備用文件來構建。 還必須指定構建路徑。

args

  • 添加構建鏡像的參數,環境變量只能在構建過程中訪問。 

首先,在Dockerfile中指定要使用的參數:

ARG buildno
ARG password
RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"

然後在args鍵下指定參數。 你可以傳遞映射或列表:

複製代碼
build:
  context: .
  args:
    buildno: 1
    password: secret

build:
  context: .
  args:
    - buildno=1
    - password=secret
複製代碼

 注意:YAML布爾值(true,false,yes,no,on,off)必須用引號括起來,以便解析器將它們解釋爲字符串。

image

指定啓動容器的鏡像,可以是鏡像倉庫/標籤或者鏡像id(或者id的前一部分)

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

如果鏡像不存在,Compose將嘗試從官方鏡像倉庫將其pull下來,如果你還指定了build,在這種情況下,它將使用指定的build選項構建它,並使用image指定的名字和標記對其進行標記。

container_name

指定一個自定義容器名稱,而不是生成的默認名稱。

container_name: my-web-container

由於Docker容器名稱必須是唯一的,因此如果指定了自定義名稱,則無法將服務擴展到多個容器。

volumes

卷掛載路徑設置。可以設置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro),掛載數據卷的默認權限是讀寫(rw),可以通過ro指定爲只讀。 

你可以在主機上掛載相對路徑,該路徑將相對於當前正在使用的Compose配置文件的目錄進行擴展。 相對路徑應始終以 . 或者 .. 開始。

複製代碼
volumes:

  # 只需指定一個路徑,讓引擎創建一個卷
  - /var/lib/mysql

  # 指定絕對路徑映射
  - /opt/data:/var/lib/mysql
  
# 相對於當前compose文件的相對路徑 - ./cache:/tmp/cache

# 用戶家目錄相對路徑 - ~/configs:/etc/configs/:ro # 命名卷 - datavolume:/var/lib/mysql
複製代碼

但是,如果要跨多個服務並重用掛載卷,請在頂級volumes關鍵字中命名掛在卷,但是並不強制,如下的示例亦有重用掛載卷的功能,但是不提倡。

複製代碼
version: "3" 

services:

  web1:

    build: ./web/

    volumes:

      - ../code:/opt/web/code

  web2:

    build: ./web/

    volumes:

      - ../code:/opt/web/code
複製代碼

注意:通過頂級volumes定義一個掛載卷,並從每個服務的卷列表中引用它, 這會替換早期版本的Compose文件格式中volumes_from。

複製代碼
version: "3"
services:

  db:

    image: db

    volumes:

      - data-volume:/var/lib/db

  backup:

    image: backup-service

    volumes:

      - data-volume:/var/lib/backup/data

volumes:

  data-volume:
複製代碼

command

覆蓋容器啓動後默認執行的命令。

command: bundle exec thin -p 3000

該命令也可以是一個類似於dockerfile的列表:

command: ["bundle", "exec", "thin", "-p", "3000"]

links

鏈接到另一個服務中的容器。 請指定服務名稱和鏈接別名(SERVICE:ALIAS),或者僅指定服務名稱。

web:
  links:
   - db
   - db:database
   - redis
  • 在當前的web服務的容器中可以通過鏈接的db服務的別名database訪問db容器中的數據庫應用,如果沒有指定別名,則可直接使用服務名訪問。
  • 鏈接不需要啓用服務進行通信 - 默認情況下,任何服務都可以以該服務的名稱到達任何其他服務。 (實際是通過設置/etc/hosts的域名解析,從而實現容器間的通信。故可以像在應用中使用localhost一樣使用服務的別名鏈接其他容器的服務,前提是多個服務容器在一個網絡中可路由聯通)
  • links也可以起到和depends_on相似的功能,即定義服務之間的依賴關係,從而確定服務啓動的順序。

external_links

  • 鏈接到docker-compose.yml 外部的容器,甚至並非 Compose 管理的容器。參數格式跟 links 類似。
external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

expose

  • 暴露端口,但不映射到宿主機,只被連接的服務訪問。 
  • 僅可以指定內部端口爲參數
expose:
 - "3000"
 - "8000"

ports

  • 暴露端口信息。 
  • 常用的簡單格式:使用宿主:容器 (HOST:CONTAINER)格式或者僅僅指定容器的端口(宿主將會隨機選擇端口)都可以。
  • 注意:當使用 HOST:CONTAINER 格式來映射端口時,如果你使用的容器端口小於 60 你可能會得到錯誤得結果,因爲 YAML 將會解析 xx:yy 這種數字格式爲 60 進制。所以建議採用字符串格式。

簡單的短格式:

複製代碼
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"
複製代碼

在v3.2中ports的長格式的語法允許配置不能用短格式表示的附加字段。 

長格式:

ports:
  - target: 80
    published: 8080
    protocol: tcp
    mode: host

target:容器內的端口 

published:物理主機的端口 

protocol:端口協議(tcp或udp) 

mode:host 和ingress 兩總模式,host用於在每個節點上發佈主機端口,ingress 用於被負載平衡的swarm模式端口。

restart

no是默認的重啓策略,在任何情況下都不會重啓容器。 指定爲always時,容器總是重新啓動。 如果退出代碼指示出現故障錯誤,則on-failure將重新啓動容器。

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

environment

  • 添加環境變量。 你可以使用數組或字典兩種形式。 任何布爾值; true,false,yes,no需要用引號括起來,以確保它們不被YML解析器轉換爲True或False。 
  • 只給定名稱的變量會自動獲取它在 Compose 主機上的值,可以用來防止泄露不必要的數據。
複製代碼
environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET
複製代碼
  • 注意:如果你的服務指定了build選項,那麼在構建過程中通過environment定義的環境變量將不會起作用。 將使用build的args子選項來定義構建時的環境變量。

pid

將PID模式設置爲主機PID模式。 這就打開了容器與主機操作系統之間的共享PID地址空間。 使用此標誌啓動的容器將能夠訪問和操作裸機的命名空間中的其他容器,反之亦然。即打開該選項的容器可以相互通過進程 ID 來訪問和操作。

pid: "host"

dns

配置 DNS 服務器。可以是一個值,也可以是一個列表。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章