以nacos为例,程序在宿主机中的部署路径为:
/var/www/data/work/cloud/nacos
在该目录下编写容器中java程序的启动脚本start.sh:
#!/bin/bash
cmd=$1
env=prod
project_dir=/var/www/data/work/cloud/nacos
jar_name=nacos.jar
java_home=/var/www/data/JDK/JDK17.0.2
java_path=$java_home/bin/java
java_opts="-Xms128m -Xmx512m -XX:MaxHeapFreeRatio=70 -XX:ErrorFile=./logs/jvm_error.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./logs/heapdump.hprof"
#set spring config file
profile=prod
spring_profiles=--spring.profiles.active=$profile
start_cmd="${java_path} -Djava.security.egd=file:/dev/./urandom $java_opts -jar ${jar_name} ${spring_profiles}"
/usr/bin/nohup $start_cmd > ${project_dir}/logs/console.log 2>&1 &
echo "Java应用已经启动"
#防止容器退出
tail -f /dev/null
在同目录编写Dockerfile
#依赖的父镜像,此处依赖操作系统base
FROM ubuntu:22.04
#执行这个的目的是nacos做健康检查时会用到,若不做健康检查可忽略
RUN apt-get update && apt-get install -y curl telnet net-tools vim inetutils-ping
WORKDIR /var/www/data/work/cloud/nacos
#容器暴露端口
EXPOSE 8848
EXPOSE 9848
#设置时区编码
ENV TZ=Asia/Shanghai LANG=C.UTF-8 LC_ALL=C.UTF-8
#设置JAVA_HOME环境变量
ENV JAVA_HOME="/var/www/data/JDK/JDK17.0.2"
#设置PATH环境变量
ENV PATH="${PATH}:${JAVA_HOME}/bin:${JAVA_HOME}/sbin"
#执行命令
ENTRYPOINT ["/var/www/data/work/cloud/nacos/start.sh"]
在Dockerfile所在目录构建docker镜像
docker build -t nacos .
docker启动java程序
docker run -d -p 8848:8848 -p 9848:9848 -v /var/www/data:/var/www/data --name nacos nacos
容器和宿主机共享/var/www/data目录,达到共享jdk目的,容器中的日志会输出到宿主机对应目录,jar包也是依赖宿主机的jar包,后续随意升级jar包,容器随意删除,不会影响。
docker-compose启动多服务,编写docker-compose.yml
#version: '3'
services:
nacos:
image: nacos
container_name: nacos
ports:
- "8848:8848"
- "9848:9848"
environment:
TZ: Asia/Shanghai
volumes:
- /var/www/data:/var/www/data
network_mode: "bridge"
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:8848/nacos/v1/console/health/readiness" ]
#这个时间设置短了可能导致后续的程序启动失败,之前设置10秒,导致system启动后连nacos报403错误
interval: 30s
timeout: 10s
retries: 10
system:
image: system
container_name: system
ports:
- "9201:9201"
environment:
TZ: Asia/Shanghai
volumes:
- /var/www/data:/var/www/data
network_mode: "bridge"
depends_on:
nacos:
condition: service_healthy
elasticsearch:
image: elasticsearch:7.14.0
container_name: elasticsearch
ports:
- "9200:9200"
- "9300:9300"
environment:
# 设置集群名称
cluster.name: elasticsearch
# 以单一节点模式启动
discovery.type: single-node
ES_JAVA_OPTS: "-Xms512m -Xmx512m"
volumes:
- /var/www/data/work/cloud/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins
- /var/www/data/work/cloud/elk/elasticsearch/data:/usr/share/elasticsearch/data
- /var/www/data/work/cloud/elk/elasticsearch/logs:/usr/share/elasticsearch/logs
network_mode: "bridge"
kibana:
image: kibana:7.14.0
container_name: kibana
ports:
- "5601:5601"
depends_on:
# kibana在elasticsearch启动之后再启动
- elasticsearch
environment:
#设置系统语言文中文
I18N_LOCALE: zh-CN
# 访问域名
# SERVER_PUBLICBASEURL: https://kibana.cloud.com
volumes:
- /var/www/data/work/cloud/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
network_mode: "bridge"
logstash:
image: logstash:7.14.0
container_name: logstash
ports:
- "4560:4560"
volumes:
- /var/www/data/work/cloud/elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- /var/www/data/work/cloud/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
depends_on:
- elasticsearch
network_mode: "bridge"
docker-compose常用命令(命令必须在 docker-compose.yml文件所在的目录下执行。):
restart, start, stop– 启动和停止服务
# 前台启动, 启动项目中的所有服务。
$. docker-compose up
# 后台启动, 启动所有服务并在后台运行。
$. docker-compose up -d
# 停止所有服务。
$. docker-compose stop
restart
docker-compose restart重启服务容器。
docker-compose restart # 重启工程中所有服务的容器
docker-compose restart nginx # 重启工程中指定服务的容器
start
docker-compose start启动服务容器。
docker-compose start # 启动工程中所有服务的容器
docker-compose start nginx # 启动工程中指定服务的容器
stop
docker-compose stop停止服务容器。
docker-compose stop # 停止工程中所有服务的容器
docker-compose stop nginx # 停止工程中指定服务的容器
build — 构建和重构服务
# 构建服务的镜像
docker-compose build
# 如果服务镜像不存在,则构建镜像并启动服务。
docker-compose up –build
# 重构服务。
docker-compose up --force-recreate
ps, logs — 查看服务信息
# 查看项目中所有服务的信息。
docker-compose ps
# 查看容器的日志。
docker-compose logs
# 在服务镜像的容器中执行命令。
docker-compose exec service_name command
down — 删除所有容器
# 删除服务容器(容器)
docker-compose down
logs命令
# docker-compose logs 查看服务容器的输出日志。
# 默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。
# 可以通过--no-color来关闭颜色。
# 输出日志,不同的服务输出使用不同的颜色来区分
docker-compose logs
# 跟踪日志输出
docker-compose logs -f
# 关闭颜色
docker-compose logs --no-color
# 查看日志
docker-compose logs web # 参考 1.9 docker-compose.yml 文件内容
exec命令 — 进入指定容器
exec
docker-compose exec进入服务容器。
docker-compose exec nginx bash # 进入工程中指定服务的容器
docker-compose exec --index=1 nginx bash # 当一个服务拥有多个容器时,可通过 --index 参数进入到该服务下的任何容器
sudo docker-compose exec jobmanager ./bin/sql-client.sh -f sql/flink_kafka1.sql
sudo docker-compose exec jobmanager ./bin/flink list
sudo docker logs -f -t --since="2023-05-08" --tail=200 flink_taskmanager_1
sudo docker-compose logs -f taskmanager
sudo docker-compose exec jobmanager bash
sudo docker-compose exec jobmanager ./bin/flink cancel 8d8cc94d73f7bd0c4cdc557264553a04
pause, unpause命令 — 暂停, 恢复服务容器
pause
docker-compose pause暂停服务容器
docker-compose pause # 暂停工程中所有服务的容器
docker-compose pause nginx # 暂停工程中指定服务的容器
unpause
docker-compose unpause恢复服务容器。
docker-compose unpause # 恢复工程中所有服务的容器
docker-compose unpause nginx # 恢复工程中指定服务的容器
scale 命令 — 扩容缩容
docker-compose scale taskmanager=5
docker-compose up --scale web=5 -d
# -------------------------------------------- #
# docker-compose.yml内容:
version: '3'
services:
web:
build: .
networks:
- app-net
redis:
image: "redis:alpine"
networks:
- app-net
networks:
app-net:
driver: bridge
ps命令 — 查看容器列表
docker-compose ps
stop 指定容器
docker-compose stop jobmanager
docker-compose stop taskmanager
删除容器
docker-compose rm -f jobmanager
docker-compose rm -f taskmanager