一、Docker Compose介绍
Docker-Compose是Docker官方的开源项目,负载实现对Docker容器集群的快速编排。作用是定义及运行多个Docker容器
Docker-Compose非常适合使用多个容器进行开发的场景
Docker-Compose允许用户通过一个单独的docker-compose.yml模板文件来定义一组相关联的应用容器为一个项目,它有2个重要的概念
# 服务(service):一个应用容器,实际上包括若干个应用容器实例。在docker-compose.yml中定义
# 项目(project):由一组关联的应用容器组成的一个完整业务单元,一个dokcer-compose.yml文件就代表一个项目
二、YAML文件格式编写注意事项
2.1、YAML文件格式
YAML是一种标记性语言,它可以很直观的展示数据序列化格式,可读性高。
YAML数据结构通过缩进来表示,连续的项目通过“-”来表示,键值对用:分隔,数组用中括号[]括起来,bash用花括号{ }括起来
2.2、YAML文件格式注意事项
不支持制表符tab键缩进,只能使用空格所经
通常开头缩进2个空格
字符后缩进一个空格,如冒号【:】、逗号【,】、横杠【-】
用#号表示注释
如果包含特俗字符用单引号【’ ‘】引起来作为普通字符,如果用双引号【“ ”】表示特殊字符本身的意思
布尔值必须用【“ ”】括起来,如yes或no
YAML区分大小写
三、Docker-Compose使用
3.1、Docker-compose配置常用字段
3.2、Docker-compose常用命令
运行这些命令需要结合docker-compose一起使用
且必须要在含有docker-compose.yml文件的目录中才可以使用,不然会报错
运行容器
# 前台运行
docker-compose up
# 后台运行
docker-compose up -d
# 重启构建运行
docker-compose up --build -d
关闭容器
# 关闭指定容器
docker-compose stop <容器名称>
示例
docker-compose stop nginx
# 全部关闭
docker-compose stop
启动容器
# 启动指定容器
docker-compose start <容器名称>
示例
docker-compose start nginx
# 全部启动
docker-compose start
删除
docker-compose down
3.3、使用Docker-compose步骤
编写Dockerfile文件,定义应用程序的环境
编写docker-compose.yml,定义应用程序的服务,以便他们可以在隔离的环境中一起运行
运行docker-compose up 启动并运行整个应用程序
四、安装Docker-compose
4.1、方法一
从github网站上下载Docker-compose二进制文件安装
[root@docker-01 ~]# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 国内访问太慢,不推荐使用
4.2、方法二
从阿里云镜像站下载Docker-compose二进制文件安装
# 下载阿里云docker-compose二进制文件
curl -L https://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
# 添加可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看docker-compose版本
docker-compose -v
五、使用Docker-compose部署LNMP平台
5.1、创建工作目录
# 创建项目目录
[root@docker-01 ~]# mkdir -p /opt/lnmp
# 创建服务项目
[root@docker-01 ~]# mkdir -p /opt/lnmp/nginx
[root@docker-01 ~]# mkdir -p /opt/lnmp/mysql/conf
[root@docker-01 ~]# mkdir -p /opt/lnmp/mysql/data
[root@docker-01 ~]# mkdir -p /opt/lnmp/php
# 创建测试网络目录
[root@docker-01 ~]# mkdir -p /opt/lnmp/wwwroot
5.2、编写docker-compose.yml文件
[root@docker-01 ~]# cd /opt/lnmp/
[root@docker-01 lnmp]# vim docker-compose.yml
# 定义docker-compose版本
version: "3"
# 定义服务
services:
# 定义一个nginx服务
nginx:
# nginx容器主机名
hostname: nginx
build:
# 指定nginx,Dockerfile文件上下文
context: ./nginx
# 定义dockerfile文件的名字
dockerfile: Dockerfile
# 暴露端口,将本机的80端口映射为容器的80端口,与run命令中的-p选项一样意思
ports:
- "80:80"
# 连接php容器
links:
- php
# 定义容器数据卷挂载
volumes:
- ./wwwroot:/usr/local/nginx/html
php:
hostname: php
build: ./php
links:
- mysql
volumes:
- ./wwwroot:/usr/local/nginx/html
mysql:
hostname: mysql
image: mysql:5.7.34
ports:
- "3306:3306"
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
# 添加环境变量,主要是设置一下数据库root密码
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
MYSQL_USER: user
MYSQL_PASSWORD: user123
5.3、检测docker-compose.yml文件语法
语法校验工具:docker-compose config
# 若文件语法正确则显示配置信息,若语法错误显示错误原因
docker-compose config
5.4、上传文件
# 把对应的dockerfile文件、nginx软件包、php软件包、测试网络上传到对应的目录下
5.5、查看文件目录
[root@docker-01 lnmp]# tree /opt/lnmp/
/opt/lnmp/
├── docker-compose.yml
├── mysql
│ ├── conf
│ │ └── my.cnf
│ └── data
├── nginx
│ ├── Dockerfile
│ ├── nginx-1.16.0.tar.gz
│ └── nginx.conf
├── php
│ ├── Dockerfile
│ ├── libzip-1.2.0.tar.gz
│ └── php-7.3.9.tar.gz
└── wwwroot
├── index.html
└── test.php
6 directories, 10 files
5.6、创建并后台启动容器
# 必须在docker-compose.yml文件所在目录执行
[root@docker-01 lnmp]# docker-compose -f docker-c
-f:指定项目文件(可以省略)
-d:代表后台启动 不加代表前台启动
5.7、查看所有容器运行状态
[root@docker-01 lnmp]# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------
lnmp_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp
lnmp_nginx_1 /usr/local/nginx/sbin/ngin ... Up 0.0.0.0:80->80/tcp,:::80->80/tcp
lnmp_php_1 /bin/sh -c /etc/init.d/php ... Up 9000/tcp
5.8、查看所有容器镜像
[root@docker-01 lnmp]# docker-compose images
Container Repository Tag Image Id Size
-----------------------------------------------------------
lnmp_mysql_1 mysql 5.7.34 09361feeb475 426 MB
lnmp_nginx_1 lnmp_nginx latest e2da6042a3b4 548 MB
lnmp_php_1 lnmp_php latest a837db37e73c 1.44 GB
5.9、访问测试
5.10、进入容器
# 查看所有容器状态
[root@docker-01 lnmp]# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------
lnmp_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp
lnmp_nginx_1 /usr/local/nginx/sbin/ngin ... Up 0.0.0.0:80->80/tcp,:::80->80/tcp
lnmp_php_1 /bin/sh -c /etc/init.d/php ... Up 9000/tcp
# 进入服务容器
[root@docker-01 lnmp]# docker-compose exec nginx bash
5.11、停止容器
# 停止nginx容器
[root@docker-01 lnmp]# docker-compose stop nginx
# 停止所有容器
[root@docker-01 lnmp]# docker-compose stop
5.12、查看容器日志
[root@docker-01 lnmp]# docker-compose logs -t -f nginx
# 选项解释
-t:输出时间
-f:实时输出
5.13、删除所有容器、网络、镜像、数据卷
# 删除所有容器、网络(不删除数据卷)
[root@docker-01 lnmp]# docker-compose down
# 删除所有容器、网络、镜像
[root@docker-01 lnmp]# docker-compose down --rmi all
# 删除所有容器、网络、数据卷
[root@docker-01 lnmp]# docker-compose down -v
六、扩展命令
# 手动构建或重新构建服务
docker-compose build
# 查看容器进程
docker-compose stop nginx
# 暂停容器
docker-compose pause nginx
# 恢复容器
docker-compose unpause nginx
# 停止容器
docker-compose kill nginx
# 重启所有容器
docker-compose restart
# 重启nginx容器
docker-compose restart nginx
七、Docker-compose额外示例
# 创建项目目录
[root@docker-01 ~]# mkdir demo
[root@docker-01 ~]# cd demo/
# 创建nginx工作目录
[root@docker-01 demo]# mkdir nginx
# 下载nginx源码包到nginx目录下
[root@docker-01 demo]# wget -P nginx/ http://nginx.org/download/nginx-1.15.2.tar.gz
# 创建nginx的Dockerfile文件
[root@docker-01 demo]# cat nginx/Dockerfile
FROM centos:7.6.1810
RUN yum -y install gcc make pcre-devel zlib-devel tar zlib
ADD nginx-1.15.2.tar.gz /usr/src/
RUN cd /usr/src/nginx-1.15.2 \
&& mkdir /usr/local/nginx \
&& ./configure --prefix=/usr/local/nginx && make && make install \
&& ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
RUN rm -rf /usr/src/nginx-1.15.2
EXPOSE 80
EXPOSE 443
CMD ["nginx","-g","daemon off;"]
# 创建mysql工作目录
[root@docker-01 demo]# mkdir mysql
# 创建mysql的Dockerfile文件
[root@docker-01 demo]# cat mysql/Dockerfile
# 指定基础镜像
FROM mysql:5.7
# 修改编码方式
RUN echo "character-set-server=utf8" >> /etc/mysql/mysql.conf.d/mysqld.cnf
EXPOSE 3306
[root@docker-01 demo]# echo 'MYSQL_ROOT_PASSWORD=root' > mysql/mysql.env
# 创建项目文件docker-compose.yaml
[root@docker-01 demo]# cat docker-compose.yaml
# 指定docker-compose版本
version: "3"
# 定义服务,此处定义了两个服务一个nginx一个redis
services:
nginx:
# 指定nginx构建镜像上下文路径
build: ./nginx
# 启动nginx之前先启动redis和mysql
depends_on:
- redis
- mysql
# 指定暴露的端口,也就是端口映射
ports:
- "80:80"
redis:
# 使用公用redis镜像创建容器
image: "redis:alpine"
ports:
- "6379:6379"
mysql:
# 指定构建镜像上下文路径
build:
context: ./mysql
dockerfile: Dockerfile
# 从文件中添加环境变量
env_file:
- ./mysql/mysql.env
ports:
- "3306:3306"
# 检查docker-compose文件语法
[root@docker-01 demo]# docker-compose config
# 运行docker-compose
[root@docker-01 demo]# docker-compose up -d
# 查看容器运行情况
[root@docker-01 demo]# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------
demo_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp
demo_nginx_1 nginx -g daemon off; Up 443/tcp, 0.0.0.0:80->80/tcp,:::80->80/tcp
demo_redis_1 docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp,:::6379->6379/tcp
评论区