目录
Docker-Compose介绍
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件(通常命名为 docker-compose.yml),你可以配置应用程序所需的服务、网络和卷,并使用单个命令启动或停止所有服务。
主要功能
多容器管理:允许你在一个文件中定义多个容器,并指定它们之间的关系。
服务依赖:可以定义服务之间的依赖关系,确保服务按正确顺序启动。
环境变量:支持通过环境变量配置服务。
网络配置:自动创建和管理容器间的网络。
卷管理:支持数据卷的创建和管理,确保数据持久化。
一键部署:通过 docker-compose up 和 docker-compose down 命令快速启动和停止所有服务。
核心概念
服务 (Service):一个容器化的应用,如 Web 服务器或数据库。
项目 (Project):由一组关联服务组成的应用,通常对应一个 docker-compose.yml 文件。
网络 (Network):定义容器间的通信方式。
卷 (Volume):用于持久化存储数据。
Dockerfile 和 Docker Compose 是 Docker 生态中的两个关键工具,功能互补。
Dockerfile
用途:用于定义单个容器的镜像构建过程。
内容:包含基础镜像、安装软件、配置环境等指令。
输出:生成一个 Docker 镜像。
Docker Compose
用途:用于定义和管理多容器应用。
内容:包含服务、网络、卷等配置。
输出:启动和管理多个容器。
下载Docker-compose
首先确保我们机器已经安装了Docker,安装完Docker之后,获取Docker-compose的执行文件,并将其放在/use/local/bin目录下,赋予执行权限:
[root@docker ~]# 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@docker ~]# chmod +x /usr/local/bin/docker-compose
[root@docker ~]# docker-compose version
docker-compose version 1.21.1, build 5a3f1a3
docker-py version: 3.3.0
CPython version: 3.6.5
OpenSSL version: OpenSSL 1.0.1t 3 May 2016
详细学习Docker-compose
Docker-compose模版:
version: '3.7' # Compose 文件的版本
services: # 定义应用中的所有服务
web: # 服务名称
image: nginx:latest # 使用的镜像
ports: # 映射端口
- "80:80" # 主机端口:容器端口
常用参数解读
version | Docker Compose文件的版本指定Compose文件格式版本(必选) |
services | 定义一个或多个服务,每个服务表示一个容器 |
build | 指定构建镜像的上下文,通常为DockerFile的文件目录 |
image | 使用的镜像名称,如果本地不存在会自动拉取 |
container_name | 设置容器的名称 |
environment | 设置环境变量,容器启动时使用的环境变量 |
ports | 将容器端口映射为主机端口 |
volumes | 持久化数据和挂载目录或文件到容器中 |
depends_on | 定义容器之间的依赖关系,确保依赖的服务在主服务之前启动 |
networks | 配置服务连接到的网络 |
restart | 配置容器的重启策略 |
links | 将当前服务与其他服务进行连接 |
version
Docker Compose 文件的版本,用于指定 Compose 文件格式的版本决定了哪些功能和选项可用。不同版本的 Compose 文件支持不同的特性。(必选)
services
这是 Compose 文件的核心部分。每个 service 定义了一个容器。你可以在 services 中定义多个服务,每个服务会启动一个容器实例。(必选)
build
用于定义构建镜像的上下文(通常是 Dockerfile 的路径)。你可以使用这个字段来指定一个目录,Compose 会根据这个目录中的 Dockerfile 来构建镜像。(可选项,除非要使用DockerFile构建镜像)
image
指定服务使用的 Docker 镜像。如果指定的镜像在本地不存在,Docker Compose 会尝试从 Docker Hub 或其他注册表中拉取。(必选)
container_name
指定容器的名称。默认情况下,Docker 会为容器生成一个随机名称。使用 container_name 可以自定义容器名称。(可选项)
environment
用于设置容器的环境变量。可以通过这个字段定义一个或多个环境变量,这些环境变量会在容器启动时传递给应用。(可选项)
ports
将容器内的端口映射到宿主机的端口上,使得外部可以访问容器的服务。(可选项)
(- “8080:80” 前主机后容器)
volumes
用于持久化数据或挂载宿主机的文件到容器中。通常用于持久化数据库数据、配置文件等,避免容器删除时丢失数据。(可选项)
depends_on
用于指定服务间的依赖关系,确保依赖的服务在主服务启动之前启动。虽然它可以指定启动顺序,但它不等待依赖服务的健康检查完成。(可选项)
networks
定义容器连接到的网络。通过 networks,可以让服务在同一个网络中进行通信。如果没有明确指定网络,Docker Compose 会为所有服务创建一个默认网络。(可选项)
restart
设置容器的重启策略。当容器退出或崩溃时,Docker 可以根据设定的策略重新启动它。
links
在 Docker Compose 的旧版本中,links 用于连接不同服务的容器,使一个容器能够通过另一个容器的名称进行通信。(已废弃,推荐使用 networks)
实例应用
[root@docker docker-compose]# cat docker-compose.yaml
version: "3.3"
services:
mysql:
image: mysql:5.7
container_name: mysql
ports:
- "3306:3306"
volumes:
- /root/mysql/mysql.conf:/etc/mysql/conf.d/
- /root/mysql/logs:/logs
- /root/mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
networks:
- ems
depends_on:
- redis
redis:
image: redis:4.0
container_name: redis
ports:
- "6379:6379"
networks:
- ems
volumes:
- /root/redis/data:/data
networks:
ems:
driver: bridge
[root@docker docker-compose]# docker-compose up -d
Creating network "docker-compose_ems" with driver "bridge"
Creating redis ... done
Creating mysql ... done
[root@docker docker-compose]# docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------------
mysql docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp
redis docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp,:::6379->6379/tcp
测试登陆数据库:
[root@docker ~]# docker exec -it mysql /bin/bash
bash-4.2# mysql -uroot -proot #变量生效
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.44 MySQL Community Server (GPL)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases; #登录成功测试
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql>
容器化编排部署博客系统
镜像准备:
[root@docker docker-compose]# docker images
\REPOSITORY TAG IMAGE ID CREATED SIZE
blog-nginx v1.0 d02e6e8b7600 5 minutes ago 573MB
blog-service v1.0 cdf22652c27d 23 minutes ago 1.98GB
blog-memcached v1.0 8ed18fbac5b2 2 hours ago 609MB
blog-mysql v1.0 6cfb28a9d85d 19 hours ago 1.07GB
#使用DockerFile构建镜像
编排博客系统:docker-compose.yaml文件:
version: '3.3'
services:
memcached:
restart: always
image: blog-memcached:v1.0
container_name: blog-memcached
ports:
- "11211:11211"
db:
restart: always
image: blog-mysql:v1.0
container_name: blog-mysql
environment:#环境变量
- MYSQL_DATABASE=djangoblog
- MYSQL_ROOT_PASSWORD=root
ports:
- 3306:3306
depends_on:#依赖
- memcached
djangoblog:
restart: always
image: blog-service:v1.0
container_name: blog-service
ports:
- "8000:8000"
environment:#环境变量
- DJANGO_MYSQL_DATABASE=djangoblog
- DJANGO_MYSQL_USER=root
- DJANGO_MYSQL_PASSWORD=root
- DJANGO_MYSQL_HOST=db
- DJANGO_MYSQL_PORT=3306
- DJANGO_MEMCHACED_LOCATION=memcached:11211
links:#连接
- db
- memcached
depends_on:#依赖
- db
command: nginx #启动nginx作为前端
nginx:
restart: always #重启策略
image: blog-nginx:v1.0
container_name: blog-nginx
command: nginx -g "daemon off;" #执行命令
ports:
- "8888:80"
- "443:443"
links:
- djangoblog:djangoblog #连接
测试:
[root@docker docker-compose]# docker-compose up -d
Creating network "docker-compose_default" with the default driver
Creating blog-memcached ... done
Creating blog-mysql ... done
Creating blog-service ... done
Creating blog-nginx ... done
[root@docker docker-compose]# docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------------------------------
blog-memcached /bin/sh -c /usr/bin/memcac ... Up 0.0.0.0:11211->11211/tcp,:::11211->11211/tcp
blog-mysql mysqld_safe --user=root Up 0.0.0.0:3306->3306/tcp,:::3306->3306/tcp
blog-nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp,:::443->443/tcp,
0.0.0.0:8888->80/tcp,:::8888->80/tcp
blog-service /code/djangoBlog/bin/docke ... Up 0.0.0.0:8000->8000/tcp,:::8000->8000/tcp
[root@docker docker-compose]# curl -L http://192.168.100.100:8888 | grep title
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 6528 100 6528 0 0 455k 0 --:--:-- --:--:-- --:--:-- 490k
<title>djangoblog | 基于Django的博客系统</title>
<meta property="og:title" content="djangoblog"/>
<link rel="alternate" type="application/rss+xml" title="djangoblog » Feed"
<h1 class="site-title"><a href="/" title="djangoblog" rel="home">djangoblog</a>
<a class="assistive-text" href="#content" title="跳至正文">跳至正文</a>
<aside id="text-2" class="widget widget_text"><p class="widget-title">欢迎您star或者fork本站源代码</p>
<aside id="meta-3" class="widget widget_meta"><p class="widget-title">功能</p>
<div id="rocket" class="show" title="点我返回顶部"></div>
<a href="/sitemap.xml" title="SiteMap" target="_blank">
<a href="/feed" title="RSS Feed" target="_blank">
<a href="/links.html" title="友情链接" rel="nofollow" target="_blank">