基础镜像先使用官方的openjdk:11镜像,之后看情况自制对应的镜像。
拉取镜像
docker pull openjdk:11
默认是Debian的大小为654MB,需要自制成Centos7的。
制作CentOs7镜像
拉取CentOs:7.9.2009镜像
docker pull centos:7.9.2009
Dockerfile文件
# 基础镜像
FROM centos:7.9.2009
# 创建java文件所放目录
RUN mkdir /usr/local/java
# 将jdk压缩文件复制到镜像中,它将自动解压缩tar文件
ADD jdk-11.tar.gz /usr/local/java/
# 设置环境变量
ENV JAVA_HOME /usr/local/java/jdk-11
ENV PATH $JAVA_HOME/bin:$PATH
生成镜像
docker build -t openjdk-centos7:11 .
生成镜像大小为604MB
微服务镜像
整体目录结构如下:
├── .env
├── docker-compose.yml
├── Dockerfile
└── service
├── aec-service-user-1.0.jar
├── config
│ ├── application-mqtt.yml
│ ├── application-rabbitmq.yml
│ ├── application-service.yml
│ ├── application-user.yml
│ └── application.yml
├── service-name
├── start.sh
└── stop.sh
制作微服务镜像
Dockerfile文件内容如下:
# 基础镜像
FROM openjdk-centos7:11
# 创建工作目录
RUN mkdir -p /home/data/service
# 拷贝文件到指定目录下
COPY service /home/data/service
# 容器工作目录
WORKDIR /home/data/service
# 启动命令
CMD ["sh", "start.sh"]
启动脚本start.sh
## 其中启动脚本内容如下:
#!/bin/sh
FOLDER_PATH=/home/data/service
cd $FOLDER_PATH
JAR_NAME=`cat service-name`
## ${PARAMS}为通过docker传入的环境变量
/usr/local/java/jdk-11/bin/java -jar $FOLDER_PATH/$JAR_NAME ${PARAMS}
生成镜像
docker build -t aec-service-user:1.0.0.0 .
测试镜像
# 创建并启动容器
docker run -dit --name aec-service-user-1.0.0.0 aec-service-user:1.0.0.0
# 进入容器查看
docker exec -it aec-service-user-1.0.0.0 /bin/bash
# 通过查看日志可以得知容器启动正常,那么可以将其先删除了
docker stop 容器id/名字
docker rm 容器id/名字
编写微服务Docker-Compose
docker-compose.yml文件内容如下
services:
aec-service-user:
logging:
driver: none
container_name: aec-service-user-${SERVICE_VERSION}
image: aec-service-user:${SERVICE_VERSION}
restart: always
ports:
- "$SERVICE_EXPORT_PORT:29999"
volumes:
- $SERVICE_EXPORT_FOLDER:/home/data/logs
- /etc/localtime:/etc/localtime:ro
environment:
TZ: Asia/Shanghai
PARAMS: "
--server.port=29999
"
version: '3.1'
环境变量文件.env内容如下:
SERVICE_VERSION=1.0.0.0
SERVICE_EXPORT_PORT=14000
SERVICE_EXPORT_FOLDER=/home/xxx/dockerVolume/aec-service-user
以上文件解析如下:
1、docker-compose服务名为aec-service-user
2、创建容器名为aec-service-user-1.0.0.0
3、关闭docker日志
4、使用的镜像为aec-service-user:1.0.0.0
5、重启策略为:在容器退出时总是重启容器
6、映射端口有:将容器内部的29999映射为主机的14000
7、数据卷映射有:将主机的/home/xxx/dockerVolume/aec-service-user和容器的/home/data/logs做映射;将主机的/etc/localtime和容器的/etc/localtime做只读映射(容器中无法修改该文件)
8、设置容器的环境变量有TZ和PARAMS
启动服务
docker-compose.yml up -d
## 这个命令需要在docker-compose.yml目录执行
## -d表示后台运行
启动之后将会有自动创建容器并将其启动。
其他常用docker-compose命令有:
# 在后台启动所有服务
docker-compose up -d
# 列出项目中目前的所有容器
docker-compose ps
# 停止正在运行的容器,可以通过docker-compose start 再次启动
docker-compose stop
# 停止和删除容器、网络、卷、镜像
# --rmi all 删除删除compose文件中定义的所有镜像
docker-compose down
# 查看服务容器的输出
docker-compose logs
# 服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新构建服务
docker-compose build
# 拉取服务依赖的镜像
docker-compose pull
# 重启项目中的服务
docker-compose restart
# 删除所有(停止状态的)服务容器
# –f, –force,强制直接删除,包括非停止状态的容器
docker-compose rm
# 启动已经存在的服务容器
docker-compose start
# 在指定服务上执行一个命令
docker-compose run
# 设置指定服务运行的容器个数。通过service=num的参数来设置数量
docker-compose scale
# 暂停/恢复一个服务容器
docker-compose pause/unpause
# 验证并查看compose文件配置
docker-compose config
# 显示某个容器端口所映射的公共端口
docker-compose port
镜像导入导出
# 导出
docker save aec-service-user:1.0.0.0 > aec-service-user-1.0.0.0.tar.gz
# 导入
docker load < aec-service-user-1.0.0.0.tar.gz
通过容器导入导出
以下介绍通过容器进行导入导出,目前来说并不会用上就是。
# 导出
docker export -o aec-service-user-container-1.0.0.0.tar.gz aec-service-user-1.0.0.0
# 导入(导入成镜像,然后通过镜像启动容器)
docker import aec-service-user-container-1.0.0.0.tar.gz aec-service-user:1.0.0.0
# 启动容器
## 此时直接去启动会报错
## docker: Error response from daemon: No command specified.
## 需要加上原本镜像的启动命令
docker run -dit --name aec-service-user-1.0.0.0 aec-service-user:1.0.0.0 sh start.sh