# 安装docker-compose


一、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参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。 使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。 Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。 Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。 Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)

官网:https://docs.docker.com/compose/install/

二、使用步骤

1.安装

代码如下(示例):

1.下载包:
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose 
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 查看docker-compose的版本
[root@aa ~]# docker-compose --version
docker-compose version 1.27.4, build eefe0d31

----
#手动来吧:(将这个包拖进虚拟机--》docker-compose)
mv  ~/docker-compose /usr/local/bin/docker-compose 

如果下载不下来就手动下载这个包,然后将这个包拖入到 /usr/local/bin/docker-compose 
----

2.docer-compose模板

代码如下(示例):

mkdir docker-compose
cd docekr-compose
vim docker-compose.yml

在这里插入图片描述

version: "3.2"
services: 
  nginx:
    container_name: nginx  # 指定容器的名字(即 docker ps  看到的容器名字)
    hostname: nginx # 指定容器的主机名字,(即,进入容器之后看到的容器的名字)
    build:
      # 指定nginx,dockerfile文件的上下级文件
      context: ./nginx  # 指定的是存放nginx,Dockerfile的文件的路径
      dockerfile: Dockerfile  # Dockerfile的文件的名字
    image: nginx
    ports:
      - "80:80"
    volumes:   #  用来指定容器中的数据目录与宿主机目录进行映射
      # 写入绝对路径,按照自己的指定的目录进行存储
      # ./nginx_conf:/opt/ygzy/nginx/conf/  
      #  相对路径,写一个卷的名字
      - nginx_conf:/opt/ygzy/nginx/conf/        
      - nginx_html:/opt/ygzy/nginx/html/
    networks:  # 指定容器使用的网络,默认是桥接网络
      - my_net
    depends_on:  # 指定容器的启动顺序,在指定容器之后启动(不是待指定容器全部启动,nginx才会启动,有可能有的容器启动一般,nginx 就会启动)
      - mysql  # 这个地方写的是容器的id | 服务名 (docker 面向的是容器,docker-compose 面向的是服务(service))
      - redis
      - emqx 
      - vsftpd
  mysql:
    container_name: mysql   
    command: 
      --default-authentication-plugin=caching_sha2_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
    restart: always  # 如果容器有问题就重新启动
    image: mysql:8.1
    ports:
      - "3306:3306"
    volumes:
      - mysql_conf:/etc/mysql/conf.d/
      - mysql_data:/var/lib/mysql/
      - mysql_logs:/var/log/mysql/:rw
    environment:
      - MYSQL_ROOT_PASSWORD=root   # 指定数据库root的密码,在mysql容器启动之后,要进入到mysql_data 目录下将数据删除(先关闭容器,再删除数据,然后再次重启容器,root密码便可生效)
     # 初始化数据库(后续的初始化sql会在这个库执行)
     # MYSQL_ALLOW_EMPTY_PASSWORD=yes  # root的密码设置为空
     # MYSQL_RANDOM_ROOT_PASSWORD=yes # 随机生成root的密码 (docker logs mysql 2>/dev/null | grep "GENERATED ROOT PASSWORD"  )查看随机生成的密码
      - TZ=Asia/Shanghai   # 设置时区
      - MYSQL_DATABASE=cloud  # 创建库
      - MYSQL_USER=test # 创建普通用户的用户名
      - MYSQL_PASSWORD=test@Y6516~ # 设置密码
    # env_file:  # 这种方式是将mysql的密码隐藏,在docker-compose 目录下面创建这个文件,将,上面那些数据直接写入
    #  - ./mysql.env
    networks:
      - my_net

  redis:
    container_name: redis
    command: "redis-server --appendonly yes"  # 设置redis数据持久存储
    restart: always 
    image: redis:4.0.2
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
      - redis_conf:/etc/redis.conf
    networks:
      - my_net

  emqx:
    container_name: emqx
    image: emqx/emqx:v4.0.0
    ports:
      - "18083:18083"
      - "8083:8083"
      - "1883:1883"
      - "8081:8081"
      - "8084:8084"
      - "8883:8883" 
    healthcheck:     # 设置健康检查
      test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]  
      interval: 5s
      timeout: 25s
      retries: 5
    restart: always
    environment:
     #  - EMQX_LOADED_PLUGINS="emqx_management,emqx_auth_http,emqx_dashboard"
     # 指定登陆emqx的有用户名和密码,默认就是admin 和 public
      - EMQX_DASHBOARD__DEFAULT_USER__LOGIN=admin   # 设置登陆用户,也可以是: 刘备
      - EMQX_DASHBOARD__DEFAULT_USER__PASSWORD=public
      - EMQX_NODE__MAX_PORTS=65535
      - EMQX_MQTT__MAX_PACKET_SIZE=16MB
    volumes:
     -  emqx_logs:/opt/emqx/log
   #  - /etc/localtime:/etc/localtime
    networks:
      - my_net

  vsftpd:
    container_name: vsftpd
    image: fauria/vsftpd
    ports:
      - "21:21"
      - "20:20"
      - "21100-21110:21100-21110"
    restart: always
    volumes:
      - vsftpd_conf:/etc/vsftpd/
      - vsftpd_data:/home/ 
    environment:
      - FTP_USER=sunsoft
      - FTP_PASS=123.com
      - PASV_ADDRESS=127.0.0.1
      - PASV_MIN_PORT=21100
      - PASV_MAX_PORT=21110
    networks: 
      - my_net

  jar:
    container_name: jar
    image: jdk:1.8
    ports:
      - "8082:8082"
      - "8088:8088"
    volumes:
      - jar_data:/opt/ygzy/
    networks:
      - my_net

