Docker 进阶 (一) Compose
2021-07-07 本文已影响0人
yjtuuige
简介
-
Compose
是Docker
官方的开源项目(需要安装),负责实现对Docker
容器集群的快速编排。 - 定义和运行多个容器:
Docker Compose
是docker
提供的一个命令行工具,用来定义和运行由多个容器组成的应用。 -
YAML file
配置文件:
使用compose
,我们可以通过YAML
文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。
三个步骤:
-
dockerfile
文件 -
docker-compose.yml
配置文件 -
docker-compose up
启动
作用:批量容器编排
-
dockerfile
让程序在任何地方运行。如WEB
服务,redis
、mysql
、nginx
......多个容器
Compose
配置文件:docker-compose.yml
- 提示:文件的扩展名为
.yml
或.yaml
扩展名。
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: {}
- 文件结构说明
-
version
定义了版本信息 -
services
定义了服务的配置信息 -
networks
定义了网络信息,提供给services
中的 具体容器使用 -
volumes
定义了可以同意管理数据卷,提供给services
中的 具体容器使用
-
Compose
中有两个重要的概念:
- 服务 (
service
):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例,如:web
、mysql
、redis
...... - 项目 (
project
):由一组关联的应用容器组成的一个完整业务单元,在dockercompose.yml
文件中定义。如:一组关联的应用 博客:web
、mysql
、wp
-
Compose
的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。可见,一个项目可以由多个服务(容器)关联而成,Compose
面向项目进行管理。 -
Compose
项目由Python
编写,实际上调用了Docker
服务提供的API
来对容器进行管理。因此,只要所操作的平台支持Docker API
,就可以在其上利用Compose
来进行编排管理。
安装:(
Linux
版本)
- 下载 版本查看
-
Github
源(太慢)
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
-
Daocloud
镜像(推荐使用)
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
- 授权
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
应用
-
python
应用,计数器,redis
官方地址
- 创建应用
app.py
- 创建
composetest
目录
[root@VM-0-6-centos ceshi]# mkdir composetest
[root@VM-0-6-centos ceshi]# cd composetest
- 创建
app.py
文件
[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)
- 创建
requirements.txt
[root@VM-0-6-centos composetest]# vi requirements.txt
flask
redis
- 创建
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"]
-
docker-compose yml
文件配置(定义整个服务需要的环境,web
,redis
)完整的上线服务
[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
- 启动
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
docker service
[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
可以一键启动或停止项目