使用docker编排容器

news2024/12/23 8:17:29

使用Dockerfile构建一个自定义的nginx

首先用docker拉一个nginx镜像

docker pull nginx

拉取完成后,编辑一个Dockerfile文件

vim Dockerfile

命令如下所示,FROM 后面跟的你的基础镜像,而run则是表示你构建镜像时需要执行的指令,下面的指令意思就构建一个自定义的nginx镜像,最后知名nginx启动后的欢迎界面,路径为当前系统的绝对路径


FROM nginx
RUN echo '<h1> this is my Spring Cloud and Docker study Demo</h1> ' > /usr/share/nginx/html/index.html

Dockerfile的目录下运行如下命令,可以看到命令最后面有个点.,这个点就是用于参数传递,表示当前路径Dockerfile

docker build -t nginx:my .

键入如下命令即可看到我们的自定义的镜像构建完成了

docker images

在这里插入图片描述

完成后,我们尝试创建一个容器运行一下,如下所示,笔者使用bridge映射91端口启动一个nginx

docker run -d -p 91:80 nginx:my

可以看到笔者通过91端口访问到了自己创建的容器

在这里插入图片描述

Dockerfile的常用指令

  1. ADD:该命令会将本地文件复制到docker容器中

格式:

ADD src(源文件或者目录)  desc(容器目标文件或者目标目录)
  1. ARG: 设置的docker构建参数信息
ARG username=用户名
  1. CMD:用于执行容器提供的默认值,在Dockerfile文件中,无论你配置多少条cmd,只会以最后一条为准,即只会执行最后一条指令

支持的格式有

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2 (在shell中执行)

示例

cmd echo 'this is a test'
  1. COPY: 和ADD命令类似,使用也类似

  2. ENTRYPOINT:和cmd一样,都是指定Docker容器启动时需要执行的指令,可以多次设置,但还是以最后一条为准,使用格式也和cmd差不多,示例如下所示

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

  1. ENV:设置环境变量

示例

ENV JAVA_HOME /path/to/java
  1. EXPOSE:说明运行容器提供的端口,但并不会因为该声明而打开相应端口,该指令主要作用是帮助理解该镜像服务的守护端口
    当然,在容器未指明端口随机运行时,会自动映射EXPOSE的端口
EXPOSE 8761
  1. FROM:指定基础镜像,优点类似java的extends关键字,需要注意的时FROM指令必须用在所有指令之前

  2. MAINTAINER:指明维护者信息,用于作为Dockerfile的署名

示例

MAINTAINER 名字<123@qq.com>
  1. USER:用户设置启动镜像时所用的用户id或者uid,写在RUN和CMD以及ENTRYPOINT后的内容都将用该用户执行

示例

USER zhang
  1. VOLUME:该指令使容器的一个容器具有持久化存储的功能,该目录可被容器本身使用,也可以共享给其他容器,当容器中有数据需要持久化时,就可以在Dockerfile中添加该指令,格式如下,意为将数据持久化到/data目录中
VOLUME /data

(实践)使用Dockerfile构建注册中心eureka镜像

源码地址如下,读者可以自行获取

https://github.com/itmuch/spring-cloud-docker-microservice-book-code-docker/tree/master/docker-1-simple/microservice-discovery-eureka

注意将spring boot版本改为

 <!-- 引入spring boot的依赖 -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
  </parent>

spring cloud版本改为

<!-- 引入spring cloud的依赖 -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Hoxton.SR3</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

将自己的项目打成jar包

在这里插入图片描述

编辑一个Dockerfile

在上文扔到服务器中的jar包位置编写一个Dockerfile

vim Dockerfile

编辑的内容如下

# 拉取并使用java8作为基础镜像
FROM openjdk:8
# 将本地文件挂到tmp中
VOLUME /tmp
# 复制文件到容器
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
# 声明需要暴露的端口
EXPOSE 8761
# 配置容器启动后的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

构建镜像

