文章目录
一、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来重新构建服务