docker-compose概述
Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务 。 —— 来自docker官网
学习最好的资料及时多去看官网!!!
Compose可在所有环境中工作:生产,登台,开发,测试以及CI工作流
使用Compose基本上是一个三步过程:
- 使用定义您的应用环境,
Dockerfile
以便可以在任何地方复制 - 定义组成应用程序的服务,
docker-compose.yml
以便它们可以在隔离的环境中一起运行 - 启动项目(
docker-compose up
)
docker-compose的安装
#速度会很慢
curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#安装完后,给docker-compose授权
cd /usr/local/bin
chmod +x docker-compose
#验证docker-compose安装且可以使用
docker-compose -v
docker-compose的配置文件介绍
docker-compose配置文件主要分为version(版本),services(服务),network,volume等都这些都属于其他类
version: '3.0' #version:语法格式的版本
services: #service:定义服务,(想要运行什么样的容器)
web:
build: . #根据Dockfile构建就镜像,也可以使用仓库的
ports: #指定映射的端口
- "5000:5000"
volumes: #挂载的容器卷
- .:/code
redis:
image: "redis:alpine"
#其他配置
network
volumes
version 版本参考官网
重点说明:
build
build 可以使用dockerfile构建新的镜像,也可以直接使用官方的images
depends on
依赖关系 web —— redis redis启动以后web再正常启动
其他所有的命令官方都有实例
https://docs.docker.com/compose/compose-file/#build
volumes
PS: volumes常用的参数说明:
type:卷的类型,可以是bind,可以是volume,还可以是其他
source: 挂载宿主机的路径、 主机上绑定挂载的路径或在顶层卷键中定义的卷的名称
target:挂载的目标路径,在容器里面的路径
read_only:容器内的卷赋予只读权限
使用volume manage类型挂载的时候必须在全局顶层分volumes指定出来,如下
networks
#可以在docker-compose.yaml自定义网络
#在services里面定义引用网络和ip,但必须在后面全局配置添加networks项
#如果没有指定网络的话,会默认生成default网路
docker-compose的基本命令
核心学习命令——docker-compose --help
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
docker-compose案例
docker-compose一键生成一个微服务
普通的容器——100个微服务 !—— 依赖关系 ——繁琐
docker-compose
来轻松高效的管理容器,定义运行多个容器
环境准备:
-
应用app.py
-
dockerfile 应用打包成为镜像
-
Docker-compose.yaml 文件(定义整个服务)完整的上线
-
启动conpose项目(docker-compose up)
docker-compose构建python应用——计数器功能, python redis
准备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)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
准备Dockerfile
FROM python:3.7-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python","app.py"]
准备requirements.txt
flask
redis
Docker-compose.yaml文件
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: "redis:alpine"
启动docker-compose.yaml
#需要在docker-compose.yaml的目录执行命令
docker-compose up
docker-compose搭建lnmp和Wordpress博客
文案参考:https://docs.docker.com/compose/wordpress/
定义项目
1. 创建一个空的项目目录
您可以将目录命名为易于记忆的名称。此目录是您的应用程序映像的上下文。该目录应仅包含用于构建该映像的资源。
该项目目录包含一个docker-compose.yml
对于初学者wordpress项目而言本身是完整的文件。
提示:您可以为此文件使用
.yml
或.yaml
扩展名,两者没有区别都可以识别
-
转到你的项目目录
cd my_wordpress/ vim docker-compose.yaml
-
创建一个
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-compose up -d
从您的项目目录运行。
这docker-compose up
将以分离模式运行,提取所需的Docker映像,并启动wordpress和数据库容器,如下例所示。
[root@docker03 my_wordpress]# docker-compose up -d
Creating network "my_wordpress_default" with the default driver
Creating volume "my_wordpress_db_data" with default driver
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
bf5952930446: Pull complete
8254623a9871: Pull complete
938e3e06dac4: Pull complete
ea28ebf28884: Pull complete
f3cef38785c2: Pull complete
894f9792565a: Pull complete
1d8a57523420: Pull complete
5f09bf1d31c1: Pull complete
1b6ff254abe7: Pull complete
74310a0bf42d: Pull complete
d398726627fd: Pull complete
Digest: sha256:da58f943b94721d46e87d5de208dc07302a8b13e638cd1d24285d222376d6d84
Status: Downloaded newer image for mysql:5.7
Pulling wordpress (wordpress:latest)...
...
7ffb0ec7cba1: Pull complete
aa525bb76055: Pull complete
eec98bc148f3: Pull complete
Digest: sha256:d009e9d0901aff685cbde728c803635f1bcaf4e1829f5921411f342ba001a3d0
Status: Downloaded newer image for wordpress:latest
Creating my_wordpress_db_1 ... done
Creating my_wordpress_wordpress_1 ... done
[root@docker03 my_wordpress]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
984644a5a2a7 wordpress:latest "docker-entrypoint.s…" 27 seconds ago Up 25 seconds 0.0.0.0:8000->80/tcp my_wordpress_wordpress_1
5b38deebd3ce mysql:5.7 "docker-entrypoint.s…" 27 seconds ago Up 26 seconds 3306/tcp, 33060/tcp my_wordpress_db_1
[root@docker03 my_wordpress]#
在Web浏览器,弹出的WordPress
此时,WordPress应该在8000
Docker主机的端口上运行,并且您可以以WordPress管理员的身份完成“著名的五分钟安装”。
如果您使用的是Mac的Docker桌面或Windows的Docker桌面,则可以将其 http://localhost
用作IP地址,并http://localhost:8000
在Web浏览器中打开。
按照步骤安装即可
关机和清理
该命令docker-compose down
将删除容器和默认网络,但会保留WordPress数据库。
该命令docker-compose down --volumes
将删除容器,默认网络和WordPress数据库。
docker-compose搭建LNMP环境
docker-compose的文件如下:
version: "3.0"
services:
nginx:
container_name: nginx
build: .
image: nginx:lnmp
ports:
- "80:80"
volumes:
- ./nginx:/etc/nginx
- ./html:/usr/share/nginx/html
depends_on:
- php
php:
container_name: php
image: php:7.2-fpm
ports:
- "9000:9000"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- mysql
mysql:
container_name: mysql
image: mysql:5.7
ports:
- "3306:3306"
volumes:
- ./mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123.com
到这儿,说明lnmp环境已经跑起来了
总结:
添加depends on
参数的时候,A depends on B 意思是:B启动后,A才可以启动
如果我们使用的是docker-compose start 开启服务的话,会按照我们定义的顺序一一开启
如果使用docker-compose stop 关闭,会按照反顺序关闭的
同dockerfile,如果我们想挂载文件使用,该文件的的位置必须其目录或在其子目录下
或者指定该文件的绝对路径
docker-compose自定义networks网络
其中php做好了mysql连接的插件,可以在./html目录下添加,添加内容参考LNMP搭建!
version: "3.0"
services:
nginx:
container_name: nginx
image: nginx:latest
ports:
- "80:80"
networks:
net:
ipv4_address: 172.10.10.11
volumes:
- ./nginx:/etc/nginx
- ./html:/usr/share/nginx/html
depends_on:
- php
php:
container_name: php
build: .
image: php:7.2
ports:
- "9000:9000"
networks:
net:
ipv4_address: 172.10.10.12
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- mysql
mysql:
container_name: mysql
image: mysql:5.7
ports:
- "3306:3306"
volumes:
- ./mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123.com
networks:
net: #(自定义网络的名字)
ipv4_address: 172.10.10.13
networks:
net:
driver: bridge
ipam:
config:
- subnet: 172.10.10.0/24