linux12 - docker容器08 -->docker compose实战
Posted FikL-09-19
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux12 - docker容器08 -->docker compose实战相关的知识,希望对你有一定的参考价值。
一、Docker Compose
1、简介
Docker
Dockfile build run 手动操作,单个容器
微服务。 100个微服务!依赖关系。
# Docker Compose来轻松高效的管理容器,定义运行多个容器。
# 官网: https://docs.docker.com/compose/
# Docker Compose docker kang pu s
2、官方介绍
# Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。
YAML file配置文件。
single command。 命令有哪里
Compose 适用于所有环境:生产、登台、开发、测试以及 CI 工作流。
1、三步骤
1、Dockerfil保证我们的项目可以在任何地方运行。
2、定义组成您的应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。
# services 什么是服务
# docker-compose.ym 这个文件如何写
3、运行docker compose up和码头工人组成命令启动并运行你的整个应用程序。
也可以docker-compose up使用 docker-compose 二进制文件运行。 #启动项目
# 作用: 批量容器编排
2、Compose是Docker官方的开源项目,需要安装!
dockerfike # 让程序在任何地方运行。 web服务、redis、mysql、nginx ... d 多个服务 启动
3、Adocker-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: {}
3、Compose:重要的概念
# docker-compose up 100个服务
# 1、服务services 容器、应用(web、redis、mysql ...)
# 2、现目project 一组关联的容器。 博客、web、mysql
二、docker compose 安装
# 安装官网: https://docs.docker.com/compose/install/
1、下载
# 官网安装
sudo 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.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@docter bin]# ll
total 12440
-rw-r--r-- 1 root root 12737304 Jul 14 20:19 docker-compose
2、授权
[root@docter bin]# sudo chmod +x /usr/local/bin/docker-compose
3、检测版本
[root@docter bin]# docker-compose version
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
4、实战docker compose构建redis
# 官网 https://docs.docker.com/compose/gettingstarted/
1、应用app.py
2、Dockerfile 应用镜像
3、Docker-compose.yml文件(定义整个服务,需要的环境,web、redis)完整的上线服务
4、启动compose项目( docker-compose up )
流程
# 1、创建网络
# 2、执行Docker-compose.yml文件
# 3、在 Compose 文件中定义服务
# 4、启动docekr-compose
1、设置
0、准备工作
yum -y install python-pip # pip是python包管理工具
yum -y install epel-relase # 报错的话执行
# 如果官网安装不需要执行
1、创建项目目录
[root@docter home]# mkdir composetest
[root@docter home]# cd composetest/
2、在项目目录中创建名为app.py文件
[root@docter composetest]# pwd
/home/composetest
[root@docter composetest]# vim 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.\\n'.format(count)
# 在此示例中,redis是应用程序网络上的 redis 容器的主机名。我们使用 Redis 的默认端口6379。
3、 requirements.txt依赖
[root@docter composetest]# vim requirements.txt
flask
redis
4、创建一个 Dockerfile
[root@docter composetest]# vim 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"]
# CMD ["python", "run"] #这样也可以
# 这告诉 Docker:
从 Python 3.7 映像开始构建映像。
将工作目录设置为/code.
设置flask命令使用的环境变量。
安装 gcc 和其他依赖项
复制requirements.txt并安装 Python 依赖项。
将元数据添加到图像中以描述容器正在侦听端口 5000
将.项目中的当前目录复制到.镜像中的workdir 。
将容器的默认命令设置为flask run.
5、在 Compose 文件中定义服务
[root@docter composetest]# vim docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
# 这个 Compose 文件定义了两个服务:web和redis.
补充
# 网络服务
该web服务使用从Dockerfile当前目录中构建的映像。然后它将容器和主机绑定到暴露的端口5000. 此示例服务使用 Flask Web 服务器的默认端口5000.
# Redis服务
该redis服务使用 从 Docker Hub 注册表中提取的公共Redis映像。
6、使用 Compose 构建并运行您的应用程序
[root@docter composetest]# docker-compose up
...
Attaching to composetest_web_1, composetest_redis_1
redis_1 | 1:C 14 Jul 2021 12:38:57.667 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 14 Jul 2021 12:38:57.667 # Redis version=6.2.4, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 14 Jul 2021 12:38:57.667 # 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 14 Jul 2021 12:38:57.668 * monotonic clock: POSIX clock_gettime
redis_1 | 1:M 14 Jul 2021 12:38:57.668 * Running mode=standalone, port=6379.
redis_1 | 1:M 14 Jul 2021 12:38:57.668 # 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 14 Jul 2021 12:38:57.668 # Server initialized
redis_1 | 1:M 14 Jul 2021 12:38:57.668 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1 | 1:M 14 Jul 2021 12:38:57.668 * Ready to accept connections
web_1 | * Serving Flask app 'app.py' (lazy loading)
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.2:5000/ (Press CTRL+C to quit)
7、报错排查
The command '/bin/sh -c apk add --no-cache gcc musl-dev linux-headers' returned a non-zero code: 3
ERROR: Service 'web' failed to build : Build failed
# Docker 容器似乎没有互联网连接,您必须IPv4 forwarding使用以下命令启用
[root@docter composetest]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@docter composetest]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
[root@docter composetest]# sysctl -p /etc/sysctl.conf
[root@docter composetest]# docker-compose stop
[root@docter composetest]# docker-compose up #前台启动
[root@docter my_wordpress]# docker-compose up -d #后台启动
8、查看测试docker-compose
[root@docter composetest]# ll
total 16
-rw-r--r-- 1 root root 515 Jul 14 20:29 app.py
-rw-r--r-- 1 root root 111 Jul 14 20:32 docker-compose.yml
-rw-r--r-- 1 root root 281 Jul 14 20:31 Dockerfile
-rw-r--r-- 1 root root 12 Jul 14 20:30 requirements.txt
[root@docter composetest]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9b49cecffba composetest_web "flask run" 27 minutes ago Up 27 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp composetest_web_1
ffedc98d9959 redis:alpine "docker-entrypoint.s…" 27 minutes ago Up 27 minutes 6379/tcp composetest_redis_1
[root@docter composetest]# curl localhost:5000 # docker-compose 构建成功
Hello World! I have been seen 1 times.
三、docker-compose 细部讲解
1、查看镜像
[root@docter composetest]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
composetest_web latest 8cada718e4aa 35 minutes ago 184MB
redis alpine 500703a12fa4 7 days ago 32.3MB
python 3.7-alpine 93ac4b41defe 2 weeks ago 41.9MB
# docker-compose构建redis镜像自动加载成功
拓展
默认的服务名 文件名_服务名_num
多个服务器,集群 A B _num 副本数量
服务redis服务 ==》 4个副本
集群状态,服务不可能只有一个运行实例 ==》 弹性 10 HA 高并发
2、查看网络
[root@docter composetest]# docker network ls
NETWORK ID NAME DRIVER SCOPE
6a94c74d036c bridge bridge local
249dde48a683 composetest_default bridge local # 自动添加的
b0ff56aa1b35 host host local
e274cbbee51f none null local
3、查看网络细部信息
[root@docter composetest]# docker network inspect composetest_default
[
{
"Name": "composetest_default",
"Id": "249dde48a68302b57f0ce8a8640493f36ccd6ee105b1e385100b389d90b20333",
"Created": "2021-07-14T20:34:09.710827032+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"d9b49cecffbab8645b1b25daa6bbcd69a35f1307941040f7bfb733d71ee381ce": {
"Name": "composetest_web_1", # composetest_redis_1和web同一个网络
"EndpointID": "89b0c1ccc312d494cf37d96adfaccfc648f3840ab78152b3e3f79e79145a309e",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"ffedc98d9959ed4ec92b0ae9fb23ae6f40ef31513c872138ea1e27a109422182": {
"Name": "composetest_redis_1", # composetest_redis_1和web同一个网络
"EndpointID": "4f45b1b989fdcdadfcf4cc3922eace4c252539ed714e62a026cec91d5230325a",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "default",
"com.docker.compose.project": "composetest",
"com.docker.compose.version": "1.29.2"
}
}
]
# 1、10个服务 ==》项目(项目中的内容都在同一个网络下 域名访问)
# 2、如果在同哟个网络下,我们直接通过域名访问
4、停止docker-compose
# 1、docker-compose down #推荐第一种
^CGracefully stopping... (press Ctrl+C again to force)
Stopping composetest_web_1 ...
Stopping composetest_redis_1 ... done
Killing composetest_web_1 ... done
# 2、ctrl +c
5、docekr小结
1、docker镜像 run ==》容器
2、dockerfile构建镜像 (服务打包)
3、docker-compose启动项目(编排、多个微服务、环境)
4、docker网络
6、yaml规则
docker-compose-yaml # 是docker-compose核心
[root@docter composetest]# vim docker-compose.yml
version: "3.9" # 版本层
services: #服务层
web:
build: . #服务配置
ports:
- "5000:5000"
redis:
image: "redis:alpine" # 其他配置(网络、卷、全局规则)
四、docker-compose 搭建个人博客
1、下载项目(docker-compose.yml )
2、如果需要文件 Dockerfile
3、文件准备齐全(直接一键启动)
1、创建目录
[root@docter home]# mkdir my_wordpress
[root@docter home]# cd my_wordpress/
[root@docter home]# ll
drwxr-xr-x 2 root root 32 Jul 14 21:43 my_wordpress
2、编写 docker-compose.yml
[root@docter my_wordpress]# vim docker-compose.yml
version: "3.9"
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
volumes:
- wordpress_data:/var/www/html
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: {}
wordpress_data: {}
3、启动
[root@docter my_wordpress]# pwd
/home/my_wordpress
[root@docter my_wordpress]# ll
total 4
-rw-r--r-- 1 root root 646 Jul 14 21:43 docker-compose.yml
[root@docter my_wordpress]# docker-compose up #前台启动
Creating network "my_wordpress_default" with the default driver
Creating my_wordpress_db_1 ... done
Creating my_wordpress_wordpress_1 ... done
[root@docter my_wordpress]# docker-compose up -d #后台启动
Starting my_wordpress_db_1 ... done
Starting my_wordpress_wordpress_1 ... done
# 注: 必须在指定文件docker-compose.yml下启动才可以,否则启动起来是其他容器
4、测试
[root@docter my_wordpress]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e9b9aca589a wordpress:latest "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:8000->80/tcp, :::8000->80/tcp my_wordpress_wordpress_1
e2713ba9243a mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp my_wordpress_db_1
# 测试访问: http://192.168.15.30:8000
5、总结
1、未来项目只要有docker-compose文件,安装这个规则,启动编排容器
2、公司 docekr-compose 直接启动
3、网上开源项目 docker-compose 一键搞定
# 工程 服务 容器
项目compose:三层
# 1、工程 Porject
# 2、服务 服务
# 3、容器 运行实例
# 补充:
docker secret # 安全!配置密码,证书
6、扩展 Docker swarm
Docker swarm ----> k8s #docker swarm是低级别的k8s
# 集群: 4台集群 --》阿里云购买4台服务器 --》1核2G 都要安装docker
# Raft协议
# 双主双从:假设一个节点挂了,其他节点是否可以用
Raft协议:保证大多数节点存活才可以用。只要>1,集群至少大于3台
# 实验
1、docker1机器停止。宕机!双主,另外一个主节点也不能使用了!
2、可以将其他节点离开
# 总结
集群 可用 3个主节点 > 1台存活才可用
Raft协议:保证大多数节点存活,才可以用,高可用
# 弹性、扩缩容
服务, 集群中任意的节点可以访问,服务中可以有多个副本动态实现扩缩容
docekr service --help # 帮助命令
docker service update --relipcas 5 my-nginx # 扩缩容方式一
docker service scale my-nginx=5 # 扩缩容方式二
docker service rm my-nginx #移除服务
# docker swarm
命令 --》管理 --》api ---》调度--》工作节点(常见Task容器维护创建)
以上是关于linux12 - docker容器08 -->docker compose实战的主要内容,如果未能解决你的问题,请参考以下文章
linux12 - docker容器化 -->容器的相关命令
linux12 - docker容器化 --> 介绍安装镜像的使用
linux12 - docker容器06 -->发布镜像,流程小结