Docker Compose是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。
运行此命令下载docker compose的当前稳定版本:
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
对二进制文件应用可执行权限
sudo chmod +x /usr/local/bin/docker-compose
创建链接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
查看版本
docker-compose --version
构建mysql、redis、程序jar包的目录结构
mysql目录说明:
my.cnf是mysql的配置文件,不配置可以用默认的。
init目录下是业务数据库的可执行脚本,用于初始化数据库的。
data目录是存放数据的目录
redis目录说明:
redis.config是redis的配置文件
data目录是存放数据的目录
web目录说明:
dockerfile是业务系统的docker文件
frame-admin.jar是打好的包,用于制作镜像的。
dockerfile文件内容
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD frame-admin.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
往往我们在部署的时候都需要设置服务的顺序,所以我们添加一个脚本控制启动的顺序
我们在根目录下添加一个entrypoint.sh文件,内容如下。
#!/bin/bash
#set -x
#******************************************************************************
# @file : entrypoint.sh
# @author : simon
# @date : 2018-08-28 15:18:43
#
# @brief : entry point for manage service start order
# history : init
#******************************************************************************
: ${
SLEEP_SECOND:=2}
wait_for() {
echo Waiting for $1 to listen on $2...
while ! nc -z $1 $2; do echo waiting...; sleep $SLEEP_SECOND; done
}
DEPENDS=""
CMD=""
while getopts "d:c:" arg
do
case $arg in
d)
DEPENDS=$OPTARG
;;
c)
CMD=$OPTARG
;;
?)
echo "unkonw argument"
exit 1
;;
esac
done
for var in ${
DEPENDS//,/ }
do
echo $var
host=${
var%:*}
echo $host
port=${
var#*:}
echo $port
wait_for $host $port
done
eval $CMD
#避免执行完命令之后退出容器
tail -f /dev/null
这个脚本有两个参数
-d: 需要等待的服务和端口,例如:mysql:3306,redis:6379;
-c: 等待的服务和端口启动之后, 自己的启动命令,例如:java -jar app.jar
然后我们修改web程序的dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD frame-admin.jar app.jar
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x entrypoint.sh
RUN apk --no-cache add netcat-openbsd
ENTRYPOINT ["sh","/entrypoint.sh","-d","redis:6379,mysql:3306", "-c","java -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]
# yaml 配置
version: '3'
services: # 配置各种服务
web: # web服务
build: .
ports:
- "8080:8080"
networks:
- lnmp
depends_on:
- mysql
- redis
redis: # redis服务
image: redis
container_name: redis
hostname: redis
restart: always
ports:
- 6379:6379
networks:
- lnmp
volumes:
- ./redis/config/redis.conf:/etc/redis/redis.conf:rw # 挂载配置文件目录
- ./redis/data:/data:rw # 挂载数据目录
command:
redis-server /etc/redis/redis.conf --appendonly yes
mysql: # mysql服务
hostname: mysql
container_name: mysql
image: mysql:5.6 #下载镜像mysql5.6版本
restart: always
ports:
- 3306:3306
networks:
- lnmp
command: --character-set-server=utf8 #执行命令,覆盖默认命令
environment: #添加环境变量
MYSQL_ROOT_PASSWORD: 111111
MYSQL_DATABASE: zxhycloudnew
MYSQL_USER: system
MYSQL_PASSWORD: 123456
volumes:
- ./mysql/data:/var/lib/mysql # 挂载数据目录
- ./mysql/config:/etc/mysql/conf.d # 挂载配置文件目录
- ./mysql/init:/docker-entrypoint-initdb.d/ # 初始化sql目录文件目录
networks: #加入网络lnmp,引用顶级networks下条目
lnmp:
docker-compose up -d