Docker 官方安装说明地址linux
解释一下上图的几个关键词:redis
Client
:这就是你所看到的 docker 控制终端.DOCKER_HOST
:这是 docker 运行的总体运行时上下文Docker daemon
:这是 Docker 的守护程序,由他来和 Client 进行通讯,获取 Client 的命令,并对 Image Container 等组件进行统一管理.Images
:这是一切容器运行的模板或者是基础,容器都是经过 image 来建立的.Containers
:由 Image 所建立的运行实例,程序都运行在容器中,一个 Image 能够扩展出 N 个 ContainerDocker Registry
: Docker Image 的存放库,通常状况下都是使用官方的 DockerHub.com.不过,你也能够搭建本身的 Docker Registry 将 Image 管理私有化.Docker 安装成功后,请你在命令行中使用docker info
来确认 Docker 是否正确的安装在本地环境中.docker
docker run -t -i ubuntu /bin/bash
shell
若是,启动成功的话,你会看到你的命令行变成ubuntu
root@c8fabbcb9f8a:/#
vim
@
符号后面的这串字符可能和个人不太同样,他们都是随机生成的容器 IDbash
你能够尝试在 Container 终端中使用 ps aux
,hostname
,ip a
等命令,来体会容器的便利性.网络
你还能够在 Container 中安装你所须要的工具,你可使用 apt-get update && apt-get install vim
来给他安装 vim.架构
请你记住,只要不是在 Image 中所包含的,当 Container 被 Remove 后,这一切都将不复存在.微服务
接着,咱们来一个个解释命令是什么意思:
docker run
:让 docker 启动一个容器的命令.-t
:建立一个虚拟的 TTY 终端.-i
:表明咱们建立的 Container 是会被捕获 STDIN
的.ubuntu
:这是咱们启动 Container 所对应的 Image,若是须要指定版本的话能够经过 ubuntu:18.04
这种方式./bin/bash
:这是当 Container 启动完成后,就会执行这个命令.最后,输入exit
接上回车来中止这个终端.这时候你会退回到你本身的操做系统终端中,那咱们怎么去看刚刚建立的容器去哪里了呢.
输入docker ps -a
你会看到下面这样的内容
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8fabbcb9f8a ubuntu "/bin/bash" 7 seconds ago Exited (0) 4 seconds ago elated_banzai
复制代码
咱们能够经过这些发现不少有用的信息:
CONTAINER ID
:咱们以前 tty 里面看到的容器 ID.IMAGE
: Container 所使用的容器.COMMAND
: Container 启动后所使用的命令.CREATED
: Container 建立的时间.STATUS
: Container 目前的状态.PORTS
: Container 所暴露出内部的端口,不过咱们这个实例没有,后面的实例中咱们会看到的具体的操做和概念.NAMES
:Container 的名字,咱们能够在 container run 的时候经过--name
指定名字,若是没有指定,那么 docker 会自动生成一个名字.docker ps
,docker container ls
这 2 个命令有一样的结果,就是查看当前正在运行的 Containers.若是,须要查看全部的容器,须要在命令后面加上-a
docker start elated_banzai
或者docker start c8fabbcb9f8a
在 docker start
命令后面跟上 container 的 name 或者 id 均可以从新启动它.
可是,咱们会发现此次启动之后,咱们没有进入终端,可是查看最新的状态,他倒是 UP 的状态.这是为何呢
由于,咱们此次只是重启了 Container,可是并无经过 tty
链接到这个容器上去.
那咱们还想链接回去怎么办呢,下面咱们会讲到
docker exec -i -t elated_banzai /bin/bash
固然,上面使用 Container name
的地方也能够互换为 Container id
.在 docker 命令中,全部指定 Container 的地方,都是 name
和 id
能够互换的.
这个命令比较简单,与 docker run
基本上是相似的,这里就不作展开讲解了.
首先,咱们下面的命令,来建立一个叫 log_container
的 Container
docker run -d --name log_container ubuntu /bin/sh -c "while true;do echo hello world; sleep 3; done"
这时,可能你会发现,这条命令里面多了一个 -d
的配置,他是用来指定使用 daemon 的模式来运行这个 Container.
咱们在最后写了一个死循环的 shell 脚本,让他每 3 秒输出一个 hello world.
回车之后,他只是输出了这个 container 的 id
,咱们能够经过下面的命令结合 id
或者 name
来看输出的内容.
docker logs log_container
添加-f
来持续查看他的输出,这个和 linux 中的 tail
命令是相似的.
咱们还能够添加-t
来查看输出的时间戳.
docker top name/id
docker stats
,docker stats ContainerName1 ContainerName2...
docker stop name/id
docker rm name/id
这个命令若是不添加-f
,那咱们只能删除已经中止的容器.
docker inspect name/id
这个命令显示的内容比较多,不过大部分都能经过keyname
看懂,若是有不清楚的部分请自行查阅相关文档.
docker images
,docker image ls
docker images
Dockerfile
是一个使用基本的 Docker DSL 语法的指令来构建 Docker Image 的文件. 经过,Dockerfile
来构建 Image ,更具有重复性,透明性和幂等性.
基础理论基本上介绍的差很少了,那么咱们直接上干货.
首先,咱们建立 Redis 的主镜像
$ mkdir redis-replica
$ cd redis-replica
$ touch Dockerfile
复制代码
Dockerfile:
#使用的母镜像
FROM redis
#维护者信息,这里填的是我本身的邮箱
MAINTAINER crowhyc@163.com
#环境变量,添加之后能够在容器和接下来的命令里面均可以使用
#这个环境变量是用于定义这个镜像的版本和日期
ENV REFESHED_AT 2020-04-01
#用来向基于Image建立的 Container 添加卷
#一个卷是能够存在于一个或多个 Container 内特定的目录,这个目录能够共享数据或对数据进行持久化功能
#下面这个 VOLUME 会在 Container 里面建立这 2 个目录
VOLUME ["/var/lib/redis","/var/log/redis/"] #基于此 Image 建立的 Container 会对外暴露 6379 接口
#能够经过 docker ports name/id 来查询 Container 暴露接口与本地接口所映射的关系
#也能够在 Container docker run 的时候经过-p 6379:6379 把他绑定到指定的 port 上
EXPOSE 6379
#用于指定一个 Container 启动时要运行的命令,相似于后面会遇到的 RUN 命令
#只是 RUN 指令是指定 Image 被构建时须要运行的命令
#docker run 命令能够覆盖 CMD 命令,这里留空的目的是让 docker run 的时候能够自定义须要执行的命令
#后面介绍到的 ENTRYPOINT 命令则不能够被覆盖
CMD [] 复制代码
保存文件后,咱们运行下面的这条命令
docker build -t crowhyc/redis-replica:1.0 .
咱们来解释一下这条命令
docker build
是用来建立镜像的.
-t
和crowhyc/redis-replica:1.0
是用来代表后面咱们会用这种格式的方式来指定 Image 的名称和版本.
最后,还有一个不起眼的.
这个是用来指定 Dockerfile 的地址..
是说明 Dockerfile 就在当前目录下
咱们不会 run 这个 Image.它是接下来咱们 redis-primary 和 redis-slave 的母镜像
$ mkdir redis-primary
$ cd redis-primary
$ touch Dockerfile
复制代码
FROM crowhyc/redis-primary:1.0
MAINTAINER crowhyc "crowhyc@163.com"
ENV REFRESHED_AT 2020-04-01
#是 Container 启动之后执行的命令,与 CMD 不一样,Container 启动的命令不能覆盖它
ENTRYPOINT ["redis-server","--logfile /var/log/redis/redis-server.log"] 复制代码
紧接着,咱们建立 redis 的主镜像
docker build -t crowhyc/redis-primary:1.0 .
$ mkdir redis-slave
$ cd redis-slave
$ touch Dockerfile
复制代码
FROM crowhyc/redis-replica:1.0
MAINTAINER crowhyc "crowhyc@163.com"
ENV REFRESHED_AT 2020-04-01
#这里有一点须要注意的是,咱们第三个参数使用的是 redis-primary 当咱们启动 primary Container 的时候须要与这个名字相同
ENTRYPOINT ["redis-server","--logfile /var/log/redis/redis-server.log","--slaveof redis-primary 6379"] 复制代码
docker network create redis-cluster
首先,咱们使用上面的命令建立一个新的 network.
docker network
是 docker Container 之间用来通讯的网络,用户能够本身建立网络,用来组件本身的集群网络.
docker network ls
一样,咱们也能够用上面的命令来查看全部的网络
接着,咱们使用下面的docker run
来启动咱们的 primary redis server.
docker run -d -h redis-primary --net redis-cluster --name reids-primary crowhyc/redis-primary:1.0
-h
是一个以前没有出现过的新标志,他用来设置 Container 的 hostname,这会覆盖默认的行为即将 Container 主机名设置为 ContainerId.
使用这个标志能够保证redis-primary
被做为 Container 的 hostname,并被本地的 DNS 服务正确解析.
--net
是用来设定这个 Container 所使用的 Network
咱们输入 docker logs 命令去查看日志
docker logs -f redis-primary
稍做等待,你会发现--根本什么都没有...那这是为何呢?
这是由于咱们在作 redis-primary
的时候,让日志记录到了/var/log/redis/redis-server.log 这个文件里面.
接着,咱们用更加巧妙的方式去观察相似这种状况下的日志输出.
docker run -it --rm --volumes-from redis-primary ubuntu cat /var/log/redis/redis-server.log
这下咱们就能看到对应的 redis-primary
的日志了,若是出现了Ready to accept connections
说明 redis-primary
已经启动成功.
接着咱们来为他启动 2 个 redis-slave
吧
docker run -d -h redis-slave01 --net redis-cluster crowhyc/redis-slave:1.0
docker run -d -h redis-slave02 --net redis-cluster crowhyc/redis-slave:1.0
接着咱们用上面刚刚学的 docker run 来观察 slave 是否和 primary 创建了联系 docker run -it --rm --volumes-from redis-slave01 ubuntu cat /var/log/redis/redis-server.log
docker run -it --rm --volumes-from redis-slave02 ubuntu cat /var/log/redis/redis-server.log
若是,咱们能看到相似于MASTER <-> REPLICA sync: Finished with success
这样的日志,说明咱们 slave 与 primary 已经链接成功了 接下来,咱们用 docker 的方式来测试 redis 吧
docker run -it --rm --net redis-cluster redis /bin/bash
紧接着咱们链接到 redis-primary
redis-cli -h redis-primary
而后,咱们 SET 一个值
redis-primary:6379> set "test" 1234
接着,咱们再进入 redis-slave01
docker exec -it redis-slave01 /bin/bash
redis-cli -h localhost
get "test"
若是,咱们在执行完get
命令后看到了"1234"说明咱们的 redis 集群已经完成搭建了.