上一篇文章我们已经提到了如何使用docker快速将java应用发布到阿里云的仓库,这一篇我们讲一下docker-compose的应用;
上一篇链接 https://blog.csdn.net/u012357455/article/details/93629601
准备工作:安装docker-compose
官方地址 https://docs.docker.com/compose/install/,安装方法
也可以使用该方法
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
安装完成后输入
docker-compose --version
查看版本,我这里是1.21.2的版本;
理论上这样我们就ok了。
卸载命令
rm /usr/local/bin/docker-compose
下面讲解具体的dockercompose文件编写;
下面提供我的一份案例
version: '3' # 表示该 Docker-Compose 文件使用的是 Version 2 file
services:
eam-server: # 指定服务名称
image: #自己镜像的地址
restart: always
hostname: eam-server
container_name: eam-server
networks:
- cloud
ports: # 指定端口映射
- "8761:8761"
eam-config-server:
image: #自己镜像的地址
restart: always
hostname: eam-config-server
container_name: eam-config-server
volumes:
- "./entrypoint.sh:/entrypoint.sh"
environment:
SLEEP_SECOND: 5
tty: true
entrypoint: /entrypoint.sh -d eam-server:8761 -c 'java -jar -Djava.security.egd=file:/dev/./urandom /app.jar'
ports: # 指定端口映射
- "6671:6671"
networks:
- cloud
depends_on:
- eam-server
#指定网络
networks:
cloud:
driver: bridge
选择性讲一下参数的意思
其中的volumes environment 及eam-config中的 entrypoint意思是使用 entrypoint.sh脚本代替原有的dockerfile的配置
接下来贴一下entrypoint的代码
#!/bin/bash
#set -x
#******************************************************************************
# @file : entrypoint.sh
#
# @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 s; sleep $SLEEP_SECOND; done
}
declare DEPENDS
declare 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
host=${var%:*}
port=${var#*:}
wait_for $host $port
done
eval $CMD
#避免执行完命令之后退出容器
tail -f /dev/null
然后将这两份文件放在同一个目录,再给entrypoint.sh 执行权限就好了,简单点就chmod 666 entrypoint.sh;
最后执行下 docker-compose up就可以了,实测可行;
遇到的问题
standard_init_linux.go:195: exec user process caused "no such file or directory
在网上找了很久,最后找到了这篇
https://www.jianshu.com/p/ffe2b5a08897
对于我们来说,依次执行命令即可
cat -v entrypoint.sh 确认是不是这个问题
yum install dos2unix
dos2unix entrypoint.sh
再来执行一遍docker-compose up 问题解决
最后附上docker-compose的常用命令
https://www.cnblogs.com/moxiaoan/p/9299404.html
https://blog.csdn.net/skh2015java/article/details/80410306
显示容器ip
docker inspect --format='{{.Name}} - {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)