Day13 Docker compose

当每个Class(Image)都写的简洁有力又好用、且权责都分得乾乾净净的时候就可以加入一个Service层让整个服务更容易地被使用,而这个Service层的功能就由docker-compose来担任,先建立一个资料夹然後按照下图将档案建立好。

.
├── Backend
│   ├── index.php
│   ├── Dockerfile
│   └── nginx
│       └── default.conf
└── docker-compose.yaml

default.conf这个档案内容为以下

server {
    listen 80;
    index index.php index.html;
    server_name localhost;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/daythirteen;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

default.conf这个档案是属於Nginx的设定,Nginx是一套与Apache相似的服务,负责处理网页的request与response,在本篇章就不多叙述。

index.php 内容为以下

<?php
echo 'Hello World';
?>

docker-compose 内容为以下

version: '3'
networks: 
  laravel:
services: 
  nginx:
    image: nginx:stable-alpine
    container_name: nginx-laravel
    ports:
      - "8080:80"
    volumes:
      - ./Backend/index.php:/var/www/daythirteen/index.php
      - ./Backend/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
      - postgresql
    networks:
      - laravel
  php:
    image: kurt6783/iron_man
    container_name: php
    ports:
      - "9000:9000"
    volumes:
      - ./Backend/index.php:/var/www/daythirteen/index.php
    networks:
      - laravel
  postgresql:
    image: mdillon/postgis:10
    container_name: postgresql
    tty: true
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=1234
    volumes:
      - ./Backend/postgresql:/var/lib/postgresql/data
    networks: 
      - laravel

下面说明一些重要的属性。

  1. networks

前面有提到每一个实体化的container都是一个独立的个体,但因为Nginx、php、postgresql这三个服务是需要串起来才能发挥功用的,所以需要利用networks来让他们建立一个内网,可以看到在每个服务的下面都会搭配一个networks属性。

  1. image

功能如其名,container要由哪一个image实体化就是从这里设定,PHP的部分就是使用昨天制作的Image

  1. build,可与image属性交换使用,可即时build一个Image,缺点就是比较花时间,DockerFile的内容可参考Day12 Docker File
build:
      context: .
      dockerfile: ./Backend/Dockerfile
  1. container_name

替这个实例化的container取一个名字,方便辨识、取log、关闭、重启。

  1. ports

开一个port让外部可以连入,例如Day11的SQL就是用此方法让Navicate可以连线的。

  1. volumes

从外部挂载档案到内部,冒号左边为外部位置,冒号右边为内部位置,启动时会将资料挂载进去container,运行中即关闭时会将资料同步至外部,如果没有挂载档案的话当container关闭後在期间有变化的档案就不会有纪录。

  1. depends_on

必须要先启动指定container才能继续实体化该container,以此案例来说,如果要启用Nginx必须要先启用php与postgresql,毕竟不可能没有厨师跟服务生还开门做生意。

  1. environment

环境变数设定,与Day11 SQL下指令的 -e 是同一个指令,每个Image有属於自己的环境参数设定,可至DockerHub上查询。


要使用docker-compose是需要安装软件的,所以打开terminal打上

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

替docker-compose设定操作权限

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

确定是否有安装成功

docker-compose -v

查询docker-compose 有哪些服务

docker-compose -h

最後就是三个最常用的docker-compose 指令。

  1. 打开terminal移动至与docker-compose同层级或是更下层都可以,下完指令後会依序往上层直到搜寻到docker-compose档案为止启动该docker-compose设定内的所有服务,-d代表该服务运行於後台不占用terminal
docker-compose up -d
  1. 关闭该docker-compose设定内的所有服务
docker-compose down
  1. 列表目前启用中的container
docker ps

只要利用docker ps 确认container皆有顺利运行的话就可利用Chrome打上localhost:8080或是127.0.0.1:8080即可确认服务成功运行了(8080port是因为Ningx设定的外部port为8080)。
https://ithelp.ithome.com.tw/upload/images/20210913/20115048jYgKFISHLR.png

这次的Docker介绍就到这边告一段落了,谢谢观看的各位,请记得按赞分享开启小铃铛,你的支持会让按赞数+1。


<<:  从 IT 技术面细说 Search Console 的 27 组数字 KPI (13) :网页体验 - 行动装置可用性

>>:  Day1-前言:三十天成为D3好手

[DAY 9] _I²C协议介绍

现在有不少的sensor传输都是用I2C协议在做传输的,在教学用I²C如何撰写前,我认为要先了解协议...

我们的基因体时代-AI, Data和生物资讯 Day26-取用基因序列资讯

上一篇[我们的基因体时代-AI, Data和生物资讯 Day25- 再深一点:AnnotationH...

Day22_控制项(A17营运持续管理之资讯安全层面)-2021/10/05

▉A.17 Information Security Aspects Of Business营运持续...

Computer Architecture: Memory Hierarchy

开始之前 既然 Load/Store 都写完了,就来讲讲 Memory 吧! 相信看到这边的读者在学...

使用 Domain Driven Design 来进行架构设计

接续上一篇的故事,阿明跟小美又经过了几次的对话与讨论,在便利贴专案中整理归纳了下列这几个关键字: C...