文章目录
将微服务运行在Docker上
有了之前的基础,可以将微服务打包之后,利用 Dockerfile 来构建镜像。
打包微服务
首先要把微服务打包成 jar 包。
准备 Dockerfile
创建 Dockerfile 文件,并输入以下内容:
# 基于镜像java:8
FROM java:8
# 将本地文件夹挂载到当前容器
VOLUME /tmp
# 复制文件到容器
COPY microservice-discovery-eureka-0.0.1-SNAPSHOT.jar /app/microservice-discovery-eureka.jar
# 执行命令修改文件的时间为当前时间
RUN bash -c 'touch /app/microservice-discovery-eureka.jar'
# 声明要暴露的端口
EXPOSE 8761
# 配置容器启动后执行的命令,运行jar。`-Djava.security.egd=file:/dev/./urandom` 这个参数的作用是加快随机数产生过程,参考:https://blog.51cto.com/leo01/1795447
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/microservice-discovery-eureka.jar"]
其中相应的参数根据自己的情况作出更改
构建镜像
在 Dockerfile 所在目录执行构建命令:
docker build -t yhcm/microservice-discovery-eureka:0.0.1 .
其中yhcm
是仓库名称,这个在后面推送镜像到 Docker Hub 上会用到,其实就是你的 Docker Hub 账号的id
启动容器
docker run -d -p 8761:8761 yhcm/microservice-discovery-eureka:0.0.1
至此已经可以访问运行在 docker 中的微服务了。
使用 Docker Registry 管理 Docker 镜像
Docker Hub 是 Docker 官方维护的 Docker Registry ,上面存放着很多优秀的镜像。不仅如此,Docker Hub 还提供了认证、工作组结构、工作流工具、构建触发器等工具来简化工作。虽然我一个都没有用过。
Docker Hub 给我的感觉就像是 GitHub 一样你可以将自己的镜像上传到 Docker Hub 上进行管理。
官网地址:https://hub.docker.com/
注册登录,比较简单就不说了,不过需要注册的是,在填写 Docker Hub 的 ID 的时候最好不要用自己的手机号之类的联系方式做为 ID 。
在 Docker 中可以使用 docker login
命令来登录。
创建仓库
直接在 Docker Hub 的主页上点击 Create Repository 按钮,根据提示填写信息,点击 Create 就可以创建一个仓库。
推送镜像
使用一下命令:
docker push yhcm/microservice-discovery-eureka:0.0.1
网速过慢,直接超时也不稀奇,推送之前需要先使用docker login
登录。
使用私有 Docker Registry 来管理镜像
虽然书中用仓库来称呼 Docker Hub ,但是我觉得 Docker Registry 本来就是Docker 注册中心的意思。而且称呼为仓库,容易和在Docker Hub 上创建的那个仓库的概念混淆,所以我会用注册中心来称呼Docker Registry。
相比 Docker Hub 私有的 Docker Registry 自然有其优势:
- 节省宽带,速度快。毕竟访问自己搭建的 Docker Registry 要比访问 Docker Hub 要快的多
- 更加安全
- 便于内部镜像的统一管理
下面将使用 Docker Regisrty 2.0 搭建一个私有注册中心,然后将 Docker 镜像推送到私有注册中心上。
搭建私有注册中心
因为 Docker Registry 2.0 也是用 Docker 进行管理的,所以只需要执行以下命令就可以启动一个 Docker Registry 2.0 的容器。
docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
将镜像推送到私有注册中心
之前是通过命令docker push yhcm/microservice-discovery-eureka:0.0.1
来推送到 注册中心上的,其默认的注册中心就是 Docker Hub。如果需要推送到私有的注册中心上就需要手动指定其地址。
修改镜像:
docker tag yhcm/microservice-discovery-eureka:0.0.1 192.168.99.101:5000/yhcm/microservice-discovery-eureka
其中192.168.99.101
就是运行 registry2 的宿主机的ip地址。
然后执行命令:
docker push 192.168.99.101:5000/yhcm/microservice-discovery-eureka
到了这一步就会报错,内容如下:
The push refers to repository [192.168.99.101:5000/yhcm/microservice-discovery-eureka]
Get https://192.168.99.101:5000/v2/: http: server gave HTTP response to HTTPS client
原因是以为与 Docker Registry 的交互默认是 Https,但是搭建私有的注册中心默认使用的是Http服务。
解决办法就是,进入Docker Registry 的宿主机,在 /etc/docker 文件夹下,创建文件daemon.json
并增加内容:
{"insecure-registries": ["192.168.99.101:5000"]}
然后重启 Docker 即可。
Docker Registry 2.0 能够满足大部分场景下的需求,但是它不包含界面、用户管理、权限控制等功能。如果想使用这些功能,可使用Docker Trusted Registry。