Docker案例

关闭防火墙

# 关闭防火墙
systemctl stop firewalld.service
# 禁止防火墙开机启动
systemctl disable firewalld.service

启动或重启docker

# 启动docker
systemctl start docker
# 重启docker
systemctl restart docker

redis

加载镜像

docker load < redis-docker-image.gz

启动容器

docker run -d --name redis7000 -p 7000:6379 redis

jedis 连接测试

新建测试项目

新建项目

pom.xml

添加 redis 和 junit 依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.tedu</groupId>
  <artifactId>docker</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
  	<dependency>
  		<groupId>redis.clients</groupId>
  		<artifactId>jedis</artifactId>
  		<version>2.9.0</version>
  	</dependency>
  	<dependency>
  		<groupId>junit</groupId>
  		<artifactId>junit</artifactId>
  		<version>4.12</version>
  	</dependency>
  </dependencies>
</project>

编写测试类

package docker;

import org.junit.Test;
import redis.clients.jedis.Jedis;

public class Test1 {
	@Test
	public void test1() {
		Jedis j = new Jedis("192.168.64.150", 7000);
		j.set("key1", "value1");
		
		String v = j.get("key1");
		System.out.println(v);
		
		j.close();
	}
}

在容器中查看数据

# 进入容器
docker exec -it redis7000 bash

# 运行redis客户端工具
redis-cli
127.0.0.1:6379> keys *
1) "key1"
127.0.0.1:6379> get key1
"value1"

启动多个 redis 容器

启动三个redis容器,将端口分别映射到7000,7001和7002端口

# 如果7000已经启动,不必重复启动
docker run -d --name redis7000 -p 7000:6379 redis

docker run -d --name redis7001 -p 7001:6379 redis
docker run -d --name redis7002 -p 7002:6379 redis

# 查看容器
docker ps -a
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
756f5227dd64        redis               "docker-entrypoint.s…"   6 seconds ago       Up 4 seconds        0.0.0.0:7001->6379/tcp   redis7001
bc87e35664c8        redis               "docker-entrypoint.s…"   13 seconds ago      Up 11 seconds       0.0.0.0:7002->6379/tcp   redis7002
c3700e3e4c73        redis               "docker-entrypoint.s…"   2 hours ago         Up 2 hours          0.0.0.0:7000->6379/tcp   redis7000

jedis 分片测试

编写测试方法

	@Test
	public void test2() {
		JedisPoolConfig cfg = new JedisPoolConfig();
		cfg.setMaxTotal(500);
		cfg.setMaxIdle(20);
		
		List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
		shards.add(new JedisShardInfo("192.168.64.150", 7000));
		shards.add(new JedisShardInfo("192.168.64.150", 7001));
		shards.add(new JedisShardInfo("192.168.64.150", 7002));
		
		ShardedJedisPool pool = new ShardedJedisPool(cfg, shards);
		
		ShardedJedis j = pool.getResource();
		for (int i = 0; i < 100; i++) {
			j.set("key"+i, "value"+i);
		}
		
		pool.close();
	}

在容器中查看数据

分别进入三个redis容器,执行 keys *查看结果

docker exec -it redis7000 redis-cli
docker exec -it redis7001 redis-cli
docker exec -it redis7002 redis-cli

容器互联

创建docker虚拟网络

docker network create --subnet=172.18.0.0/24 dockernet

ifconfig

mysql

加载 mariadb 镜像

docker load < mariadb-docker-image.gz

创建数据卷

docker volume create mysql-data

启动 mariadb 容器,并挂载数据卷

docker run -d --name mysql --net dockernet --ip 172.18.0.11 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mariadb

docker ps -a

docker inspect mysql

进入容器,登录mysql测试

docker exec -it mysql bash

mysql -uroot -p

连接数据库,导入数据

数据库

数据库

选择 资料/docker/EasyMall/easymall.sql

tomcat

启动 tomcat 容器

先上传 ROOT.war 文件到 /opt/webapps 目录:
a

docker run -d --name tomcat --net dockernet --ip 172.18.0.12 -v /opt/webapps:/usr/local/tomcat/webapps -p 80:8080 tomcat

访问测试

### Docker 使用案例与实践示例 #### Web 应用的容器化 Docker 可以轻松实现 Web 应用程序的容器化。例如,在一个典型的 LAMP(Linux, Apache, MySQL, PHP)栈中,可以通过构建自定义镜像来封装整个应用程序及其依赖项[^4]。这不仅简化了部署过程,还确保了不同环境中的一致性。 以下是基于 Node.js 的简单 Web 应用程序容器化的具体例子: ```dockerfile # 基础镜像 FROM node:14-alpine # 设置工作目录 WORKDIR /app # 复制 package.json 和 package-lock.json 到容器中 COPY package*.json ./ # 安装依赖 RUN npm install # 将应用文件复制到容器中 COPY . . # 暴露端口 EXPOSE 3000 # 启动命令 CMD ["npm", "start"] ``` 此 `Dockerfile` 文件定义了一个完整的开发环境,并允许开发者通过简单的 `docker build` 和 `docker run` 命令快速启动应用程序。 --- #### CI/CD 集成 在持续集成和交付 (CI/CD) 流程中,Docker 提供了一种标准化的方式来打包和测试代码。许多流行的 CI 工具(如 Jenkins、GitLab CI 或 Travis CI)都支持直接使用 Docker 镜像作为构建环境的一部分[^1]。这样可以减少配置时间并提高可靠性。 下面是一个 GitLab CI 配置的例子,展示如何利用 Docker 执行自动化测试: ```yaml stages: - test - deploy test_job: stage: test image: node:14-alpine script: - npm install - npm test deploy_job: stage: deploy image: python:3.9-slim script: - pip install awscli - aws s3 cp dist/ s3://my-bucket/ ``` 这种做法显著减少了因环境差异而导致的错误风险。 --- #### 微服务架构的支持 对于采用微服务设计的应用程序来说,Docker 是理想的选择之一。它允许多个小型服务各自运行在一个独立的容器里,从而增强了系统的可维护性和弹性。此外,借助 Kubernetes 等编排工具,还可以进一步提升管理效率和服务可用性。 假设有一个电商网站由订单处理模块、库存管理系统以及支付网关组成,则每个组件都可以分别被打包为单独的 Docker 镜像[^2]。之后再通过 Compose 文件协调它们之间的交互关系: ```yaml version: '3' services: order-service: image: myrepo/orderservice:v1 ports: - "8081:80" inventory-service: image: myrepo/inventoryservice:v1 ports: - "8082:80" payment-gateway: image: myrepo/paymentgateway:v1 ports: - "8083:80" ``` 上述方法有助于降低复杂度的同时也促进了团队协作。 --- #### 资源高效的批量计算任务 当面对大量短周期型作业时——比如视频转码、数据分析或者机器学习模型训练等场景下,Docker 凭借其低开销特性成为首选解决方案之一[^3]。相比于传统的虚拟机方式,它可以更快地完成初始化操作并且消耗更少内存资源。 举个例子,如果需要对一批图片进行缩放转换,那么完全可以编写如下脚本并将之放入容器内部执行: ```bash #!/bin/bash for file in *.jpg; do convert "$file" -resize 50% "${file%.jpg}-resized.jpg" done ``` 随后按照常规流程制作对应的镜像并通过调度平台分配给多台服务器并发处理这些请求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扎瓦江石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值