1. 程式人生 > 其它 >Docker-Docker Compose

Docker-Docker Compose

1.1 基本概述

在實際生產環境中,一個應用往往由許多服務構成,而 docker 的最佳實踐是一個容器只執行一個程序,因此執行多個微服務就要執行多個容器。多個容器協同工作需要一個有效的工具來管理他們,定義這些容器如何相互關聯。compose 應運而生。compose 是用來定義和執行一個或多個容器(通常都是多個)執行和應用的工具。使用 compose 可以簡化容器映象的構建以及容器的執行。
compose 使用 YAML 檔案來定義多容器之間的關係。一個 docker-compose up 就可以把完整的應用跑起來。 本質上 compose 把 YAML 檔案解析成 docker 命令的引數,然後呼叫相應的 docker 命令列介面,從而將應用以容器化的方式管理起來。它通過解析容器間的依賴關係順序地啟動容器。而容器間的依賴關係由 YAML 檔案中的 links 標記指定。

官方文件: https://docs.docker.com/compose/

1.2 什麼是docker compose?

compose、machine 和 swarm 是docker 原生提供的三大編排工具。簡稱docker三劍客。

Docker Compose能夠在 Docker 節點上,以單引擎模式(Single-Engine Mode)進行多容器應用的部署和管理。多數的現代應用通過多個更小的微服務互相協同來組成一個完整可用的應用。比如一個簡單的示例應用可能由如下 4 個微服務組成。

  • Web前端。
  • 訂單管理。
  • 品類管理。
  • 後臺資料庫。

將以上服務組織在一起,就是一個可用的應用。部署和管理繁多的服務是困難的。而這正是 Docker Compose 要解決的問題。Docker Compose 並不是通過指令碼和各種冗長的 docker 命令來將應用元件組織起來,而是通過一個宣告式的配置檔案描述整個應用,從而使用一條命令完成部署。應用部署成功後,還可以通過一系列簡單的命令實現對其完整宣告週期的管理。甚至,配置檔案還可以置於版本控制系統中進行儲存和管理。

1.3 docker compose安裝與解除安裝

1、下載地址: https://github.com/docker/compose/releases/tag/1.29.0

2、通過Xftp上傳到linux伺服器中。

3、給予授權

[root@CentOS ~]# cd /data/
[root@CentOS data]# cd /home/data/
[root@CentOS data]# ls
docker-compose-Linux-x86_64
[root@CentOS data]# pwd
/home/data
[root@CentOS data]# mv /home/data/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
mv:是否覆蓋"/usr/local/bin/docker-compose"? y
[root@CentOS data]# chmod 777 /usr/local/bin/docker-compose

4、檢查安裝情況以及版本

[root@CentOS data]# docker-compose -v
docker-compose version 1.29.0, build 07737305
[root@CentOS data]# docker-compose version
docker-compose version 1.29.0, build 07737305
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
[root@CentOS data]# 

5、docker compose解除安裝

docker-compose解除安裝只需要刪除二進位制檔案就可以了。

rm -rf /usr/local/bin/docker-compose

## 重啟系統!!!
reboot

1.4 快速開始

1、為專案建立一個目錄composetest

[root@CentOS home]# mkdir composetest
[root@CentOS home]# ls
composetest  data  guardwhy
[root@CentOS home]# cd composetest/
[root@CentOS composetest]# pwd
/home/composetest
[root@CentOS composetest]# 

2、建立app.py檔案

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

if __name__ == "__main__":
        app.run(host="0.0.0.0",debug=True)                           

3、建立requirements.txt檔案

flask
redis

4、建立Dockerfile 檔案,應用打包為映象

FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

5、建立docker-compose.yml檔案,(定義整個服務,需要的環境。 web、redis)完整的上線服務。

version: '3.8'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
  redis:
    image: redis:alpine

6、啟動 compose 專案,執行成功!!!

docker-compose up


7、檢視生成映象,服務啟動成功!!!預設的服務名 都是檔名_服務名 _ num

8、檢視網路具體資訊。

執行命令: docker network ls

[root@CentOS ~]# docker network ls
NETWORK ID     NAME                  DRIVER    SCOPE
f1926299a7da   bridge                bridge    local
366faa05f94f   composetest_default   bridge    local
46eb4e50e96b   host                  host      local
afb8f718984e   none                  null      local

