准备
准备服务器一台或者多台。本文以一台为例操作,如果多台,步骤类似,注意配置的ip和端口号即可。
服务器操作系统需要是linux。本文中服务器的操作系统为CentOS 7.6 64位。
一个调皮的项目。本文中的项目是基于spring cloud框架的多个微服务组成的项目。
XShell上传文件工具。
清醒的头脑。
安装docker
升级本地yum包
yum update
安装docker
yum installdocker
设置开机自动启动
systemctl enable docker
启动docker服务
service docker start
配置文件
此步骤的目的是在本地的开发环境中直接远程创建镜像。所以不是必须步骤,大家可以尝试此方法。如果不进行此步骤,则可以用XShell直接上传jar包至服务器,再登录服务器进行部署。
值得说明的是,此方式又一个重大漏洞:因为服务器必须开放2375端口才能被远程开发机访问,所以有可能被植入恶意程序。本人的生产环境刚开始就有过这样的教训。当时服务器被注入了一个运行于docker中的挖矿程序导致每几个小时资源耗尽不得不重启。所以这种方式只适用于测试环境,绝对不能用于生产环境。
修改docker配置文件
#vi /usr/lib/systemd/system/docker.service
进入编辑模式后,将ExecStart这一行后面加上
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
改完后如下所示
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
这里就写4个0,保存后退出。
重新加载配置文件
systemctl daemon-reload
重启docker:
service docker restart
输入netstat -anp|grep 2375 显示docker正在监听2375端口,输入curl 127.0.0.1:2375/info 显示一大堆信息,证明远程api就弄好了。
本地开发环境配置:windows系统环境变量中新建DOCKER_HOST,值为tcp://10.100.74.220:2375(你改成你自己的docker服务器ip地址)。
在代码中的各模块的pom文件中加入以下:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<imageName>${project.name}:${project.version}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<skipDockerBuild>false</skipDockerBuild>
<resources>
<resource>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
在各模块的src/main下面新建docker包,在src/main/docker下面新建Dockerfile与runboot.sh文件
Eclipse中打开maven build输入
clean package docker:build
等待成功或者打开dos窗口,即cmd命令行,进入到你要编译的项目文件夹下输入
mvn clean package docker:build –DskipTests
等待成功。
使用dockerfile发布
docker build -txxx:1.0.0.-fDockerfile
发布项目
查看所有镜像是否上传成功
docker image ls
运行容器(-p后面跟映射端口)
docker run -d --net=host-p 8761:8761 eureka-server:1.0.0
docker run -d --net=host-p 8762:8762 config-server:1.0.0
docker run -d --net=host-p 8763:8763 redis-service:1.0.0
docker run -d --net=host-p 8764:8764 rabbit-service:1.0.0
其他命令
停止所有的container,这样才能够删除其中的images
docker stop $(docker ps -a -q)
如果想要删除所有container的话再加一个指令
docker rm $(docker ps -a -q)
查看当前有些什么images
docker images
删除images,通过image的id来指定删除谁
docker rmi <image id>
想要删除untagged images,也就是那些id为<None>的image的话可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
删除全部imag
docker rmi $(docker images -q)
总结
docker上手还是比较容易,部署的步骤也比较简单,生产环境运行了一年左右还没有发现什么问题,而且基于spring cloud框架的服务扩展性非常强。以后有机会再写写我用spring cloud的感受