4、自定义镜像
4.1 基于Ubuntu镜像构建一个新镜像,运行一个java项目
步骤1:新建一个空文件夹docker-demo,自己挑个目录创建就好。
https://developer.aliyun.com/article/1109089
步骤2:将自己的项目导成jar包,例如docker-demo.jar,上传到docker-demo这个目录
步骤3:将linux版本的jdk也上传到docker-demo这个目录
步骤4:将写好的Dockerfile也上传到docker-demo这个目录(这个文件没有后缀名的哦)
其中内容如下:
# 指定基础镜像 FROM ubuntu:16.04 # 配置环境变量,JDK的安装目录 ENV JAVA_DIR=/usr/local # 拷贝jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo.jar /tmp/app.jar # 安装JDK RUN cd $JAVA_DIR \ && tar -xf ./jdk8.tar.gz \ && mv ./jdk1.8.0_144 ./java8 # 配置环境变量 ENV JAVA_HOME=$JAVA_DIR/java8 ENV PATH=$PATH:$JAVA_HOME/bin # 暴露端口 EXPOSE 8090 # 入口,java项目的启动命令 ENTRYPOINT java -jar /tmp/app.jar
步骤5:进入docker-demo,使用docker build命令构建镜像
docker build -t javaweb:1.0 .
注:
. :我们要用Dockerfile来构建镜像,所以我们要知道Dockerfile在哪,因为我就在Dockerfile的当前目录下,所以可以用.来表示
步骤六:使用docker run创建容器并运行(如果没有关闭防火墙记得开放端口号)
docker run --name web -p 8090:8090 -d javaweb:1.0
注:如果你创建容器失败是因为这样:
重启docker能解决百分之九十的问题
命令如下:
systemctl restart docker
搞定之后我们就可以使用浏览器访问一下的项目啦。
4.2 基于java:8-alpine镜像构建Java项目
虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包,构建镜像,但是却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做改造。
例如,构建java项目的镜像,可以在已经准备了JDK的基础镜像基础上构建。
这里我们基于上面那个案例来做
直接修改Dockerfile文件即可,文件内容如下:
# 指定基础镜像 FROM java:8-alpine COPY ./docker-demo.jar /tmp/app.jar # 暴露端口 EXPOSE 8090 # 入口,java项目的启动命令 ENTRYPOINT java -jar /tmp/app.jar
使用docker build命令构建镜像:
docker build -t javaweb:2.0 .
使用docker run创建容器并运行(如果没有关闭防火墙记得开放端口号)
docker run --name javaweb -p 8090:8090 -d javaweb:2.0
注:如果你创建失败就重启docker,重启能解决百分之九十的问题
命令如下:
systemctl restart docker
小结:
- Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
- Dockerfile的第一行必须是FROM,从一个基础镜像来构建
- 基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine
5、Docker-Compose
Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
下载教程: 安装DockerCompose【Liunx】 · 语雀 (yuque.com)
5.1 部署微服务集群
这里就以我以前敲过的代码作为案例:
5.1.1 compose文件
查看我上传到码云的
cloud-demo: 这个是上传到Linux服务器的 (gitee.com)
文件夹,里面已经编写好了docker-compose文件,而且每个微服务都准备了一个独立的目录:
内容如下:
version: "3.2" services: nacos: image: nacos/nacos-server environment: MODE: standalone ports: - "8848:8848" mysql: image: mysql:5.7.25 environment: MYSQL_ROOT_PASSWORD: 123 volumes: - "$PWD/mysql/data:/var/lib/mysql" - "$PWD/mysql/conf:/etc/mysql/conf.d/" userservice: build: ./user-service orderservice: build: ./order-service gateway: build: ./gateway ports: - "10010:10010"
可以看到,其中包含5个service服务:
nacos
:作为注册中心和配置中心
image: nacos/nacos-server
: 基于nacos/nacos-server镜像构建environment
:环境变量
MODE: standalone
:单点模式启动
ports
:端口映射,这里暴露了8848端口
mysql
:数据库
image: mysql:5.7.25
:镜像版本是mysql:5.7.25environment
:环境变量
MYSQL_ROOT_PASSWORD: 123
:设置数据库root账户的密码为123
volumes
:数据卷挂载,这里挂载了mysql的data、conf目录,其中有我提前准备好的数据
userservice
、orderservice
、gateway
:都是基于Dockerfile临时构建的
查看mysql目录,可以看到其中已经准备好了cloud_order、cloud_user表:
查看微服务目录,可以看到都包含Dockerfile文件:
内容如下
FROM java:8-alpine COPY ./app.jar /tmp/app.jar ENTRYPOINT java -jar /tmp/app.jar
5.1.2 修改微服务配置
因为微服务将来要部署为docker容器,而容器之间互联不是通过IP地址,而是通过容器名。这里我们将order-service、user-service、gateway服务的mysql、nacos地址都修改为基于容器名的访问。
如下所示:
5.1.3 打包
接下来需要将我们的每个微服务都打包。因为之前查看到Dockerfile中的jar包名称都是app.jar,因此我们的每个微服务都需要用这个名称。
可以通过修改pom.xml中的打包名称来实现,每个微服务都需要修改:
为什么要叫app?因为每个Dockerfile文件里
打包后:
5.1.4 拷贝jar包到部署目录
编译打包好的app.jar文件,需要放到Dockerfile的同级目录中。注意:每个微服务的app.jar放到与服务名称对应的目录,别搞错了。
gateway:
以此类推
5.1.5 部署
最后,我们需要将文件整个cloud-demo文件夹上传到虚拟机中,利用DockerCompose部署。
上传到任意目录:
注:
如果不能以文件夹的格式上传,可以压缩成压缩包上传
zip解压命令如下:
unzip 你的压缩包名字
部署:
进入cloud-demo目录,然后运行下面的命令:
docker-compose up -d
如果有问题,就重启docker ,重启能解决百分之九十的问题!
我们查询正在运行的容器,命令如下:
docker ps
一般第一次部署都会出现一些问题,我们可以查看日志看一下:
docker-compose logs -f
这是因为Nacos的问题,所以如果你使用Nacos为注册中心,推荐你先将Nacos部署起来,再去部署项目。
我们可以选择将我们的容器进行重启(nacos不用)。
docker-compose restart gateway userservice orderservice
现在我们访问浏览器,如果没有关闭防火墙记得去开启端口号。
项目部署完毕!