准备工作:安装docker
同基础上
Docker Compose
Docker-Compose(优缺点) Docker-Compose 是用来管理你的容器的,有点像一个容器的管家,想象一下当你的Docker中有成百上千的容器需要启动,如果一个一个的启动那得多费时间。有了Docker-Compose你只需要编写一个文件,在这个文件里面声明好要启动的容器,配置一些参数,执行一下这个文件,Docker就会按照你声明的配置去把所有的容器启动起来,但是docker compose 来轻松高效管理容器。定义运行多个容器。
作用:批量容器编排。
compose是官方的开源项目,需要安装!
Compose :重要的概念
-
服务services,容器,应用,(web/redis/mys,,)
-
项目 project。 一组关联的容器,博客,web,mysql,wp。
安装compose
1、下载
#官网
curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#这个可能会快点??
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > usr/local/bin/docker-compose
2、安装成功
多看官网!!
3、体验
地址:https://docs.docker.com/compose/gettingstarted/
通过Docker Compose上构建一个简单的Python web应用程序,使用Flask框架并在Redis中维护一个计数器,用来记录改web应用被访问的次数。
1、准备工作
yum -y install python-pip #pip是Python 包管理工具
yum -y install epel-release #报错执行安装依赖
2、为项目创建目录
mkdir composetest
cd -
3、在项目目录中创建一个名为app.py
import time
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.
'.format(count)
4、在项目目录中创建另一个名为requirements.txt的文件
flask
redis
5、在项目目录中,创建名为Dockerfile的文件:
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"] # CMD ["python", "app.py"]
#从Python 3.7映像开始构建映像。
#将工作目录设置为/code。
#设置flask命令使用的环境变量。
#安装gcc和其他依赖项
#复制requirements.txt并安装Python依赖项。
#向图像添加元数据以描述容器正在侦听端口5000
#将.项目中的当前目录复制到.映像中的工作目录。
#将容器的默认命令设置为flask run。
6、在项目目录中创建一个名为docker-compose.yml的文件:
#定义了两个服务:web和redis
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
大概流程:
-
应用 app.py
-
Dockerfile 将应用打包为镜像
-
Docker-compose yaml 文件(定义整个服务,需要的一些环境。web/redis)完整的上线服务
-
启动 compose 项目 (docker-compose up)
流程:
-
创建网络
-
执行 Docker-compose yaml
-
启动服务:(很慢)
-
Creating composetest_redis_1 ... done Creating composetest_web_1 ... done
-
-
文件名 composetest
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"自动默认规则
测试成功!
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
188f23975dd3 composetest_web "flask run" 58 minutes ago Up 2 minutes 0.0.0.0:5000->5000/tcp composetest_web_1
8fe4249f2093 redis:alpine "docker-entrypoint.s…" 58 minutes ago Up 2 minutes 6379/tcp composetest_redis_1
[root@localhost ~]# curl localhost:5000
Hello World! I have been seen 5 times.
[root@localhost ~]# curl localhost:5000
Hello World! I have been seen 6 times.
[root@localhost ~]# curl localhost:5000
Hello World! I have been seen 7 times.
[root@localhost ~]# 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.
默认的服务名 文件名-服务名-num
多个服务器 集群 A B _num 副本数量
服务redis服务=>4个副本
集群状态,弹性、HA 高并发 (kubetctl service 负载均衡)
网络规则:
10个服务=》项目 (项目中的内容都在同一个网络下,域名访问 )
如果在同一网络下,可以通过域名来访问。HA!
停止:docker-compose down(在对应的文件下) 或者: Ctrl+C
Docker-Compose
以前都是单个docker run 启动容器
docker-compose、通过docker-compose编写yaml配置文件、可以通过compose一键启动所有服务,停止!
Docker小结:
-
Docker镜像,run=》容器
-
Dockerfile构建镜像 (服务打包)
-
Docker-Compose启动项目(编排、多个微服务/环境)
-
Docker网络!
-
Yaml规则:
docker-compose.yaml 核心
官方文档地址:https://docs.docker.com/compose/compose-file
# 3层
version: #版本 1 向下兼容
services: #服务 2
服务1: web
#服务配置
images
build
network
....
服务2:Redis
...
#其他配置 网络/卷、全局规则 3
networks
vloume
configs
......
多写,多练,多看,compose.yaml文件!官方文档 、开源项目。
开源项目(博客)
下载程序、安装数据库、配置......
compose 应用=>一键启动!
-
下载项目(docker-compose.yaml)
-
如果需要文件。Dockerfile
-
文件准备齐全(直接一键启动项目)
# 1、创建一个空的项目目录my_wordpress,并进入目录;
[root@localhost home]# mkdir my_wordpress
[root@localhost home]# cd my_wordpress
# 2、创建一个docker-compose.yml文件来启动您的 WordPress博客,并创建一个单独的MySQL实例,该实例具有用于数据持久性的卷挂载:
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
#Docker卷db_data将WordPress所做的所有更新持久化到数据库。WordPress Multisite仅适用于port 80和443。
3、启动docker-compose up
[root@localhost my_wordpress]# docker-compose up
Status: Downloaded newer image for wordpress:latest
Creating my_wordpress_db_1 ... done
Creating my_wordpress_wordpress_1 ... done
Attaching to my_wordpress_db_1, my_wordpress_wordpress_1
[root@localhost composetest]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d0cc0d74fd6 wordpress:latest "docker-entrypoint.s…" 31 seconds ago Up 30 seconds 0.0.0.0:8000->80/tcp my_wordpress_wordpress_1
cc754e2eae77 mysql:5.7 "docker-entrypoint.s…" 32 seconds ago Up 31 seconds 3306/tcp, 33060/tcp my_wordpress_db_1
a86d12bfa37e mysql:5.7 "docker-entrypoint.s…" 3 days ago Up 3 days 0.0.0.0:3306->3306/tcp, 33060/tcp dq-mysql
前台启动 : docker -d 、docker-compose up -d
[root@localhost my_wordpress]# docker-compose up -d
Starting my_wordpress_db_1 ... done
Starting my_wordpress_wordpress_1 ... done