Docker Compose

为什么需要使用Docker Compose

Docker Compose 容器编排技术

1、现在我们有一个springboot项目,需要依赖Redis、mysql、nginx。

如果使用docker原生部署的话,则需要安装Redis、mysql、nginx容器,才可以启动我们springboot项目,这样的话部署项目的流程非常复杂,所以需要引入我们的

Docker compose实现容器编排技术。

基本的概念

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。

Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

Compose 中有两个重要的概念:

服务 (service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

项目 (project) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

Docker-Compose 的配置文件

Docker-Compose 的工程配置文件默认为 docker-compose.yml,可通过环境变量COMPOSE_FILE 或 -f 参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器

Docker-Compose 配置常用字段

文档地址:https://docs.docker.com/compose/compose-file/compose-file-v3/

  • build 指定 Dockerfile 文件名,要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
  • dockerfile 构建镜像上下文路径
  • context 可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
  • image 指定镜像
  • command 执行命令,覆盖默认命令
  • container name 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法 scale
  • deploy 指定部署和运行服务相关配置,只能在 Swarm 模式使用
  • environment 添加环境变量
  • networks 加入网络
  • ports 暴露容器端口,与 -p 相同,但端口不能低于 60
  • volumes 挂载宿主机路径或命令卷
  • hostname 容器主机名
  • restart 重启策略,默认 no,always,no-failure,unless-stoped

1.no,默认策略,在容器退出时不重启容器

2.on-failure,在容器非正常退出时(退出状态非0),才会重启容器

3.on-failure:3,在容器非正常退出时重启容器,最多重启3次

4.always,在容器退出时总是重启容器

5.unless-stopped,在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器

安装docker-compose

从GitHub上下载

java 复制代码
官网文档:https://docs.docker.com/compose/install/
https://github.com/docker/compose/releases
下载版本:docker-compose-linux-x86_64
放到目录:/usr/local/bin/ 修改文件名:docker-compose

这里已经上传到CSDN一份了

https://download.csdn.net/download/zhou9898/87490141

添加可执行权限

java 复制代码
chmod +x /usr/local/bin/docker-compose

docker-compose常用命令

java 复制代码
docker-compose -h                           # 查看帮助
 
docker-compose up                           # 创建并运行所有容器
docker-compose up -d                        # 创建并后台运行所有容器
docker-compose -f docker-compose.yml up -d  # 指定模板
docker-compose down                         # 停止并删除容器、网络、卷、镜像。
 
docker-compose logs       # 查看容器输出日志
docker-compose pull       # 拉取依赖镜像
dokcer-compose config     # 检查配置
dokcer-compose config -q  # 检查配置,有问题才有输出
 
docker-compose restart   # 重启服务
docker-compose start     # 启动服务
docker-compose stop      # 停止服务
 
docker-compose ps  列出项目中所有的容器
docker-compose logs  查看容器中日志信息
  1. 需要定义一个docker-compose.yml文件----工程

  2. 需要在docker-compose文件配置依赖服务

  3. docker-compose up 执行该文件

  4. 创建一个docker-compose.yml;

  5. 定制docker-compose 内容;

  6. 运行 docker-compose up ;

docker-compose 部署项目

创建docker-compose.yml

java 复制代码
version: '3.3'
services:
  mp:
    build: .
    image: mp # Dockerfile构建的镜像
    ports:
      - "8080:8080"

启动

java 复制代码
docker-compose up -d # 创建并后台运行所有容器

docker-compose配合Dockerfile使用

Dockerfile文件

java 复制代码
FROM openjdk:11
MAINTAINER zqd   # 作者
ADD boot02-1.0-SNAPSHOT.jar /boot02.jar
ENTRYPOINT ["nohup","java","-jar","/boot02.jar","&"]
EXPOSE 8080
java 复制代码
version: '3.3'
services:
  boot02:
    build: 
        context: /home/
        dockerfile: Dockerfile
    container_name: boot02
    ports:
      - "8080:8080"

docker-compose 安装redis

一、 docker 拉去最新版本的redis

java 复制代码
docker pull redis:6.0.6 #后面可以带上tag号, 默认拉取最新版本

二、 docker安装redis

执行命令:

java 复制代码
mkdir -p /data/redis/conf
cd /data/redis/conf

新增配置文件

vim /data/redis/conf/redis.conf

内容只有如下这些:

java 复制代码
#开启保护
protected-mode yes
#开启远程连接 
#bind 127.0.0.1 
#自定义密码
requirepass 12345678 
port 6379
timeout 0
# 900s内至少一次写操作则执行bgsave进行RDB持久化
save 900 1 
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /data
appendonly yes
appendfsync everysec

保存退出

参数说明

1.修改保护模式protected-mode yes 默认为yes 可以跳过这一步

Redis protected-mode属性解读

设置外部网络连接redis服务,设置说明如下:

a.关闭protected-mode模式,此时外部网络可以直接访问

b.开启protected-mode保护模式,需配置bind ip 和设置访问密码 redis3.2版本后新增protected-mode配置,默认是yes,即开启。

2.把bind 127.0.0.1 注释掉 #bind 127.0.0.1, 这样所有的ip都可以访问了

3.设置密码(根据自己的需要)

4.appendonly yes #开启AOF模式

三、编写 docker-compose.yaml文件

java 复制代码
cd /data/redis
vim docker-compose.yml

写入下面的内容

java 复制代码
version: '3.8'
services:
  myredis:
    container_name: myredis
    image: redis:6.0.6
    restart: always
    ports:
      - 6379:6379
    privileged: true
    command: redis-server /etc/redis/redis.conf --appendonly yes
    volumes:
      - /data/redis/data:/data
      - /data/redis/conf/redis.conf:/etc/redis/redis.conf
    networks:
      - myweb

networks:
  myweb:
    driver: bridge

说明:

/etc/redis/redis.conf为容器里的目录

启动前的目录结构

java 复制代码
yum -y install tree
java 复制代码
[root@localhost redis]# pwd
/usr/local/docker/redis

[root@localhost redis]# tree
.
├── conf
│   └── redis.conf
├── data
│   └── appendonly.aof
└── docker-compose.yml

2 directories, 3 files

四、启动容器

java 复制代码
docker-compose up -d

到这里就ok了,

启动后的目录结构

java 复制代码
[root@localhost redis]# tree
.
├── conf
│   └── redis.conf
├── data
│   └── appendonly.aof
└── docker-compose.yml

2 directories, 3 files

docker-compose 安装mysql

java 复制代码
mkdir -p /data/mysql
cd /data/mysql

新建一个文件

java 复制代码
vim docker-compose.yml
java 复制代码
version: '3'
services:
  mysql:
    image: mysql
    restart: always
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M;
    ports:
      - 3306:3306
    volumes:
      - /data/mysql/data:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro

默认数据库是账号是root

密码自己修改 MYSQL_ROOT_PASSWORD

保存

启动运行

java 复制代码
docker-compose up -d

docker-compose 安装nginx

创建目录

根据自己的需要存放位置

java 复制代码
mkdir -p /data/nginx
mkdir -p /data/nginx/conf.d
mkdir -p /data/nginx/log
mkdir -p /data/nginx/conf

docker-compose.yml

vim /data/nginx/docker-compose.yml

java 复制代码
version: '3'
services:
  nginx:
    restart: always
    image: nginx
    ports:
      - 80:80
      - 443:443
    volumes:
      - /data/nginx/conf.d:/etc/nginx/conf.d
      - /data/nginx/log:/var/log/nginx
      - /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /data/nginx/html:/usr/share/nginx/html
      - /etc/letsencrypt:/etc/letsencrypt

为应用存放位置(该目录下要有 index.html)

java 复制代码
mkdir -p /data/nginx/html
vim /data/nginx/html/index.html

nginx相关配置

vim /data/nginx/conf.d/my.conf

java 复制代码
server {  
   listen 80;
   server_name localhost;

    location / {
        root   /usr/share/nginx/html;
        index index.html index.htm;
     }
}

vim /data/nginx/conf/nginx.conf

java 复制代码
user  root;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

启动

java 复制代码
cd /data/nginx
docker-compose up -d

访问

主页可能是centos欢迎页,需要替换,或者访问具体index.html

docker-compose批量部署

1、在docker-compose中构建Dockerfile

java 复制代码
cd /data
java 复制代码
build: 
    context: /home/df02 # 指定dockerfile目录
    dockerfile: Dockerfile # 指定dockerfile文件名

vim docker-compose.yml

java 复制代码
version: '3'
services:
  boot02:
    build: 
        context: /home/df02
        dockerfile: Dockerfile
    container_name: boot02
    ports:
      - "8080:8080"

  myredis:
    container_name: myredis
    image: redis:6.0.6
    restart: always
    ports:
      - 6379:6379
    privileged: true
    command: redis-server /etc/redis/redis.conf --appendonly yes
    volumes:
      - /data/redis/data:/data
      - /data/redis/conf/redis.conf:/etc/redis/redis.conf
    networks:
      - myweb

  mysql:
    image: mysql
    restart: always
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M;
    ports:
      - 3306:3306
    volumes:
      - /data/mysql/data:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro

  nginx:
    container_name: nginx
    restart: always
    image: nginx
    ports:
      - 80:80
      - 443:443
    volumes:
      - /data/nginx/conf.d:/etc/nginx/conf.d
      - /data/nginx/log:/var/log/nginx
      - /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /data/nginx/html:/usr/share/nginx/html
      - /etc/letsencrypt:/etc/letsencrypt

networks:
  myweb:
    driver: bridge
相关推荐
ThetaarSofVenice1 分钟前
Java从入门到放弃 之 泛型
java·开发语言
嘟嘟Listing9 分钟前
jenkins docker记录
java·运维·jenkins
it噩梦10 分钟前
使用EFK收集k8s日志
容器·kubernetes
WHabcwu15 分钟前
统⼀异常处理
java·开发语言
zaim116 分钟前
计算机的错误计算(一百六十三)
java·c++·python·matlab·错数·等价算式
枫叶丹416 分钟前
【在Linux世界中追寻伟大的One Piece】多线程(一)
java·linux·运维
2401_8543910817 分钟前
Spring Boot OA:企业数字化转型的利器
java·spring boot·后端
山山而川粤24 分钟前
废品买卖回收管理系统|Java|SSM|Vue| 前后端分离
java·开发语言·后端·学习·mysql
栗豆包27 分钟前
w053基于web的宠物咖啡馆平台的设计与实现
java·struts·spring·tomcat·maven·intellij-idea
weixin_446707741 小时前
IDEA2024 maven构建跳过测试
java·maven