文章目录
- 前言
- 3 Dockerfile自定义镜像
- 3.1 镜像结构
- 3.2 Dockerfile文件
- 3.3 构建自定义镜像
- 3.3.1 基于Ubuntu构建Java项目
- 3.3.2 基于Java8构建Java项目
- 3.4 小结
- 4 DockerCompose
- 4.1 安装DockerCompose
- 4.2 部署微服务集群
- 5 Docker私有镜像仓库
前言
Docker学习笔记(一)安装Docker、镜像操作、容器操作、数据卷操作
3 Dockerfile自定义镜像
常见的镜像在DockerHub中就能找到,但是自己写的项目如果也想构建成一个镜像,就必须自定义镜像。
3.1 镜像结构
如上图所示,镜像就是在系统函数库、运行环境等的基础上,添加应用程序文件、配置文件、依赖文件等,然后编写好启动脚本,打包在一起所形成的文件。
构建自定义镜像,其实就是实现上述打包的过程。
3.2 Dockerfile文件
构建自定义的镜像时,并不需要一个一个文件去拷贝、打包。
而是只需要告诉Docker,构建自定义镜像需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会自动根据这些配置构建镜像。
而描述上述配置的文件就是Dockerfile文件。
Dockerfile就是一个文本文件,其内容包含多个指令(Instruction),这些指令说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。 例如:
更多更详细的指令说明,可以参考官网文档:https://docs.docker.com/engine/reference/builder
3.3 构建自定义镜像
3.3.1 基于Ubuntu构建Java项目
- 1)现在编写了一个简单的SpringBoot项目,本地启动后在浏览器访问
http://127.0.0.1:9091/hello/now
结果如下:
随后将该项目打成可执行jar包。
-
2)在虚拟机创建一个空目录
docker-demo
,将上面的可执行jar包、JDK安装包jdk-8u261-linux-x64.tar.gz
上传至该目录下; -
3)在
docker-demo
目录下新建一个Dockerfile
文件,其内容如下:
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY jdk-8u261-linux-x64.tar.gz $JAVA_DIR/
COPY ./docker-demo-1.0-SNAPSHOT.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk-8u261-linux-x64.tar.gz \
&& mv ./jdk1.8.0_261 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
- 4)进入
docker-demo
目录,执行构建镜像命令:
docker build -t javaweb:1.0 .
- 5)基于该镜像创建并运行容器
docker run --name javaweb -p 9091:9091 -d javaweb:1.0
- 6)在浏览器访问
http://192.168.146.129:9091/hello/now
结果如下:
3.3.2 基于Java8构建Java项目
基于Ubuntu基础镜像构建Java项目,可以添加任意自己需要的安装包,但是却比较麻烦,例如还要自己上传JDK的安装包并安装。
所以大多数情况下,在构建Java项目的镜像时,都在已经准备了JDK的基础镜像(例如java:8-alpine
镜像)上进行构建。
实现步骤如下:
- 1)创建一个空目录
docker-demo-2
,上传可执行jar包,并创建一个Dockerfile
文件(和基于Ubuntu不同的是,不用上传JDK安装包),其中Dockerfile
文件内容如下:
# 指定基础镜像
FROM java:8-alpine
# 拷贝java项目的包
COPY ./docker-demo-1.0-SNAPSHOT.jar /tmp/app.jar
# 暴露端口
EXPOSE 9091
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
可见,Dockerfile
文件内容也更简洁,不需要安装JDK和配置环境变量。
- 2)进入
docker-demo-2
目录,执行构建镜像命令:
docker build -t javaweb2:2.0 .
- 3)基于该镜像创建并运行容器
docker run --name javaweb2 -p 9090:9091 -d javaweb2:2.0
- 4)在浏览器访问
http://192.168.146.129:9090/hello/now
结果如下:
3.4 小结
- Dockerfile的本质是一个文件,通过指令描述镜像的构建过程;
- Dockerfile的第一行必须是FROM,从一个基础镜像来构建;
- 基础镜像可以是基本操作系统,如Ubuntu;也可以是其他人制作好的镜像,例如:java:8-alpine。
4 DockerCompose
DockerCompose可以基于Compose文件实现快速部署分布式应用,而无需手动一个个创建和运行容器!
而Compose文件是一个文本文件,通过指令定义集群中的每个容器该如何运行。实际上可以看做是将多个docker run
命令写到一个文件中,只是语法稍有差异。
DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/
4.1 安装DockerCompose
- 1)下载DockerCompose
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- 2)修改文件权限
chmod +x /usr/local/bin/docker-compose
- 3)Base自动补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
如果上述命令超时,则需要先执行以下命令修改hosts文件:
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
4.2 部署微服务集群
在笔者的专栏【SpringCloud学习笔记】中,编写了一个SpringCloud测试项目,这里可以把该项目利用DockerCompose来部署。
- 1)创建一个目录
docker-compose
,其内部目录及文件如下:
其中,docker-compose.yml
文件的内容如下:
version: "3.2"
services:
nacos:
# 基础镜像
image: nacos/nacos-server
# 环境变量
environment:
MODE: standalone
# 端口映射
ports:
- "8848:8848"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"
可以看到,准备利用DockerCompose部署的包含4个service服务。
其中gateway
、user-service
、order-service
目录下都有Dockerfile文件,其内容如下:
# gateway目录下
FROM java:8-alpine
COPY ./gateway.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar
# user-service目录下
FROM java:8-alpine
COPY ./user.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar
# order-service目录下
FROM java:8-alpine
COPY ./order.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar
- 2)修改微服务配置
因为微服务将来要部署为docker容器,而容器之间互联不是通过IP地址,而是通过容器名。 因此要将order-service
、user-service
、gateway
服务的nacos地址都修改为基于容器名的访问。如图:
- 3)打包
order-service
、user-service
、gateway
项目,将打包的可执行jar包放到对应目录下。如图:
- 4)将
docker-compose
目录上传至虚拟机,并进入该目录,执行部署命令:
docker-compose up -d
此时可以查看部署的镜像和容器:
- 5)由于微服务配置文件中,Nacos服务的容器名均配置为
nacos
,因此这里要修改一下名称:
docker rename docker-compose_nacos_1_6b6608cc4a5d nacos
- 6)启动
nacos
容器及另外3个服务容器:
# 启动nacos
docker start nacos
# 启动另外3个服务
docker start docker-compose_gateway_1_48789684d386
docker start docker-compose_orderservice_1_657f620e3223
docker start docker-compose_userservice_1_60845887839c
- 7)在浏览器输入
http://192.168.146.129:8848/nacos
:
默认账号密码均为nacos
,登录后即可查询此时注册到Nacos的微服务:
至此,微服务集群部署完毕。
5 Docker私有镜像仓库
搭建私有镜像仓库可以基于Docker官方提供的DockerRegistry来实现。 其官网地址:https://hub.docker.com/_/registry
Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
- 1)搭建私有镜像仓库
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
上述命令中挂载了一个数据卷registry-data
到容器内的/var/lib/registry
目录,这是私有镜像库存放数据的目录。
- 2)配置Docker信任地址
私有镜像仓库采用的是https协议,默认不被Docker信任,所以需要做一个配置:
# 打开要修改的文件
vi /etc/docker/daemon.json
# 文件内容
{
"registry-mirrors": ["https://1ooyxp73.mirror.aliyuncs.com"],
"insecure-registries":["127.0.0.1:5000"]
}
# 重新加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
- 3)重新tag本地镜像,名称前缀为私有镜像仓库的地址
docker tag javaweb:1.0 192.168.146.129:5000/javaweb:1.0
- 4)推送镜像到私有镜像仓库
docker push 192.168.146.129:5000/javaweb:1.0
- 5)在浏览器访问
http://192.168.146.129:5000/v2/_catalog
,就可以查看当前私有镜像服务中包含的镜像:
- 6)从私有镜像仓库拉取镜像
docker pull 192.168.146.129:5000/javaweb:1.0
…
本节完,更多内容请查阅分类专栏:微服务学习笔记
感兴趣的读者还可以查阅我的另外几个专栏:
- SpringBoot源码解读与原理分析
- MyBatis3源码深度解析
- Redis从入门到精通
- MyBatisPlus详解
- SpringCloud学习笔记