(二)Docker实战--Docker镜像部署与启动
一、构建docker镜像
(一)、步骤
1.导入jdk8的docker镜像
# 将jdk.tar加载到本地的docker镜像仓库中
docker load -i jdk.tar2.编写dockerfile
Dockerfile文件
定义“如何构建docker镜像”的文本文件,包含一系列指令,docker会按照这些指令的顺序,自动构建出一个可运行的镜像。
# 指定基础镜像(Java 8运行环境)
FROM openjdk:8
# 容器内的工作目录
WORKDIR /app
# 将宿主机的文件复制到镜像中
ADD ./test.jar /app/test.jar
# 定义容器启动时必须执行的命令
ENTRYPOINT ["java","-jar","test.jar" ]3.上传jar包到服务器
4.执行构建命令【docker build 命令会自动读取并执行 Dockerfile 中的所有指令;必须和Dockerfile同级】
docker build -t test:1.0 .
# docker build:启动镜像构建流程
# -t test:1.0:给镜像命名为test,标签为1.0
# .:表示以当前目录作为 “构建上下文”(Docker 会在当前目录下找 Dockerfile 和需要复制的文件,如test.jar)。二、生产环境启动Docker容器
为什么在生产环境中不使用docker run??
docker run的配置和操作缺乏“持久化记录”,无法留下可追溯、可复用的痕迹(即配置档案)
Docker run 是通过命令行参数一次性启动容器的,这些参数只存在于“执行命令的瞬间”。
生产环境:系统或软件正式投入使用、面向终端用户和实际业务的运行环境。
(一)、Docker Compose 配置文件
所以我们使用docker-compose文件:
其作用有2个:对多个相互关联的容器进行统一管理/docker容器的配置文件化
内容如下:
# 指定Docker Compose的配置版本
version: '3'
# 定义服务的配置块、一个services下可以包含多个服务
services:# 定义一个名为test的服务test:# 指定创建该服务容器所使用的Docker镜像名称为test.1.0.1image: "test.1.0.1"# 指定容器实际名称为testcontainer_name: test# 容器重启策略为alwaysrestart: always# 将主机的18080端口映射到容器内的8080端口ports:- 18080:8080# 挂载 实现持久化【将主机当前目录下的data文件夹挂载到容器内的/app目录下volumes:- ./data/:/app# 设置时区为伤害environment:- TZ=Asia/Shanghai# 让容器加入test网络组networks:- test
# 声明该网络组是外部已经存在的网络
networks:test:external: true网络组:隔离与通信,是逻辑上的隔离单元——加入同一个网络的容器,默认可以通过容器名相互访问;不同网络的容器默认相互隔离。
(二)、步骤
1.在配置文件目录下创建data目录(目的是映射)

2.将test.jar移动到data目录下
原因:
挂载会“覆盖”容器内原有的目录内容,即容器内/app的内容由主机的/data目录内容决定;
Dockerfile中写的容器启动逻辑是:在app目录下运行程序
# 指定基础镜像(Java 8运行环境)
FROM openjdk:8
# 容器内的工作目录
WORKDIR /app
# 将宿主机的文件复制到镜像中
ADD ./test.jar /app/test.jar
# 定义容器启动时必须执行的命令
ENTRYPOINT ["java","-jar","test.jar" ]若主机目录没有test.jar,则会报错找不到test.jar

3.编写docker-Compose文件
如上所示:

4.创建网落组test(test是自己命名的)

5.启动容器、查看日志

docker logs -f 后面跟的是容器id 或 名称【-f是--follow的缩写,意思是实时输出容器新产生的日志】
6.在本机电脑上访问虚拟机的ip地址:18080/test

# 停掉容器
docker-compose down四、shell脚本自动部署
1.脚本编写:
vi build.sh
#!/bin/bash
echo "停用所有容器"
docker-compose down
echo "删除镜像"
docker rmi test.1.0.1
echo "构建镜像"
docker build -t test.1.0.1 .
echo "运行容器"
docker-compose up -d#!/bin/bash:Shebang(也称为 hashbang)声明,用于指定脚本的解释器。
echo:输出文字
2.执行脚本
![]()
Dockerfile、docker-compose和build.sh必须在同一级
