Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
【把脚本命令写在这个文件里面】
DockerFile指令# 指定基础镜像 FROM ubuntu:latest # 配置环境变量,JDK的安装目录 ENV JAVA_DIR=/usr/local # 拷贝jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo.jar /tmp/app.jar # 安装JDK 1. 进入java目录 2. 解压压缩包 3. 重命名 RUN cd $JAVA_DIR && tar -xf ./jdk8.tar.gz && mv ./jdk1.8.0_144 ./java8 # 配置环境变量 ENV JAVA_HOME=$JAVA_DIR/java8 ENV PATH=$PATH:$JAVA_HOME/bin # 暴露端口 EXPOSE 8090 # 入口,java项目的启动命令 ENTRYPOINT java -jar /tmp/app.jar
# 指定基础镜像 FROM java:8-alpine #已经存在的基础镜像,快速搭建java8镜像【包含基础系统配置,以及jdk】 COPY ./docker-demo.jar /tmp/app.jar # 暴露端口 EXPOSE 8090 # 入口,java项目的启动命令 ENTRYPOINT java -jar /tmp/app.jar
DockerFile构建镜像指令FROM :指定基础镜像 示例:FROM centos:6
ENV:设置环境变量,可在后面指令使用 ENV key value
COPY:拷贝本地文件到镜像的指定目录 COPY ./mysql-5.7.rpm /tmp
RUN:执行linux的shell命令,一般是安装过程的命令 RUN yum install gcc
EXPOSE:指定容器运行时监听的端口 EXPOSE 8090
ENTRYPOINT:镜像中应用的启动命令,容器运行时调节 ENTRYPOINT java -jar xx.jar
DockerCompose DockerCompose是什么?docker build -t javaweb:1.0 .
--tag, -t,镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag
javaweb:1.0:镜像名:版本号
".":dockerfile所在的目录
帮助我们快速创建和部署容器。
与Docker Run命令对比
PS:容器之间可以通过容器名互相访问!!!容器之间可以通过容器名互相访问!!!容器之间可以通过容器名互相访问!!!实际上是compose会创建docker虚拟网络,支持服务通过名称定位IP
安装 Docker Compose# 下载docker-compose 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版本 docker-compose -v使用Docker-Compose
docker-compose up 创建并使用容器
docker-compose stop 停止服务
docker-compose top 查看所有正在运行的服务
docker-compose rm 删除所有没有运行的服务
docker-compose restart [服务] 重启指定服务
1. 创建docker-compose.yml文件
# 指定docker-compose版本
version: "3.2"
# 服务(容器)列表
services:
# 容器名:通过compose创建容器时的容器名
nacos:# 创建容器依赖的镜像
image: nacos/nacos-server# 容器启动时的环境配置
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service#
depends_on:
- nacos
orderservice:
build: ./order-servicedepends_on:
- nacos
gateway:
build: ./gateway
ports:
- "10010:10010"depends_on:
- nacos
解释:
ports:端口映射:容器与真实机器的端口映射
volumes:数据卷挂载:创建容器时指定数据卷挂载
build:扫描目录,找到DockerFile文件,通过DockerFile创建镜像,并通过该镜像创建一个正在运行的容器
depends_on:用来表示一个容器A的创建依靠另一个容器B,所以会以先创建容器B,再创建容器A的顺序执行指令。
微服务无需对外提供端口,对外GateWay网关提供端口即可。
2. 编写第一步中需要用到的DockerFile文件
3. 修改微服务application.yml文件中的容器地址
(docker集群部署会通过服务名找到对应地址)
spring:
datasource:
#url: jdbc:mysql://localhost:3306/cloud-user?useSSL=false
url: jdbc:mysql://mysql/cloud-user?useSSL=false # docker集群部署会通过服务名找到对应地址
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
4. 复制.jar文件到DockerFile文件中指定位置
FROM java:8-alpine COPY ./app.jar /tmp/app.jar ENTRYPOINT java -jar /tmp/app.jar
5. 执行docker-compose up -d命令
docker-compose up -d #在 docker-compose.yml 所在路径下执行该命令 Compose 就会自动构建镜像并使用镜像启动容器【创建并运行容器】执行Docker-Compose存在的问题
执行服务的顺序问题,比如:当A、B服务依赖于C服务,当执行docker-compose.yml文件时,服务时同时启动的,C服务可能再A、B服务之后启动,那么这时候A、B服务就会出现问题。
解决:
depends_on:用来表示一个容器A的创建依靠另一个容器B,所以会以先创建容器B,再创建容器A的顺序执行指令。