volumes:
    nginx_conf:
    nginx_html:
      # 如果改为true表示使用自己手动创建的数据卷进行存储,必须使用命令创建一个卷(docker volume create volume-test1  (/var/lib/docker/volumes/volume-test1/_data) ) 不然启动的时候会报错,如果是false,生成的数据卷默认是(项目的名字+ 卷名) 也就是 (docker-compose_nginx_conf) 不过一般使用自动生成的就挺好
      external:
        false
    mysql_conf:
    mysql_data:
    mysql_logs:
      external:
        false
    redis_data:
    redis_conf:
      external:
        false
    emqx_logs:
      external:
        false
    vsftpd_conf:
    vsftpd_data:
      external:
        false
    jar_data:
      external:
        false

networks:
    my_net:   #  如果改为true 则 手动创建这个网卡(docker  network  create  -d  bridge my_net ),否则启动会报错
      external:
        true 

三、服务的dockerfile文件

* msyql

  • 在这里插入图片描述
FROM mysql:8.0
MAINTAINER zts
# 设置环境变量
ENV WORK_PATH /opt/ygzy/work
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
ENV FILE_1 01_init_ddl.sql
ENV FILE_2 02_init_dml.sql
ENV FILE_3 03_fsm_area.sql
ENV FILE_4
ENV INSTALL_DATA_SHELL install_data.sh
# 创建目录并导入数据
RUN mkdir -p $WORK_PATH
COPY ./$FILE_1 $WORK_PATH/
COPY ./$FILE_2 $WORK_PATH/
COPY ./$FILE_3 $WORK_PATH/
COPY ./$FILE_4 $WORK_PATH/
COPY ./$INSTALL_DATA_SHELL $AUTO_RUN_DIR
# 运行脚本
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DATA_SHELL

install_data.sh

#/bin/bash
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
use cloud;
source $WORK_PATH/$FILE_1;
source $WORK_PATH/$FILE_2;
source $WORK_PATH/$FILE_3;
source $WORK_PATH/$FILE_4;
# 用来初始化,数据库的sql语句

* jdk

在这里插入图片描述

FROM java:8
MAINTAINER zts

# 创建目录并导入数据
RUN mkdir -p /opt/ygzy/jar/org/temp/
RUN mkdir -p /opt/ygzy/jar/account/
COPY ./org/org-manager-0.0.1-SNAPSHOT-dev.jar /opt/ygzy/jar/org/
COPY ./org/application-config.yml /opt/ygzy/jar/org/
COPY ./org/application-prod.yml /opt/ygzy/jar/org/
COPY ./account/account-manager-0.0.1-SNAPSHOT-dev.jar /opt/ygzy/jar/account/
COPY ./account/application-config.yml /opt/ygzy/jar/account/
COPY ./account/application-prod.yml /opt/ygzy/jar/account/
COPY ./start.sh /opt/ygzy/jar
RUN chmod a+x  /opt/ygzy/jar/start.sh
CMD ["/opt/ygzy/jar/start.sh"]

start.sh

#!/bin/bash
#nohup  java -jar -Dspring.config.location=$WORK_PATH/org/$FILE_3,$WORK_PATH/org/$FILE_2 $WORK_PATH/org/$FILE_1 >org.log 2>&1 
nohup  java -jar -Dspring.config.location=/opt/ygzy/jar/org/application-prod.yml,/opt/ygzy/jar/org/application-config.yml /opt/ygzy/jar/org/org-manager-0.0.1-SNAPSHOT-dev.jar >org.log 2>&1 & 
nohup  java -jar -Dspring.config.location=/opt/ygzy/jar/account/application-prod.yml,/opt/ygzy/jar/account/application-config.yml /opt/ygzy/jar/account/account-manager-0.0.1-SNAPSHOT-dev.jar >acc.log 2>&1

* nginx

这个里面是自己手动部署的nginx和 jdk 也可以用官方的,根据自己情况而定