專案中的內容都在同個網路下,如果在同一個網路下,可以直接通過域名訪問。

docker network inspect 366faa05f94f 

9、停止docker-compose

docker-compose down 或者ctrl+c

小結: 以前都是單個 docker run 啟動容器,現在通過 docker-compose 編寫 yaml配置檔案、可以通過 compose 一鍵啟動所有或者停止服務!!!

1.5 compose.yml編寫規則

1、基本概念

Docker Compose 使用 YAML 檔案來定義多服務的應用。YAML 是 JSON 的一個子集,因此也可以使用JSON
Docker Compose 預設使用檔名 docker-compose.yml。當然,也可以使用 -f 引數指定具體檔案。
Docker Compose 的 YAML 檔案包含 4 個一級 key:version、services、networks、volumes

  • version 是必須指定的,而且總是位於檔案的第一行。它定義了 Compose 檔案格式(主要是API)的版本,version 並非定義 Docker Compose 或 Docker 引擎的版本號。
  • services 用於定義不同的應用服務。Docker Compose 會將每個服務部署在各自的容器中。
  • networks 用於指引 Docker 建立新的網路,預設情況下,Docker Compose 會建立 bridge 網路,這是一種單主機網路,只能夠實現同一主機上容器的連線。當然,也可以使用 driver 屬性來指定不同的網路型別。
  • volumes 用於指引 Docker 來建立新的卷。

官方文件: https://docs.docker.com/compose/

version: '' # 版本
services: # 服務
服務1: web
# 服務配置
images
build
network
.....
服務2: redis
 ....
服務3: redis
# 其他配置 網路/卷、全域性規則
volumes:
networks:
configs:

2、順序啟動服務(depends_on)

官方文件: https://docs.docker.com/compose/compose-file/

Express dependency between services. Service dependencies cause the following behaviors:

  • docker-compose up starts services in dependency order. In the following example, db and redis are started before web.
  • docker-compose up SERVICE automatically includes SERVICE’s dependencies. In the example below, docker-compose up web also creates and starts db and redis.
  • docker-compose stop stops services in dependency order. In the following example, web is stopped before db and redis

案例說明:

1.6 案例說明

1、安裝基礎映象

[root@CentOS data]# docker pull nginx:1.20.1
docker.io/library/nginx:1.20.1
[root@CentOS data]# docker pull tomcat:9.0.20-jre8-alpine
9.0.20-jre8-alpine: Pulling from library/tomcat
docker.io/library/tomcat:9.0.20-jre8-alpine
[root@CentOS data]# docker images
REPOSITORY   TAG                  IMAGE ID       CREATED       SIZE
nginx        1.20.1               993ef3592f66   2 weeks ago   133MB
tomcat       9.0.20-jre8-alpine   387f9d021d3a   2 years ago   108MB
[root@CentOS data]# 

2、建立基礎容器

[root@CentOS data]# mkdir tomcat1 tomcat2 nginx
[root@CentOS data]# ls
nginx  tomcat1  tomcat2
[root@CentOS data]# docker run -itd --name nginx -p 80:80 nginx:1.20.1
ca10564478d2200bf57ceae115e17193cf1ed2a1f642f2df5167b9c988a4dfee
[root@CentOS data]# docker run -itd --name tomcat -p 8080:8080 tomcat:9.0.20-jre8-alpine
683a6fa394e1addef48c8eddd980b0891b9c796c3411f78804fff2a160228b49
[root@CentOS ~]# docker ps -a
CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS         PORTS                                       NAMES
683a6fa394e1   tomcat:9.0.20-jre8-alpine   "catalina.sh run"        7 minutes ago   Up 7 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   tomcat
ca10564478d2   nginx:1.20.0                "/docker-entrypoint.…"   7 minutes ago   Up 7 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp           nginx
[root@CentOS data]#

3、檔案拷貝

nginx相關操作

docker cp nginx:/etc/nginx /home/data


tomcat執行命令

