docker学习笔记(二)

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。
在容器中管理数据有两种方式,数据卷和挂载主机目录.

数据卷

docker volume create volumeName    新建一个数据卷

docker volume ls          查看所有数据卷

docker volume inspect volumeName   查看指定数据卷信息

启动挂载数据卷的容器

docker run -it -v volumeName:/webapps centos:7 bash  # -v volumeName:/webapps  把数据卷挂载到容器的/webapps目录下

docker volume rm volumeName   删除指定的数据卷,如被容器使用则无法删除

docker volume prune        清理无主数据卷

挂载主机目录

docker run -ir -v /usr/app:/opt/app centos:7 bash  把宿主机的/usr/app目录挂载到容器的/opt/app下,

-v   如果本地目录不存在,docker自动创建

网络

docker run -d -P ...            P大写是自动分配映射端口

docker run -d -p 80:8080          p小写是自定映射端口

docker run -d -p 192.168.65.110:80:8080 ... 指定网卡和映射端口

docker run -d -p 192.168.65.110::8080...    指定网卡自动分配映射端口

容器之间要通信则需要指定容器ip,创建网络,如tomcat访问mysql时,mysql必须得有ip才能访问

创建网络

docker network create -d bridge my-network           自动创建网络       

# -d driver,网络类型,默认bridge,也可是overlay

docker network create --subnet=172.18.0.0/24 my-network   指定ip创建网络

docker network ls     查看所有网络

连接容器

docker run -it --name app1 --network my-network centos:7  终端1中执行

docker run -it --name app2 --network my-network centos:7  终端2中执行

在两个终端中分别执行

ping app1

ping app2

显示如下:

[root@35569c623c4c /]# ping app1
PING app1 (172.18.0.2) 56(84) bytes of data.
64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=1 ttl=64 time=0.577 ms
64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from 35569c623c4c (172.18.0.2): icmp_seq=3 ttl=64 time=0.066 ms
......

多分容器互联,推荐使用Docker Compose

案例1:创建mysql容器

创建docker虚拟网络

docker network create --subnet=172.18.0.0/24 dockernet

创建数据卷

docker volume create mysql-data

启动mysql容器

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 mysql:5.7 --character-set-server=utf8

#容器名为mysql,ip为172.18.0.11,将数据卷mysql-data挂载到容器/var/lib/mysql目录,设置root密码为root,指定3306端口映射,设置utf编码格式

进入mysql容器,登录测试

docker exec -it mysql bash

mysql -uroot -p

root

显示如下图:

用mysql工具连接mysql.如SQLyog,导入数据,执行操作

案例二:创建redis容器

拉取redis镜像

docker pull redis:5

启动redis容器,指定7000端口映射

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

进入redis容器

docker exec -it redis7000 bash

进入reids客户端,测试

redis-cli -p 6379  #默认端口为6379则-p 6379可省略直接redis-cli进入

root@069b538d4508:/data# redis-cli -p 6379
127.0.0.1:6379> set a aaaa
OK
127.0.0.1:6379> set b bbbb
OK
127.0.0.1:6379> set c ccc
OK
127.0.0.1:6379> keys *
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> get a
"aaaa"
127.0.0.1:6379> get b
"bbbb"
127.0.0.1:6379>

启动多个redis容器

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

docker run -d --name reids7001 -p 7001:6379 redis:5

docker run -d --name reids7002 -p 7002:6379 redis:5

jedis分片测试:

编写测试方法

@Test
public void test02(){
  //1.创建分片的连接池
  JedisPoolConfig poolConfig = new JedisPoolConfig();
  poolConfig.setMaxTotal(500);
  poolConfig.setMaxIdle(20);
  //2.准备redis的分片
  List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
  shards.add(new JedisShardInfo("192.168.85.101", 7000));
  shards.add(new JedisShardInfo("192.168.85.101", 7001));
  shards.add(new JedisShardInfo("192.168.85.101", 7002));
  //3.创建分片的对象
  ShardedJedisPool jedisPool = 
  new ShardedJedisPool(poolConfig, shards);
  //4获取jedis对象
  ShardedJedis shardedJedis = jedisPool.getResource();
  //5.redis的存取值操作
  for (int i = 0; i < 9; i++) {
    shardedJedis.set("n"+i,"我是分片操作"+i);
  }

  jedisPool.close()

分别进入3个redis容器查看数据

 

转载于:https://www.cnblogs.com/nanbcdx/p/11417685.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值