Docker Compose部署实战

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Docker Compose部署实战

Compose

官方编排工具。简单来说就是项目部署。详情可以参考之前的文章Docekr三剑客之 Docekr compose

一、安装和卸载

1.1 安装

在 Linux 上的也安装十分简单,从 GitHub Release 处直接下载编译好的二进制文件即可。

例如,在 Linux 64 位系统上直接下载对应的二进制包。

// 先把docker-compose文件dump到当前目录
wget https://github.com/docker/compose/releases/download/v2.12.2/docker-composelinux-x86_64
// 然后拷贝到/usr/bin/
$ sudo cp -arf docker-compose-linux-x86_64 /usr/bin/docker-compose
$ sudo chmod +x /usr/bin/docker-compose
1.2 卸载

如果是二进制包方式安装的,删除二进制文件即可。

sudo rm /usr/bin/docker-compose

二、实战部署

2.1 下载代码
git clone https://gitee.com/nickdemo/helloworld.git
2.2 在同一级目录下创建Dockerfile.compose文件
vim Dockerfile.compose
FROM golang:1.18
ADD ./helloworld /go/src/helloworld/
WORKDIR /go/src/helloworld
RUN go env -w GOPROXY=$http_proxy
RUN CGO_ENABLE=0 GOOS=linux GOARCH=amd64 go build -o app .
FROM ubuntu:latest
COPY ./helloworld/curl-amd64 /usr/bin/curl
RUN chmod +x /usr/bin/curl
ENV env1=env1value
ENV env2=env2value
WORKDIR /app/
COPY --from=0 /go/src/helloworld/app ./
EXPOSE 80
ENTRYPOINT ["./app"]
CMD ["--param1=p1","--param2=p2"]
2.3 在同一级目录下创建docker-compose.yaml文件
vim docker-compose.yaml
version: '3.7'
# 定义项目中的服务
services:
  # 名为web的服务
  web:
    # 根据配置构建镜像
    build:
      # 构建镜像的上下文
      context: .
      # 构建镜像的dockerfile
      dockerfile: Dockerfile.compose
      # 构建参数
      args:
        http_proxy: https://proxy.golang.com.cn,https://goproxy.cn,direct
      # 设置labels元数据
      labels:
        myhello: 1.0
        com.example.description: "Accounting webapp"
      # 为构建的镜像指定tags
      tags:
      - "myhello:1.0.0"
      - "localhost:5000/myhello:1.0.0"
    # 指定容器名称
    container_name: "myweb"
    # 设置容器依赖关系,表示web服务依赖于redis服务
    depends_on:
    - redis
    # 运行容器的端口映射
    ports:
    - "80:80"
    # 覆盖容器的cmd指令
    command: ["--param1=1","--param2=2"]
    # 设置环境变量
    environment:
      env1: "a"
      env2: "b"
    # 健康检查
    healthcheck:
      # 检查命令
      #test: ["CMD","curl","http://localhost/health"] 
      test: ["CMD-SHELL","statuscode=`curl -o /dev/null -s -w %{http_code} http://localhost/health`; [ $$statuscode -le 400 ] || exit 1"]
      # 检查时间间隔
      interval: 5s
      # 检查超时时间
      timeout: 1s
      # 重试次数,即连续失败指定次数则判定为不健康
      retries: 5
      # 设置容器初始化时间,再次期间不报告健康检查状态
      start_period: 5s
    # 使用定义的网络
    networks:
    - mynetwork
    - net1
  # 名为 redis的服务
  redis:
    # 服务启动镜像
    image: "redis:latest"
    container_name: "myredis"
    # 容器暴露端口
    expose:
    - 6379
    # 指定容器启动命令,即覆盖cmd指令
    command: redis-server --requirepass 123456
    # 数据卷设置
    volumes:
    - /data
    networks:
    - mynetwork
    - net2
# 定义网络
networks:
  net1: {}
  net2: {}
  mynetwork:
    ipam:
      driver: default
      config:
      - subnet: "172.16.238.0/24"
2.4 验证docker-compose.yaml文件正确性

注意: 以下 docker-compose 命令都是在项目目录下,否则就需要指定相关配置文件。

docker-compose -f docker-compose.yaml config

如果config命令原样输出配置文件,就说明配置文件没有问题了。

2.5 启动应用程序

建议在项目文件夹下操作docker-compose,否则就需要显式指定项目名称和配置文件了。启动前确定配置文件中的端口没有被占用。

docker-compose up -d
2.6 查看容器名称和服务名称

myredis 和 myweb 是容器的名字,docker-compose 操作的对象是服务(redis、web)。

docker-compose ps

验证服务是否正常运行,返回ok即正常运行

curl http://localhost/health

查看日志 操作的对象就是服务了web 或 redis

验证redis服务,通过 key value 设置键值对,再通过key获取对应的值。

进入到redis容器,也能成功查看name的值。

2.7 重新编译

修改配置文件以及代码后需要重新编译,可以使用–no-cahe 指定不需要使用缓存。

docker-compose build --no-cache 

2.8 重启项目
docker-compose restart

容器呢,不会因为你重新编译了新镜像,就去更换启动镜像。除非down掉,再up。

2.9 关闭项目
docker-compose down

2.10 停止及启动指定服务
docker-compose stop 
docker-compose start server_name

如果不指定服务名,默认停止/启动所有服务。


推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习:

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5天前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
152 91
|
6天前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
21天前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
13天前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
72 44
|
12天前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
91 42
|
4天前
|
消息中间件 Kafka Docker
docker compose 安装 kafka
通过本文的步骤,您可以快速在本地使用 Docker Compose 安装并配置 Kafka 和 Zookeeper。Docker Compose 简化了多容器应用的管理,方便快速搭建和测试分布式系统。
35 2
|
1月前
|
存储 Docker 容器
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用
88 27
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
58 23
|
25天前
|
SQL Java Maven
docker部署apollo
docker部署apollo步骤
|
1月前
|
存储 Docker 容器
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用。掌握这些Docker基础概念和操作,可以显著提高开发和部署效率,确保应用程序的可移植性和可扩展性。
74 22