[root@CentOS data]# ls
nginx  tomcat1  tomcat2
[root@CentOS data]# docker cp tomcat:/usr/local/tomcat/webapps /home/data/tomcat1/webapps
[root@CentOS data]# ls
nginx  tomcat1  tomcat2
[root@CentOS data]# cd tomcat1/webapps/
[root@CentOS webapps]# ll
總用量 8
drwxr-xr-x. 14 root root 4096 5月  16 2019 docs
drwxr-xr-x.  6 root root   83 5月  16 2019 examples
drwxr-xr-x.  5 root root   87 5月  16 2019 host-manager
drwxr-xr-x.  5 root root  103 5月  16 2019 manager
drwxr-xr-x.  3 root root 4096 5月  16 2019 ROOT
[root@CentOS webapps]# docker cp tomcat:/usr/local/tomcat/webapps /home/data/tomcat2/webapps
[root@CentOS data]# cd tomcat2/webapps/
[root@CentOS webapps]# ll
總用量 8
drwxr-xr-x. 14 root root 4096 5月  16 2019 docs
drwxr-xr-x.  6 root root   83 5月  16 2019 examples
drwxr-xr-x.  5 root root   87 5月  16 2019 host-manager
drwxr-xr-x.  5 root root  103 5月  16 2019 manager
drwxr-xr-x.  3 root root 4096 5月  16 2019 ROOT
[root@CentOS webapps]# 

3、追加操作

[root@CentOS data]# echo "hello,tomcat1" > /home/data/tomcat1/webapps/ROOT/index.jsp
[root@CentOS data]# cat  /home/data/tomcat1/webapps/ROOT/index.jsp
hello,tomcat1
[root@CentOS data]# echo "hello,tomcat2" > /home/data/tomcat2/webapps/ROOT/index.jsp
[root@CentOS data]# cat  /home/data/tomcat2/webapps/ROOT/index.jsp
hello,tomcat2
[root@CentOS data]# 

4、修改nginx.conf

nginx.conf檔案尾部新增以下內容

include vhost/*.conf;


5、反向代理配置

mkdir -p /data/nginx/vhost
[root@CentOS nginx]# cd vhost/
[root@CentOS vhost]# vim guardwhy.cn.conf
[root@CentOS vhost]# cat guardwhy.cn.conf 
upstream nginxguardwhy{
  server 192.168.50.131:8081;
  server 192.168.50.131:8082;
 }

server{
  listen 80;
  server_name 192.168.50.131;
  autoindex on;
  index index.html index.htm index.jsp;
  location / {
    proxy_pass http://nginxguardwhy;
    add_header Access-Control-Allow-Origin *;
  }
}
[root@CentOS vhost]# 

6、建立docker-compose.yml檔案

version: '3'
services:
  guardwhy-nginx:
    image: nginx:1.20.1
    container_name: guardwhy-nginx
    restart: always
    ports:
    - 80:80
    volumes:
    - /home/data/nginx:/etc/nginx
  guardwhy-tomcat1:
    image: tomcat:9.0.20-jre8-alpine
    container_name: guardwhy-tomcat1
    restart: always
    ports:
    - 8081:8080
    volumes:
    - /home/data/tomcat1/webapps:/usr/local/tomcat/webapps
    depends_on:
      - guardwhy-nginx
  guardwhy-tomcat2:
    image: tomcat:9.0.20-jre8-alpine
    container_name: guardwhy-tomcat2
    restart: always
    ports:
    - 8082:8080
    volumes:
      - /home/data/tomcat2/webapps:/usr/local/tomcat/webapps
    depends_on:
      - guardwhy-nginx

7、啟動服務,執行以下命令

docker-compose up 或者 docker-compose up -d

瀏覽器測試,執行成功!!!

點選連結: http://192.168.50.131:8081/
點選連結: http://192.168.50.131:8082/
點選連結: http://192.168.50.131/

1.7 常用命令彙總

注意以下所有的命令要在docker-compose.yaml所在的目錄中,執行才能生效!!!

1、啟動服務

docker-compose up -d

2、列出所有執行容器

docker-compose ps

3、檢視服務日誌

docker-compose logs


4、構建或者重新構建服務

docker-compose build

5、啟動服務

docker-compose start

6、停止已執行的服務

docker-compose stop

7、重啟服務

docker-compose restart

8、停止服務

docker-compose down