Docker学习笔记(二)Dockerfile自定义镜像、DockerCompose、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服务。

其中gatewayuser-serviceorder-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-serviceuser-servicegateway服务的nacos地址都修改为基于容器名的访问。如图:

  • 3)打包order-serviceuser-servicegateway项目,将打包的可执行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

本节完,更多内容请查阅分类专栏:微服务学习笔记

感兴趣的读者还可以查阅我的另外几个专栏:

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰色孤星A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值