学习本篇文章之前,请先了解上篇文章部署神器 – docker,一文带你从开发变运维
废话不多说,直接开始正文。

docker-compose 下载

docker-compose官网下载,然后放到liunx服务器/usr/local/bin下面,并重命名为docker-compose

#通过命令下载 最好去官网看对应的版本
wget https://github.com/docker/compose/releases/download/v2.7.0/docker-compose-linux-x86_64
#网络不行的情况 自己去官网下载
sudo mv docker-compose-linux-x86_64 /usr/bin/docker-compose

# 添加可执行权限
sudo chmod +x /usr/bin/docker-compose

最后执行docker-compose -v 测试是否安装成功

docker-compose 构建一个java进程

1.member-1.0.jar包一个,有如下接口

	@GetMapping("/hello")
    public String hello() {
        return "hello!";
    }

上传到服务器,接下来在同一目录准备Dockerfile

2.Dockerfile文件

#使用公有仓库的jdk镜像
FROM openjdk:8
#服务名称
ENV APP_NAME member
ENV XMS Xms128m
ENV XMX Xmx2048m
#环境
ENV PROFILE dev

USER root
#在镜像中创建该目录
RUN mkdir -p /app/${APP_NAME}
#设定为工作目录 相当于cd到这个目录下
WORKDIR /app/${APP_NAME}
#设置时间
ENV TZ Asia/Hong_Kong
#服务Dockerfile文件目录下的jar复制到当前目录
COPY *.jar /app/${APP_NAME}/${APP_NAME}.jar
#启动语句
CMD ["sh", "-c", "java -jar -${XMS} -${XMX} /app/${APP_NAME}/${APP_NAME}.jar --spring.profiles.active=${PROFILE}"]
  • 注意:如果挂载了目录且不想每次都重新生成镜像的,可以使用挂载的方式
FROM openjdk:8
USER root
RUN mkdir -p /app/member-service
WORKDIR /app/member-service
ENV TZ Asia/Hong_Kong
#只写了启动命令,其他通过挂载共享进容器
CMD ["sh", "-c", "java -jar -Xms128m -Xmx2048m /app/member-service/member-1.0.jar --spring.profiles.active=test"]

3.生成镜像

在jar目录,也就是Dockerfile目录下执行

#build一个镜像,相当于打包 . 表示生成镜像的Dockerfile目录
docker build -t member-image .
#查看镜像是否成功
docker images | grep member-image

如果出现生成镜像失败,请检查Dockerfile文件

4.准备docker-compose.yaml文件

version: '3.7'
services:
  member01:
    #镜像名
    image: member-image
    #容器名
    container_name: member01
    #端口映射
    ports:
    - "8080:8080"
	#日志目录挂载
    volumes:
    - /root/member/logs:/app/member/logs
	#如果Dockerfile只有启动命令时,就需要把Jar也挂载过去,后续更新不用删除容器
    #- /root/member:/app/member
	#单独创建的网络
    networks:
    - my-net
networks:
  my-net:
    external: true

5.启动容器

#启动容器
docker-compose up -d
#查看容器
docker-compose ps

  Name          Command        State           Ports         
-------------------------------------------------------------
member01   sh ./bin/start.sh   Up      0.0.0.0:8080->8080/tcp

6.访问

http://192.168.0.220:8080/hello,可以看到正常输出“hello”

同时部署多个服务,以及服务间的内网访问

docker-compose.yaml

version: '3.7'
services:
  member01:
    image: member-image
    container_name: member01
    #端口映射
    ports:
    - "8080:8080"
	#日志目录挂载
    volumes:
    - /root/member/logs:/app/member/logs
	#单独创建的网络
    networks:
    - my-net
  nginx01:
    #从公网直接获取的镜像 默认不填版本号就拉最新的也就是 nginx:latest
    #如果需要其他版本好的格式为 nginx:1.19.7
    image: nginx
    container_name: nginx01
    #端口映射
    ports:
    - "80:80"
	#单独创建的网络
    networks:
    - my-net
networks:
  my-net:
    external: true

执行 docker-compose up -d就可启动成功了,同时启动了两个服务

关于内网访问,我们可以这样试。在上面刚创建的两个服务,我们进入到java服务所在的容器:

#进入容器
docker exec -it member01  /bin/sh
#我们在java的容器中ping一下nginx
ping nginx01

可以正常ping通,反之一样。不过需要保证两者在一个网络下,或者直接采用的是宿主机网络

以上就是docker-compose –- 单机多容器神器的全部内容了。

下一篇:Java 集合 – List接口实现之ArrayList、LinkedList源码分析

心若不老,学习不停

Logo

更多推荐