Docker 基础

Docker 进阶 (一) Compose

2021-07-07  本文已影响0人  yjtuuige

简介

三个步骤:

  1. dockerfile文件
  2. docker-compose.yml 配置文件
  3. docker-compose up 启动

作用:批量容器编排

Compose 配置文件:docker-compose.yml

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

Compose 中有两个重要的概念:

  1. 服务 ( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例,如: webmysqlredis......
  2. 项目 ( project ):由一组关联的应用容器组成的一个完整业务单元,在 dockercompose.yml 文件中定义。如:一组关联的应用 博客:webmysqlwp

安装:( Linux 版本)

  1. 下载 版本查看
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
[root@VM-0-6-centos ~]# curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   423  100   423    0     0    454      0 --:--:-- --:--:-- --:--:--   453
100 16.3M  100 16.3M    0     0   9.9M      0  0:00:01  0:00:01 --:--:--  9.9M
[root@VM-0-6-centos ~]# cd /usr/local/bin/
[root@VM-0-6-centos bin]# ll
total 16812
-rwxr-xr-x 1 root root      383 Dec 10  2019 chardetect
-rwxr-xr-x 1 root root      389 Dec 10  2019 cloud-init
-rwxr-xr-x 1 root root     1781 Dec 10  2019 cloud-init-per
-rw-r--r-- 1 root root 17176256 Jul  5 17:02 docker-compose        // 下载成功
-rwxr-xr-x 1 root root      399 Dec 10  2019 easy_install
-rwxr-xr-x 1 root root      407 Dec 10  2019 easy_install-3.6
-rwxr-xr-x 1 root root     1005 Dec 10  2019 jsondiff
-rwxr-xr-x 1 root root     3663 Dec 10  2019 jsonpatch
-rwxr-xr-x 1 root root     1839 Dec 10  2019 jsonpointer
-rwxr-xr-x 1 root root      392 Dec 10  2019 jsonschema
[root@VM-0-6-centos ~]# rm /usr/local/bin/docker-compose
  1. 授权
    chmod +x /usr/local/bin/docker-compose
[root@VM-0-6-centos ~]# chmod +x /usr/local/bin/docker-compose
[root@VM-0-6-centos ~]# docker-compose version          // docker-compose -v
docker-compose version 1.29.2, build 5becea4c            // 安装成功
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

体验:创建一个 python 应用

  1. 创建应用 app.py
[root@VM-0-6-centos ceshi]# mkdir composetest
[root@VM-0-6-centos ceshi]# cd composetest
[root@VM-0-6-centos composetest]# vi app.py
import time
import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)    // 同一网络下,主机 IP 用 域名 host='redis' 的方式 绑定 

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)
[root@VM-0-6-centos composetest]# vi requirements.txt
flask
redis
  1. 创建 Dockerfile ,应用打包为镜像
[root@VM-0-6-centos composetest]# vi Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
  1. docker-compose yml 文件配置(定义整个服务需要的环境,webredis)完整的上线服务
[root@VM-0-6-centos composetest]# vi docker-compose.yml
version: "3.9"            // 版本问题可能会报错 ,切换版本即可
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"
[root@VM-0-6-centos composetest]# ll
total 16
-rw-r--r-- 1 root root 516 Jul  5 20:37 app.py
-rw-r--r-- 1 root root 112 Jul  5 20:45 docker-compose.yml
-rw-r--r-- 1 root root 282 Jul  5 20:43 Dockerfile
-rw-r--r-- 1 root root  12 Jul  5 20:41 requirements.txt
  1. 启动 compose 项目(docker-compose up
[root@VM-0-6-centos composetest]# docker-compose up
Recreating composetest_web_1   ... done
Recreating composetest_redis_1 ... done
Attaching to composetest_redis_1, composetest_web_1
redis_1  | 1:C 05 Jul 2021 13:54:22.188 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo  // redis 服务
redis_1  | 1:C 05 Jul 2021 13:54:22.188 # Redis version=6.2.4, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 05 Jul 2021 13:54:22.188 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1  | 1:M 05 Jul 2021 13:54:22.189 * monotonic clock: POSIX clock_gettime
redis_1  | 1:M 05 Jul 2021 13:54:22.189 * Running mode=standalone, port=6379.
redis_1  | 1:M 05 Jul 2021 13:54:22.189 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1  | 1:M 05 Jul 2021 13:54:22.189 # Server initialized
redis_1  | 1:M 05 Jul 2021 13:54:22.206 * Loading RDB produced by version 6.2.4
redis_1  | 1:M 05 Jul 2021 13:54:22.206 * RDB age 349 seconds
redis_1  | 1:M 05 Jul 2021 13:54:22.206 * RDB memory usage when created 0.79 Mb
redis_1  | 1:M 05 Jul 2021 13:54:22.206 * DB loaded from disk: 0.000 seconds
redis_1  | 1:M 05 Jul 2021 13:54:22.206 * Ready to accept connections
web_1    |  * Serving Flask app 'app.py' (lazy loading)        // web 服务
web_1    |  * Environment: production
web_1    |    WARNING: This is a development server. Do not use it in a production deployment.
web_1    |    Use a production WSGI server instead.
web_1    |  * Debug mode: off
web_1    |  * Running on all addresses.
web_1    |    WARNING: This is a development server. Do not use it in a production deployment.
web_1    |  * Running on http://172.18.0.3:5000/ (Press CTRL+C to quit)
[root@VM-0-6-centos ~]# docker ps        // redis 和 web 两个容器正常运行
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                                       NAMES
95a944161271   composetest_web   "flask run"              20 minutes ago   Up 20 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   composetest_web_1
a642e6da2eb7   redis:alpine      "docker-entrypoint.s…"   20 minutes ago   Up 20 minutes   6379/tcp                                    composetest_redis_1
[root@VM-0-6-centos ~]# curl localhost:5000
Hello World! I have been seen 1 times.        // 程序正常执行
[root@VM-0-6-centos ~]# docker images
REPOSITORY        TAG          IMAGE ID       CREATED          SIZE
composetest_web   latest       9cbb8b9dd085   56 minutes ago   184MB
python            3.7-alpine   93ac4b41defe   5 days ago       41.9MB
redis             alpine       1690b63e207f   4 weeks ago      32.3MB
[root@VM-0-6-centos ~]# docker service ls    // 非集群,所以报错
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
[root@VM-0-6-centos ~]# docker network ls
NETWORK ID     NAME                  DRIVER    SCOPE
cb59eddef222   bridge                bridge    local
b86adf2e5590   composetest_default   bridge    local          // compose 创建的专用网络
c86310353602   host                  host      local
1ab8f2e4028d   none                  null      local

项目中的内容都在同一网络下,可以通过域名互相访问。如 mysql :3306,用mysql域名方式来代替IP,避免因绑定IP后,服务更换IP后无法访问。

docker-compose stop
# 或者在 docker-compose 目录下
docker-compose down  (ctrl+c)

compose可以一键启动或停止项目

上一篇 下一篇

猜你喜欢

热点阅读