Docker学习总结(三)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Docker学习总结(三)

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


小结:


  1. Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
  2. Dockerfile的第一行必须是FROM,从一个基础镜像来构建
  3. 基础镜像可以是基本操作系统,如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.25
  • environment:环境变量
  • MYSQL_ROOT_PASSWORD: 123:设置数据库root账户的密码为123


  • volumes:数据卷挂载,这里挂载了mysql的data、conf目录,其中有我提前准备好的数据


  • userserviceorderservicegateway:都是基于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


现在我们访问浏览器,如果没有关闭防火墙记得去开启端口号。


网络异常,图片无法展示
|


项目部署完毕!

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
存储 Ubuntu Linux
学习docker
学习docker
57 1
|
3月前
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
385 3
|
3月前
|
运维 Kubernetes 开发者
Docker Swarm学习
【10月更文挑战第5天】
44 3
|
3月前
|
Kubernetes Linux 持续交付
docker容器学习
【10月更文挑战第1天】
46 1
|
4月前
|
存储 Ubuntu Docker
Docker学习
Docker学习
68 4
|
3月前
|
Linux 应用服务中间件 Shell
docker学习--docker容器镜像常用命令大全(简)
本文档详细介绍了Docker中的镜像命令与容器管理命令。镜像命令部分涵盖了镜像搜索、下载、上传等操作;容器管理命令则包括了容器的创建、启动、停止、删除及日志查看等功能。通过具体示例,帮助用户更好地理解和使用Docker相关命令。
215 0
|
3月前
|
Shell 应用服务中间件 nginx
docker学习--最详细的docker run 各子命令解释与应用
`docker run` 是 Docker 中用于启动容器的基本命令。常用子命令包括 `-i`(交互模式)、`-t`(分配终端)、`-d`(后台运行)、`-p`(端口映射)、`--name`(指定容器名)。例如,`docker run -it nginx:1.20 /bin/bash` 可以创建并进入交互式容器。使用 `-d` 可在后台运行容器,`-p` 可将容器端口映射到主机端口,`--name` 则用于自定义容器名称以便管理。
338 0
|
5月前
|
网络协议 Shell Docker
docker 学习之路
docker 学习之路
44 1
|
7月前
|
NoSQL Redis Docker
Docker再学习 - 实战
Docker再学习 - 实战
43 1
|
7月前
|
Java C++ Docker
Docker再学习 - 阿里加速配置篇
Docker再学习 - 阿里加速配置篇
376 0

热门文章

最新文章