按照 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容器查看数据