1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 基于docker容器化部署微服务

基于docker容器化部署微服务

时间:2021-11-16 01:10:15

相关推荐

基于docker容器化部署微服务

前言

在笔者系列文章中微服务配置隔离已经完成服务之间的配置隔离,服务整体来说是已经通了。

为了方便后续测试已经环境统一,笔者本章节会对服务进行容器化部署。由于服务器性能问题,本次部署采用maven完成镜像构建,结合docker-compose完成容器的创建。

容器化创建步骤

服务器放开2376 端口

我们后续的镜像创建需要基于2376端口,所以我们需要执行下面这段命令,对docker.service进行编辑

vim /lib/systemd/system/docker.service

可以看到笔者在截图位置处增加了一行-H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock

完成后重启docker服务并开放2376端口(因为笔者服务器是阿里云服务器所以这一步相对方便一些,就不多做介绍了)

systemctl daemon-reloadsystemctl restart docker.service

为了测试连通性,我们在本地键入

curl http://ip:2376/info

若输出下面这样一段文字,则说明当前设置生效了

{"ID":"IIPN:J265:YCRR:EQVR:FTPY:GBUK:VWES:MWJU:6TBH:NSFP:L7BU:K3RJ","Containers":6,"ContainersRunning":6,"ContainersPaused":0,"ContainersStopped":0,"Images":56,"Driver":"overlay2","DriverStatus":[["Backing Filesystem","extfs"],["Supports d_type","true"],["Native Overlay Diff","false"],["userxattr","false"]],"Plugins":{"Volume":["local"],"Network":["bridge","host","ipvlan","macvlan","null","overlay"],"Authorization":null,"Log":["awslogs","fluentd","gcplogs","gelf","journald","json-file","local","logentries","splunk","syslog"]},"MemoryLimit":true,"SwapLimit":true,"KernelMemory":true,"KernelMemoryTCP":true,"CpuCfsPeriod":true,"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"PidsLimit":true,"IPv4Forwarding":true,"BridgeNfIptables":true,"BridgeNfIp6tables":true,"Debug":false,"NFd":74,"OomKillDisable":true,"NGoroutines":72,"SystemTime":"-02-05T17:56:16.36473356+08:00","LoggingDriver":"json-file","CgroupDriver":"cgroupfs","CgroupVersion":"1","NEventsListener":0,"KernelVersion":"4.19.91-24.1.al7.x86_64","OperatingSystem":"Alibaba Cloud Linux (Aliyun Linux) 2.1903 LTS (Hunting Beagle)","OSVersion":"2.1903","OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/","RegistryConfig":{"AllowNondistributableArtifactsCIDRs":[],"AllowNondistributableArtifactsHostnames":[],"InsecureRegistryCIDRs":["127.0.0.0/8"],"IndexConfigs":{"docker.io":{"Name":"docker.io","Mirrors":["https://fy707np5./"],"Secure":true,"Official":true}},"Mirrors":["https://fy707np5./"]},"NCPU":1,"MemTotal":2043502592,"GenericResources":null,"DockerRootDir":"/var/lib/docker","HttpProxy":"","HttpsProxy":"","NoProxy":"","Name":"iZ8vb7bhe4b8nhhhpavhwpZ","Labels":[],"ExperimentalBuild":false,"ServerVersion":"20.10.23","Runtimes":{"io.containerd.runc.v2":{"path":"runc"},"io.containerd.runtime.v1.linux":{"path":"runc"},"runc":{"path":"runc"}},"DefaultRuntime":"runc","Swarm":{"NodeID":"","NodeAddr":"","LocalNodeState":"inactive","ControlAvailable":false,"Error":"","RemoteManagers":null},"LiveRestoreEnabled":false,"Isolation":"","InitBinary":"docker-init","ContainerdCommit":{"ID":"5b842e528e99d4d4c1686467debf2bd4b88ecd86","Expected":"5b842e528e99d4d4c1686467debf2bd4b88ecd86"},"RuncCommit":{"ID":"v1.1.4-0-g5fd4c4d","Expected":"v1.1.4-0-g5fd4c4d"},"InitCommit":{"ID":"de40ad0","Expected":"de40ad0"},"SecurityOptions":["name=seccomp,profile=default"],"Warnings":["WARNING: API is accessible on http://0.0.0.0:2376 without encryption.\n Access to the remote API is equivalent to root access on the host. Refer\n to the 'Docker daemon attack surface' section in the documentation for\n more information: /go/attack-surface/"]}

引入插件

接下来我们就可以对自己的服务进行配置,就以笔者的cloud-gateway为例,模块截图如下所示:

从而完成基于maven打包生成镜像并上传到服务器了,首先在maven插件中引入下面这段依赖,读者只需按需修改下面的dockerHost即可,别的配置若无非必须则可以不动。

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.2.2</version><configuration><imageName>${project.artifactId}</imageName><imageTags><imageTag>latest</imageTag></imageTags><!--指定Dockerfile路径--><dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory><dockerHost>http://ip:2376</dockerHost><resources><resource><targetPath>/</targetPath><!--${project.basedir}/target--><directory>${project.build.directory}</directory><!--${project.artifactId}-${project.version}--><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin>

编写Dockerfile

我们上面的配置指明Dockerfile的路径为${project.basedir}/src/main/docker,所以我们要在main目录下创建一个docker文件夹。

在该文件夹下创建Dockerfile文件,以笔者为例笔者的cloud-gateway打包命令,就如下图所示(注意ENTRYPOINT 指定jvm参数笔者采用exec格式的,原本采用数组格式的会报错,笔者也没有去纠结原因)

FROM openjdk:8-jdk-alpineVOLUME /tmpADD cloud-gateway-0.0.1-SNAPSHOT.jar app.jarRUN sh -c 'touch /app.jar'# 调整JVM参数堆区空间大小,节省服务内存空间。ENTRYPOINT exec java -Xmx32m -Xms32m -Djava.security.egd=file:/dev/./urandom -jar /app.jar

基于maven远程完成maven镜像的构建

完成后我们就可以到当前模块的pom文件的目录使用cmd键入下面这条命令,完成镜像构建

mvn clean package docker:build -DskipTests

如下图所示,一旦出现BUILD SUCCESS就说明镜像构建成功了

注意笔者在打包过程中遇到了一个报错:Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin。查阅网上资料得知,不是spring boot引用不可添加下面这个插件,去掉后即可解决。

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin>

查看镜像是否成功到达服务器

我们到服务器键入

docker images

可以看到若出现我们打包的镜像名称说明打包成功了。同理我们完成其他服务器的插件引入和dockerfile编写。

启动测试

笔者为了启动方便这里也编写了一个docker-compose文件,文件名为cloud-service.yml内容如下:

version: "3"services:cloud-gateway:container_name: cloud-gatewayimage: cloud-gateway:latestports:- "8090:8090"restart: alwaysaccount-service:container_name: account-serviceimage: account-service:latestports:- "9000:9000"restart: always

到文件cloud-service.yml下键入命令

docker-compose -f cloud-service.yml up -d

本地键入curl命令,可以看到请求成功,说明本次服务器部署成功了。

curl ip:8090/account/getByCode/zsy{"status":100,"message":"操作成功","data":{"id":1,"accountCode":"zsy","accountName":"zsy","amount":10000.00},"success":true,"timestamp":1675592778302}

参考文献

SpringCloud Alibaba微服务实战十五 - SpringCloud 容器化部署

Dockerfile中ENTRYPOINT指定JVM启动堆内存参数后部署容器启动报错?

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。