# base image 
FROM centos

# MAINTAINER
MAINTAINER zts

# create directory
RUN mkdir -p /opt/ygzy/jar/{account,org}&&\
    mkdir -p /opt/ygzy/{redis,nginx,mysql} &&\
    mkdir -p /opt/ygzy/jar/org/temp/
# Installation instructions
WORKDIR /opt/ygzy/

RUN yum -y install wget vim net-tools unzip lrzsz tar unzip openssl openssl-devel pcre-devel gcc-c++ zlib zlib-devel
# install JDk java1.8
RUN wget -P  /opt/ygzy/  https://mirrors.huaweicloud.com/java/jdk/8u191-b12/jdk-8u191-linux-x64.tar.gz
RUN cd /opt/ygzy/ && tar -zxf  jdk-8u191-linux-x64.tar.gz && rm -rf jdk-8u191-linux-x64.tar.gz 
ENV JAVA_HOME=/opt/ygzy/jdk1.8.0_191
ENV JAVA_HOME=/opt/ygzy/jdk1.8.0_191/jre
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# put nginx-16.1.tar.gz info /opt/ygzy/ and unpack /opt/ygzy/
WORKDIR /opt/ygzy/
RUN wget -P /opt/ygzy/  https://nginx.org/download/nginx-1.16.1.tar.gz
RUN cd /opt/ygzy/ &&\  
    tar -zxf nginx-1.16.1.tar.gz -C /opt/ygzy/ && rm -rf nginx-1.16.1.tar.gz  && cd /opt/ygzy/nginx-1.16.1 &&\
    ./configure --prefix=/opt/ygzy/nginx --with-http_stub_status_module --with-http_ssl_module && make &&   make install

RUN echo 'my name is zts' > /opt/ygzy/nginx/html/index.html
EXPOSE 80
EXPOSE 443
CMD ["/opt/ygzy/nginx/sbin/nginx","-g","daemon off;"]

四、docker-compose 服务(缩容)

#设置指定服务运行的容器个数,通过service=num的参数来设置数量
docker-compose scale web=3 mysql=2

语法:docker-compose up  -d --scale 容器名=个数 --no-recreate

注意:在使用伸展命令的时候我们不要指定容器名字和端口号,不然在创建的时候会出现端口和名字冲突,无法创建

vim  docker-compose.yml
version: "2"
services:
  web1:
    build: ./dockerfile
    ports:
      - "80"
    networks:
      - my_net

networks:
  my_net:
    driver: bridge
docker-compose up  -d --scale web1=3 --no-recreate        #不要创建重复的
[root@aa test]# docker-compose up  -d --scale web1=3 --no-recreate
WARNING: Found orphan containers (web3, web2, test_db_1, test_wordpress_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Creating test_web1_1 ... done
Creating test_web1_2 ... done
Creating test_web1_3 ... done

这样我们就创建了三个

#///如果想让容器变为5个------->扩展创建
[root@aa test]# docker-compose  scale web1=5 
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Starting test_web1_1 ... done
Starting test_web1_2 ... done
Starting test_web1_3 ... done
Creating test_web1_4 ... done
Creating test_web1_5 ... done

总结

docker-compose 的常用操作命令

#//查看日志信息
docker-compose logs [服务名]
docker-compose logs mysql

#//查看nginx的实时日志
docker-compose logs -f mysql                 
                         

#//不带缓存的构建
docker-compose build --no-cache {服务名}   
docker-compose build --no-cache mysql

#//关闭所有服务
docker-compose down

#//时时输出,只要有日志就会输出
docker-compose logs  -f  [服务名]

#//运行某个容器,去指定一条命令        run和exec的效果相同,都是进入容器   
docker-compose run 服务名 命令 
docker-compose run mysql ls /

#//暂停| 运行某个容器    
docker-compose pause| unpause 

#//  显示所有容器
docker-compose ps                                 

#//重新启动容器
docker-compose restart [服务名]

#//验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。 
docker-compose config  -q      

#//进入容器某个当中
docker-compose exec --index=1 服务名 /bin/bash
docker-compose exec --index=1 mysql /bin/bash

#//查看容器中的端口号映射在物理机是多少
docker-compose port --protocol=tcp 服务名 80
docker-compose port --protocol=tcp wordpress 80

#//构建(重新构建)项目中的服务容器
docker-compose build [options] [--build-arg key=val...] [SERVICE...]
选项包括:

–compress             通过gzip压缩构建上下环境
–force-rm             删除构建过程中的临时容器
–no-cache             构建镜像过程中不使用缓存
–pull                 始终尝试通过拉取操作来获取更新版本的镜像
-m, –memory MEM       为构建的容器设置内存大小
–build-arg key=val  为服务设置build-time变量
服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新构建服务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值