Docker学习总结(三)

本文涉及的产品
云数据库 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


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


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


项目部署完毕!

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
运维 虚拟化 开发者
Docker-全面详解(学习总结---从入门到深化)
Docker-全面详解(学习总结---从入门到深化)
49 1
|
4月前
|
分布式计算 Java Linux
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
Docker 是一套构建在 Linux 内核之上的高级工具,旨在帮助开发人员和运维人员更轻松地交付应用程序和依赖关系,实现跨系统和跨主机的部署。使用安全且轻量级的容器环境来实现这一目标。容器可以手动创建,也可以通过编写 Dockerfile 自动创建。开发人员和运维人员可以将应用程序及其依赖打包到容器中,实现应用程序的可移植性和环境一致性。
121 5
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
|
12天前
|
监控 Docker 容器
Docker从入门到精通:Docker log 命令学习
了解 Docker 日志管理对容器监控至关重要。`docker logs` 命令用于查看和管理容器日志,例如,`docker logs <container_name>` 显示容器日志,`-f` 或 `--follow` 实时跟踪日志,`--tail` 显示指定行数,`--timestamps` 添加时间戳,`--since` 按日期筛选。Docker 支持多种日志驱动,如 `syslog`,可通过 `--log-driver` 配置。有效管理日志能提升应用程序的稳定性和可维护性。
13 0
|
21天前
|
存储 Ubuntu Docker
Docker从入门到精通:Docker pull命令学习
了解Docker镜像下载方法!使用`docker pull`命令从[Docker Hub](https://hub.docker.com/)获取镜像。基本语法是`docker pull NAME[:TAG]`。例如,拉取Python最新镜像的命令是`docker pull python`或`docker pull python:latest`。可选参数包括`-a`(拉取所有标签)和`--quiet`(只显示进度条)。拉取后,用`docker images`检查镜像是否成功存储。开始你的容器化之旅吧!
27 0
|
21天前
|
关系型数据库 MySQL Go
Docker从入门到精通:Docker镜像相关命令学习
本文介绍了Docker中管理镜像的基本命令:`docker images`用于查看镜像列表,`docker search`从Docker Hub搜索镜像,`docker rmi`删除镜像,`docker tag`则用于标记和重命名镜像。通过这些命令,用户能有效管理自己的Docker镜像资源。
25 1
|
2月前
|
Cloud Native Shell Linux
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
16 0
|
2月前
|
Cloud Native Linux 虚拟化
云原生专题 |【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(底层实现系列)
云原生专题 |【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(底层实现系列)
47 0
|
3月前
|
Ubuntu 应用服务中间件 Docker
docker-学习
docker-学习
22 0
|
3月前
|
消息中间件 RocketMQ Docker
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
54 0
|
4月前
|
存储 运维 Linux
精彩推荐 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
在使用Docker时,管理维护工作可能会显得复杂。然而,实际上,Docker提供了许多便捷且人性化的工具,这些工具的使用技巧可以大大简化维护工作,并提升效率。通过掌握这些技巧,你不仅能够更轻松地管理Docker环境,还能展现出专业的能力。接下来我们就给大家介绍一下对于我在工作当中对于Docker容器使用的技术实战总结
48 2
精彩推荐 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)