如下命令即可创建一个标签为zsy/microservice-eureka的镜像:

docker build -t zsy/microservice-eureka .```

启动并查看是否可以运行

docker run -d -p 8761:8761 zsy/microservice-eureka

使用服务器ip地址:8761确认是否可以访问

在这里插入图片描述

使用Docker Compose构建容器

Docker Compose是什么?它解决什么问题?

我们的使用docker部署微服务时,如果每个微服务都要手动启停,效率是非常低的,所以我们需要一个工具来一键管理这庞大的微服务,Docker Compose就是最好的帮手。

安装Docker Compose

如下命令所示,这条命令会自动安装适应系统版本的compose

curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

为命令添加可执行权限

chmod +x /usr/local/bin/docker-compose

查看是否安装成功

docker-compose --version

如下图所示,显示版本号即说明安装成功了

在这里插入图片描述

安装命令补全工具

curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version--short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

docker-compose.yml文件指令介绍

  1. image:指定镜像名称或者镜像id,如果该镜像在本地不存在,Compose会尝试pull下来。

示例:

image: java
  1. build:指定Dockerfile的路径,如下所示,这就说明Dockerfile文件在当前目录的dir目录下
build: ./dir
  1. command:覆盖之前的容器启动后默认执行的指令

示例:



command: bundle exec thin -p 3000
# 也可以是一个list,类似于Dockerfile总的CMD指令,格式如下:

command: [bundle, exec, thin, -p, 3000]
  1. links:链接到其他服务中的容器。可以指定服务名称然后给他起一个别名来使用如下所示连接到db,我们给他起了个别名database,后续需要使用这个链接的时候一律使用database
web:
  links:
   - db
   - db:database
   - redis
  1. external_links:表示链接到docker-compose.yml外部的容器,甚至并非Compose管理的容器,特别是对于那些提供共享容器或共同服务。格式跟links类似,示例:
external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql
  1. ports:暴露端口信息。使用宿主端口:容器端口的格式,或者仅仅指定容器的端口(此时宿主机将会随机指定端口),类似于docker run -p ,示例:
ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"
  1. expose:暴露端口,只将端口暴露给连接的服务,而不暴露给宿主机,示例:
expose:
 - "3000"
 - "8000"
  1. volumes:卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。示例:
volumes:
  # Just specify a path and let the Engine create a volume
  - /var/lib/mysql

  # Specify an absolute path mapping
  - /opt/data:/var/lib/mysql

  # Path on the host, relative to the Compose file
  - ./cache:/tmp/cache

  # User-relative path
  - ~/configs:/etc/configs/:ro

  # Named volume
  - datavolume:/var/lib/mysql
  1. volumes_from:从另一个服务或者容器挂载卷。可以指定只读或者可读写,如果访问模式没有指定,则默认是可读写。示例:
volumes_from:
 - service_name
 - service_name:ro
 - container:container_name
 - container:container_name:rw
  1. environment:设置环境变量。可以使用数组或者字典两种方式。只有一个key的环境变量可以在运行Compose的机器上找到对应的值,这有助于加密的或者特殊主机的值。示例:
environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET
  1. env_file:从文件中获取环境变量,可以为单独的文件路径或列表。如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,则以envirment 为准。示例:
env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env
  1. extends:继承另一个服务,基于已有的服务进行扩展。

  2. net:设置网络模式。示例:

net: "bridge"
net: "host"
net: "none"
net: "container:[service name or container name/id]"
  1. dns:配置dns服务器。可以是一个值,也可以是一个列表。示例:
dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9
  1. dns_search:配置DNS的搜索域,可以是一个值,也可以是一个列表,示例:
dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

(实践)使用Docker Compose构建微服务

我们继续使用上文的jar包

编写一个Dockerfile

FROM java:8
VOLUME /tmp
ADD microservice-discovery-eureka-0.0.1.jar app.jar
EXPOSE 8761
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

编写一个docker-compose.yml

version: '2'
services:
  eureka: # 指定服务名称
    build: . # 使用当前路径的Dockerfile
    ports:
      - "8761:8761" # 类似与docker run -p 的端口映射

使用docker-compose up 启动

如下命令所示,该命令为前台启动,我们建议后台启动

docker-compose up

后台启动命令,注意这条命令不仅仅会帮我启动,还会重新构建生成容器

docker-compose up -d

测试

如下图所示,使用ip:8761即可进入eureka界面,说明配置完成了

在这里插入图片描述

关于Docker Compose更多命令

查看帮助。

docker-compose -help

验证docker-compose.yml文件。

# 当配置正确时,不输出任何内容,当配置错误时,输出错误信息。
docker-compose config -q

执行docker-compose指定文件名字

# -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定
docker-compose -f aa.yml up -d

拉取服务依赖的镜像

# 拉取工程中所有服务依赖的镜像
docker-compose pull
# 拉取工程中 nginx 服务依赖的镜像
docker-compose pull nginx
# 拉取镜像过程中不打印拉取进度信息
docker-compose pull -q

启动容器

docker-compose up创建并启动所有服务的容器。指定多个yml-f选项。以守护进程模式运行加-d选项。

# 前台启动
docker-compose up
# 后台启动
docker-compose up -d
# -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定,指定多个 yml
docker-compose -f docker-compose.yml up -d

查看日志

docker-compose logs查看服务容器的输出日志。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过--no-color来关闭颜色。

# 输出日志,不同的服务输出使用不同的颜色来区分
docker-compose logs
# 跟踪日志输出
docker-compose logs -f
# 关闭颜色
docker-compose logs --no-color

列出运行进程

docker-compose ps列出工程中所有服务的容器。

# 列出工程中所有服务的容器
docker-compose ps
# 列出工程中指定服务的容器
docker-compose ps nginx

在容器上执行一条命令

docker-compose run在指定服务容器上执行一个命令。

# 在工程中指定服务的容器上执行 echo "helloworld"
docker-compose run nginx echo "helloworld"

进入容器

docker-compose exec 容器名称 bash 进入服务容器。

# 进入工程中指定服务的容器
docker-compose exec nginx bash
# 当一个服务拥有多个容器时,可通过 --index 参数进入到该服务下的任何容器
docker-compose exec --index=1 nginx bash

暂停服务容器

# 暂停工程中所有服务的容器
docker-compose pause
# 暂停工程中指定服务的容器
docker-compose pause nginx

恢复服务容器

# 恢复工程中所有服务的容器
docker-compose unpause
# 恢复工程中指定服务的容器
docker-compose unpause nginx

重启服务容器

# 重启工程中所有服务的容器
docker-compose restart
# 重启工程中指定服务的容器
docker-compose restart nginx

启动服务容器

# 启动工程中所有服务的容器
docker-compose start
# 启动工程中指定服务的容器
docker-compose start nginx

停止服务容器

# 停止工程中所有服务的容器
docker-compose stop
# 停止工程中指定服务的容器
docker-compose stop nginx

通过发送SIGKILL信号停止指定服务的容器。

# 通过发送 SIGKILL 信号停止工程中指定服务的容器
docker-compose kill nginx

删除服务(停止状态)容器。

# 删除所有(停止状态)服务的容器
docker-compose rm
# 先停止所有服务的容器,再删除所有服务的容器
docker-compose rm -s
# 不询问是否删除,直接删除
docker-compose rm -f
# 删除服务容器挂载的数据卷
docker-compose rm -v
# 删除工程中指定服务的容器
docker-compose rm -sv nginx

停止并删除所有服务的容器、网络、镜像、数据卷。

# 停止并删除工程中所有服务的容器、网络
docker-compose stop
# 停止并删除工程中所有服务的容器、网络、镜像
docker-compose down --rmi all
# 停止并删除工程中所有服务的容器、网络、数据卷
docker-compose down -v

打印服务容器所对应的镜像

# 打印所有服务的容器所对应的镜像
docker-compose images
# 打印指定服务的容器所对应的镜像
docker-compose images nginx

打印指定服务容器的某个端口所映射的宿主机端口

docker-compose port nginx 80

显示正在运行的进程

# 显示工程中所有服务的容器正在运行的进程
docker-compose top
# 显示工程中指定服务的容器正在运行的进程
docker-compose top nginx

参考文献

《Spring Cloud与Docker微服务架构实战》
大目 / spring-cloud-book
docker 构建eureka server 高可用

Docker-compose 常用命令

docker-compose安装部署sentinel-dashboard

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1305347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql的ON DELETE CASCADE 和ON DELETE RESTRICT区别

​​ON DELETE CASCADE​​​ 和 ​​ON DELETE RESTRICT​​ 是 MySQL 中两种不同的外键约束级联操作。它们之间的主要区别在于当主表中的记录被删除时,子表中相关记录的处理方式。 ON DELETE CASCADE:当在主表中删除一条记录时,所有与之相关的子表中的匹配记录也会被自动删…

Android studio:打开应用程序闪退的问题2.0

目录 找到问题分析问题解决办法 找到问题 老生常谈&#xff0c;可能这东西真的很常见吧&#xff0c;在之前那篇文章中 linkhttp://t.csdnimg.cn/UJQNb 已经谈到了关于打开Androidstuidio开发的软件后明明没有报错却无法运行&#xff08;具体表现为应用程序闪退的问题&#xff…

MySQL之创建时间类型的字段表

mysql之创建时间类型的字段表 CREATE TABLE tab(birthday DATE, -- 生日job_time DATETIME, -- 记录年月日时分秒login_time TIMESTAMP -- 时间戳NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP )解释&#xff1a; NOT NULL DEFAULT &#xff1a;默认不为空…

快速幂(C语言)

前言 快速幂算法一般用于高次幂取模的题目中&#xff0c;比如求3的10000次方对7取模。这时候有些同学会说&#xff1a;这还不简单&#xff1f;我直接调用pow函数然后对结果%7不得了么&#xff1f;可是3的10000次方这么庞大的数字&#xff0c;真的能储存在计算机里么&#xff1f…

Logstash输入Kafka输出Es配置

Logstash介绍 Logstash是一个开源的数据收集引擎&#xff0c;具有实时管道功能。它可以从各种数据源中动态地统一和标准化数据&#xff0c;并将其发送到你选择的目的地。Logstash的早期目标主要是用于收集日志&#xff0c;但现在的功能已经远远超出这个范围。任何事件类型都可…

技术资讯:VSCode大更新,这两个功能终于有了

大家好&#xff0c;我是大澈&#xff01; 本文约1200字&#xff0c;整篇阅读大约需要2分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01; 1. 资讯速览 就在前阵子&#xff0c;前端人都…

【Android嵌入式开发及实训课程实验】【项目1】 图形界面——计算器项目

【项目1】 图形界面——计算器项目 需求分析界面设计实施1、创建项目2、 界面实现实现代码1.activity_main.xml2.Java代码 - MainActivity.java 3、运行测试 注意点结束~ 需求分析 开发一个简单的计算器项目&#xff0c;该程序只能进行加减乘除运算。要求界面美观&#xff0c;…

【Java 基础】27 XML 解析

文章目录 1.SAX 解析器1&#xff09;什么是 SAX2&#xff09;SAX 工作流程初始化实现事件处理类解析 3&#xff09;示例代码 2.DOM 解析器1&#xff09;什么是 DOM2&#xff09;DOM 工作流程初始化解析 XML 文档操作 DOM 树 3&#xff09;示例代码 总结 在项目开发中&#xff0…

电脑ffmpeg.dll丢失如何修复?3个详细修复的教程分享

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“ffmpeg.dll丢失”。ffmpeg.dll是FFmpeg多媒体框架中的一个重要组件&#xff0c;它负责处理音频和视频的编解码。当这个文件丢失或损坏时&#xff0c;可能会导致一些应用程序无法正常运行。…

iframe 与主应用页面之间如何互相通信传递数据

背景 当我们的Web页面需要复用现有网站的页面时&#xff0c;我们通常会考虑代码层面的抽离引用&#xff0c;但是对于一些过于复杂的页面&#xff0c;通过 iframe 嵌套现有的网站页面也是一种不错的方式&#xff0c;。目前我就职的项目组就有多个业务利用 iframe 完成业务的复用…

【数据结构】堆的模拟实现

前言:前面我们学习了顺序表、单链表、栈、队列&#xff0c;今天我们就开始新的学习吧&#xff0c;今天我们将进入堆的学习&#xff01;(最近博主处于低谷期)一起加油吧各位。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:数据结构 &…

在AWS EC2中部署和使用Apache Superset的方案

大纲 1 Superset部署1.1 启动AWS EC21.2 下载Superset Docker文件1.3 修改Dockerfile1.4 配置管理员1.5 结果展示1.6 检查数据库驱动1.7 常见错误处理 2 Glue&#xff08;可选参考&#xff09;3 IAM与安全组3.1 使用AWS Athena3.2 使用AWS RedShift或AWS RDS3.2.1 查看AWS Reds…

MySQL8.0默认配置详解--持续更新中

binlog日志的默认保留数量和大小 在MySQL 8.0中&#xff0c;您可以使用以下SQL命令来查询binlog日志的默认保留数量和大小&#xff1a; SHOW VARIABLES LIKE binlog_expire_logs_seconds; SHOW VARIABLES LIKE max_binlog_size;binlog_expire_logs_seconds 变量表示binlog日志…

食品进销存系统哪个好?亿发商品信息管理系统,操作简单好用,可定制

元旦将近&#xff0c;年的味道也越来越浓厚。年货置办的人越来越多&#xff0c;食品店也迎来年底的生意旺季。但众所周知&#xff0c;食品行业作为一个商品品类众多、品牌繁多且商品销售价格波动频繁的领域&#xff0c;常常面临商品批次管理的挑战&#xff0c;特别是需要注意避…

智能优化算法应用:基于群居蜘蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于群居蜘蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于群居蜘蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.群居蜘蛛算法4.实验参数设定5.算法结果6.…

【LuatOS】简单案例网页点灯

材料 硬件&#xff1a;合宙ESP32C3简约版&#xff0c;BH1750光照度模块&#xff0c;0.96寸OLED(4P_IIC)&#xff0c;杜邦线若干 接线&#xff1a; ESP32C3.GND — OLED.GND — BH1750.GND ESP32C3.3.3V — OLED.VCC — BH1750.VCC ESP32C3.GPIO5 — OLED.SCL — BH1750.SCL E…

人工智能导论习题集(1)

第二章&#xff1a;知识表示 题1题2题3题4题5 题1 题2 题3 题4 题5

【从零开始学习JVM | 第六篇】快速了解 直接内存

前言&#xff1a; 当谈及Java虚拟机&#xff08;JVM&#xff09;的内存管理时&#xff0c;我们通常会想到堆内存和栈内存。然而&#xff0c;还有一种被称为"直接内存"的特殊内存区域&#xff0c;它在Java应用程序中起着重要的作用。直接内存提供了一种与Java堆内存和…

DRBD分布式存储实验

DRBD DRBD的全称为&#xff1a;Distributed Replicated Block Device (DRBD) 分布式块设备复制 与心跳连接结合使用&#xff0c;构建高可用性(HA)的集群。 实现方式是通过网络来镜像(mirror)整个设备。它允许用户在远程机器上建立一个本地块设备的实时镜像。DRBD负责接收数据…

[Linux] Tomcat

一、Tomcat相关知识 1.1 Tomcat的简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;是 Apache 软件基金会的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。Tomc…