https://gitee.com/fakerlove/docker
Docker 教程
1. 简介
1.1 概念
Docker 是世界领先的软件容器平台。 开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。 运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。 企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。
1.2 优点
Docker容器比虚拟机轻量多了!
1.3 安装
环境准备
# 3.10 以上的系统内核
[root@izbp10tup89om84qulgxbsz ~]# uname -r
3.10.0-514.26.2.el7.x86_64
# 系统版本为:CentOS 7
[root@izbp10tup89om84qulgxbsz ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
安装
安装教程
https://docs.docker.com/engine/install/centos/
第一步:不管有没有,先卸载旧版本:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
第二步:安装需要的包:
yum install -y yum-utils
第三步:设置镜像的仓库(选择国内阿里云的地址):
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
第四步:更新yum软件包的索引,确保你下载的是最新版:
yum makecache fast
centos 8
yum makecache
第五步:安装docker相关的内容:
ce表示社区版,ee表示企业版
yum install docker-ce docker-ce-cli containerd.io
出现的问题
Error: Problem: package docker-ce-3:20.10.2-3.el7.x86_64 requires containerd.io >= 1.4.1, but none of the providers can be installed
- cannot install the best candidate for the job
- package containerd.io-1.4.3-3.1.el7.x86_64 is filtered out by modular filtering (try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
解决方案
原因是container.io 版本过低了。
配置阿里镜像
yum install -y wget
wget -O /etc/yum.repos.d/CenOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
yum clean all
下载最新版本的container.io
yum install -y https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.4.3-3.1.el8.x86_64.rpm
yum install docker-ce docker-ce-cli -y
第六步:启动docker:
systemctl start docker
第七步:查看docker版本(我的版本是19.03.13):
docker version
第八步:测试hello-world:
docker run hello-world
查看已下载的镜像:
[root@izbp10tup89om84qulgxbsz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 10 months ago 13.3kB
123
使用阿里云镜像加速
在阿里云的容器镜像服务中,找到镜像加速器,选择CentOS,执行里面的代码即可:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://4w8nh8qq.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
- 补充(卸载docker):
# 卸载软件
yum remove docker-ce docker-ce-cli containerd.io
# 删除目录 (docker的默认工作路径:/var/lib/docker)
rm -rf /var/lib/docker
- hello-world镜像的执行流程回顾
2. 入门常用命令
Docker官方文档地址:https://hub.docker.com/
2.1 docker的帮助命令
# 查看 docker 的版本
docker version
# 查看 docker 的详细信息(系统信息、镜像和容器的数量)
docker info
# 查看 docker 的所有命令
docker --help
2.2 docker的镜像命令
查看镜像
docker images
具体内容
# 查看所有的本地镜像
[root@izbp10tup89om84qulgxbsz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 10 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
[root@izbp10tup89om84qulgxbsz ~]# docker images --help
Options:
-a, --all Show all images (default hides intermediate images)(列出所有的镜像)
-q, --quiet Only show numeric IDs (只显示镜像的ID)
# 列出所有的镜像且只显示ID
[root@izbp10tup89om84qulgxbsz ~]# docker images -aq
bf756fb1ae65
搜索镜像
docker search mysql
具体内容
# 从DockerHub仓库中搜索镜像
[root@izbp10tup89om84qulgxbsz ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10129 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3724 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 740 [OK]
# 可选项
[root@izbp10tup89om84qulgxbsz ~]# docker search --help
Options:
-f, --filter filter Filter output based on conditions provided (搜索过滤)
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
# 搜索收藏量不小于5000的镜像
[root@izbp10tup89om84qulgxbsz ~]# docker search mysql --filter=STARS=5000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10129 [OK]
下载镜像
docker pull mysql
具体内容
# 下载镜像 docker pull 镜像名[:tag]
[root@izbp10tup89om84qulgxbsz ~]# docker pull mysql
Using default tag: latest # 如果不指定tag,就会下载最新版的镜像
latest: Pulling from library/mysql
bb79b6b2107f: Pull complete # 联合文件系统的分层下载
49e22f6fb9f7: Pull complete
842b1255668c: Pull complete
9f48d1f43000: Pull complete
c693f0615bce: Pull complete
8a621b9dbed2: Pull complete
0807d32aef13: Pull complete
a56aca0feb17: Pull complete
de9d45fd0f07: Pull complete
1d68a49161cc: Pull complete
d16d318b774e: Pull complete
49e112c55976: Pull complete
Digest: sha256:8c17271df53ee3b843d6e16d46cff13f22c9c04d6982eb15a9a47bd5c9ac7e2d # 签名信息(防伪)
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址 docker pull mysql 等价于 docker pull docker.io/library/mysql:latest
# 下载镜像并指定版本
[root@izbp10tup89om84qulgxbsz ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
bb79b6b2107f: Already exists # 分层下载,该文件块在下载最新版时已经下载了就不会重复下载,极大地节省内存
49e22f6fb9f7: Already exists
842b1255668c: Already exists
9f48d1f43000: Already exists
c693f0615bce: Already exists
8a621b9dbed2: Already exists
0807d32aef13: Already exists
f15d42f48bd9: Pull complete
098ceecc0c8d: Pull complete
b6fead9737bc: Pull complete
351d223d3d76: Pull complete
Digest: sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
版本可以在官方文档中查询:
删除镜像
# 根据镜像的ID删除
[root@izbp10tup89om84qulgxbsz ~]# docker rmi -f 1b12f2e9257b
# 删除所有的镜像
[root@izbp10tup89om84qulgxbsz ~]# docker rmi -f $(docker images -aq)
2.3 docker的容器命令
说明:容器需要通过镜像创建,首先下载一个 centos 镜像:
[root@izbp10tup89om84qulgxbsz ~]# docker pull centos
docker run [可选参数] image
# 参数说明
--name="Name" 给容器起名
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p (小写p)指定容器的端口
-p 主机端口:容器端口 (常用)
-p 容器端口
-P (大写P)随机指定端口
启动 centos镜像并进入容器,查看目录并退出容器:
[root@izbp10tup89om84qulgxbsz ~]# docker run -it centos /bin/bash
[root@14ce3ccc03d1 /]#
[root@14ce3ccc03d1 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@14ce3ccc03d1 /]# exit
exit
[root@izbp10tup89om84qulgxbsz ~]#
查看所有容器
docker ps -a
具体内容
# 查看正在运行中的容器
[root@izbp10tup89om84qulgxbsz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 查看所有(正在运行和曾经运行过的)容器
[root@izbp10tup89om84qulgxbsz ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14ce3ccc03d1 centos "/bin/bash" 3 minutes ago Exited (0) About a minute ago lucid_robinson
a57b7706a90b bf756fb1ae65 "/hello" 22 hours ago Exited (0) 22 hours ago jovial_morse
# 显示最近创建的1个容器
[root@izbp10tup89om84qulgxbsz ~]# docker ps -a -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14ce3ccc03d1 centos "/bin/bash" 6 minutes ago Exited (0) 4 minutes ago lucid_robinson
# 查看所有(正在运行和曾经运行过的)容器,只显示容器的编号
[root@izbp10tup89om84qulgxbsz ~]# docker ps -aq
14ce3ccc03d1
a57b7706a90b
退出容器
# 容器停止并退出
exit
# 容器不停止退出
Ctrl + P + Q
删除容器
# 根据容器id删除容器(不能删除正在运行中的容器)
docker rm 容器id
# 强制删除指定容器(正在运行中的容器也可删除)
docker rm -f 容器id
# 删除所有的容器
docker rm -f $(docker ps -aq)
启动和停止容器
# 启动容器
docker start 容器id
# 重启容器
docker restart 容器id
# 停止当前正在运行中的容器
docker stop 容器id
# 强制停止当前容器
docker kill 容器id
容器的常用其他命令:
后台启动容器:
# 注意:后台启动后,该容器仍然是停止状态
[root@izbp10tup89om84qulgxbsz ~]# docker run -d centos
48af775d21ca29566773af17346cbf5afb7c900546bf4a0de49cde0ae5180021
[root@izbp10tup89om84qulgxbsz ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48af775d21ca centos "/bin/bash" 11 seconds ago Exited (0) 10 seconds ago laughing_mccarthy
日志命令
# 显示指定行数的日志
docker logs -tf --tail 10 fa3301b94b9f
# 参数解释
-tf 显示日志
--tail 10 显示日志条数
查看容器中的进程信息
[root@izbp10tup89om84qulgxbsz ~]# docker top fa3301b94b9f
UID PID PPID C STIME TTY TIME CMD
root 20198 20174 0 14:25 pts/0 00:00:00 /bin/bash
查看容器的元数据信息:
docker inspect fa3301b94b9f
进入当前正在运行中的容器
# 方式1:进入容器后开启一个新的终端
[root@izbp10tup89om84qulgxbsz ~]# docker exec -it fa3301b94b9f /bin/bash
[root@fa3301b94b9f /]#
# 方式2: 进入容器正在进行的终端,不会启动新进程
[root@izbp10tup89om84qulgxbsz ~]# docker attach fa3301b94b9f
[root@fa3301b94b9f /]#
从容器内拷贝文件至主机:
docker cp 容器id:容器内路径 目的主机的路径
- 在容器的home目录下创建一个文件:
[root@fa3301b94b9f /]# cd home
[root@fa3301b94b9f home]# touch blu.txt
[root@fa3301b94b9f home]# ls
blu.txt
- 将文件拷贝至主机:
[root@izbp10tup89om84qulgxbsz ~]# docker cp fa3301b94b9f:/home/blu.txt /home
[root@izbp10tup89om84qulgxbsz ~]# cd /home
[root@izbp10tup89om84qulgxbsz home]# ll
total 4
drwx------ 4 blu blu 4096 Sep 22 22:02 blu
-rw-r--r-- 1 root root 0 Nov 6 14:41 blu.txt
将当前容器制作成镜像:
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名
1
# 启动 tomcat 镜像
docker run -it -p 8000:8080 tomcat
# 进入 tomcat 容器
docker exec -it a181f6fde91f /bin/bash
# 将 webapps.dist 下的所有文件复制进 webapps 目录下
cp -r webapps.dist/* webapps
# 退出容器,提交镜像
docker commit -a="BLU" -m="add webapps app" a181f6fde91f tomcat-blu:1.0
# 查看本地镜像
[root@izbp10tup89om84qulgxbsz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat-blu 1.0 792cfe32fbe1 7 seconds ago 653MB
tomcat latest dab3cf97dd54 5 days ago 648MB
2.4 总结
// 列出本地已有镜像
docker images
// 从远端下载镜像
docker pull <image name>
// 使用镜像创建并启动一个容器(若本地没有该镜像,则会先从远端下载,每次run都会生成一个容器,嗯,轻量~)
docker run hub.c.163.com/library/hello-world:latest
//列出正在运行的容器
docker ps
// 列出所有容器(包括Exited)
docker ps -a
// 启动指定的容器
docker start <container id>
// 停止指定的容器
docker stop <container id>
// 停止所有运行中的容器
docker stop $(docker ps -q)
// 删除指定容器
docker rm <container id>
//删除所有容器
docker rm $(docker ps -aq)
//停止并删除容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq)
// 删除指定镜像(删除镜像前须先停止并删除容器)
docker rmi <image id>
// 重启容器
docker restart <container id>
// 创建一个新的容器并运行一个命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-p: 端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
// 交互运行
docker run -it centos /bin/bash
/bin/bash 是进入到linux中命令行
// 进入容器
docker exec -it centos /bin/bash
// 容器拷贝到主机
docker cp <container id>:文件路径 主机目标路径
// 主机拷贝到容器
docker cp 主机文件路径 <container id>:文件路径
//查看容器IP
docker inspect -f '{{.NetworkSettings.IPAddress}}' centos
3. docker 部署练习
3.1 部署 nginx
# 下载 nginx 镜像
[root@izbp10tup89om84qulgxbsz ~]# docker pull nginx
# 启动 nginx 镜像
# -d 表示后台运行
# --name 给容器命名
# -p 暴露端口 格式:宿主机端口:容器内部端口
[root@izbp10tup89om84qulgxbsz ~]# docker run -d --name nginx01 -p:3344:80 nginx
# 本机测试连接(出现 Welcome to nginx! 即表示连接成功)
[root@izbp10tup89om84qulgxbsz ~]# curl localhost:3344
外网测试连接:
# 查看容器
[root@izbp10tup89om84qulgxbsz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
061942db0498 nginx "/docker-entrypoint.…" 20 minutes ago Up 20 minutes 0.0.0.0:3344->80/tcp nginx01
# 进入 nginx 容器
[root@izbp10tup89om84qulgxbsz ~]# docker exec -it nginx01 /bin/bash
root@061942db0498:/#
# 在容器中查找 nginx 配置文件
root@061942db0498:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
# 退出容器
root@061942db0498:/# exit
exit
# 停止容器
[root@izbp10tup89om84qulgxbsz ~]# docker stop 061942db0498
061942db0498
3.2 部署 tomcat
# 下载镜像
[root@izbp10tup89om84qulgxbsz ~]# docker pull tomcat
# 查看本地镜像
[root@izbp10tup89om84qulgxbsz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest dab3cf97dd54 4 days ago 648MB
# 启动镜像
[root@izbp10tup89om84qulgxbsz ~]# docker run -d -p 3355:8080 tomcat01 tomcat
# 本地访问
[root@izbp10tup89om84qulgxbsz ~]# curl localhost:3355
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/9.0.39</h3></body></html>\
外网测试访问(连接成功,但是报404,因为这个 tomcat 是被阉割的):
3.3 部署 elastic search
# 下载运行elasticsearch镜像
[root@izbp10tup89om84qulgxbsz ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 发现并没有成功运行(原因是elastsearch极耗内存,而我的服务器内存不够)
[root@izbp10tup89om84qulgxbsz /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 如果你和我一样,服务器内存不够用,建议使用下面的命令限制内存启动 elasticsearch
[root@izbp10tup89om84qulgxbsz ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
# 启动后可以使用如下命令查看容器的内存占用情况:
[root@izbp10tup89om84qulgxbsz /]# docker stats 784a6bb21c2d
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
784a6bb21c2d elasticsearch 0.39% 359.9MiB / 1.796GiB 19.57% 0B / 0B 265MB / 696kB 42
# 本地访问es
[root@izbp10tup89om84qulgxbsz /]# curl localhost:9200
- (补充)Portainer 可视化面板的安装:
# 下载并运行 Portainer
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
# 内网访问(会很快)
[root@izbp10tup89om84qulgxbsz /]# curl localhost:8088
外网访问8088端口(第一次访问会非常非常慢):
第一次访问,需要添加用户名和密码:
看看就好,反正不好用:
4. 数据卷技术
Docker04_使用数据卷技术实现容器内外和容器间的数据共享
4.1 使用 -v 命令挂载目录:
[root@izbp10tup89om84qulgxbsz home]# docker run -it -v /home/ceshi:/home centos /bin/bash
此时,容器内的 /home 目录就与主机的 /home/ceshi 目录实现了双向绑定。 即使容器被关闭或删除了,数据依然可以保留。
使用 docker inspect 容器id 命令可以查看到详细的目录挂载信息:
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
4.2 实战:MySQL同步数据
#搜索镜像
[root@izbp10tup89om84qulgxbsz ceshi]# docker search mysql
#下载镜像
[root@izbp10tup89om84qulgxbsz ceshi]# docker pull mysql:5.7
# 查看是否下载成功
[root@izbp10tup89om84qulgxbsz ceshi]# docker images
# 启动 mysql 镜像
-d 表示后台运行
-p 表示端口映射
-v 数据卷挂载
-e 环境配置
--name 容器名
[root@izbp10tup89om84qulgxbsz ceshi]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
Navicat 测试连接:使用 Navicat 创建一个 test-blu 数据库:
进入主机的 /home/mysql/data 目录查看文件,发现多了一个名为 test@002dblu 的目录:
[root@izbp10tup89om84qulgxbsz data]# ls
auto.cnf client-key.pem ib_logfile1 private_key.pem sys
ca-key.pem ib_buffer_pool ibtmp1 public_key.pem test@002dblu
ca.pem ibdata1 mysql server-cert.pem
client-cert.pem ib_logfile0 performance_schema server-key.pem
12345
# 删除 mysql01 容器
[root@izbp10tup89om84qulgxbsz data]# docker rm -f mysql01
# 查看是否删除成功
[root@izbp10tup89om84qulgxbsz data]# docker ps -a
# 查看主机的 /home/mysql/data 目录,发现文件仍然存在
[root@izbp10tup89om84qulgxbsz data]# ls
auto.cnf client-key.pem ib_logfile1 private_key.pem sys
ca-key.pem ib_buffer_pool ibtmp1 public_key.pem test@002dblu
ca.pem ibdata1 mysql server-cert.pem
client-cert.pem ib_logfile0 performance_schema server-key.pem
具名挂载 和 匿名挂载
指定路径挂载 -v 主机目录:容器目录
具名挂载 -v 卷名:容器目录
匿名挂载 -v 容器目录
匿名挂载 nginx 示例(不推荐):
# 匿名挂载启动 nginx
-P 表示随机端口映射
[root@izbp10tup89om84qulgxbsz home]# docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的 volume
[root@izbp10tup89om84qulgxbsz home]# docker volume ls
DRIVER VOLUME NAME
local f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b
local fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65
# 查看指定的 volume 信息
[root@izbp10tup89om84qulgxbsz home]# docker volume inspect f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b
[
{
"CreatedAt": "2020-11-11T21:36:18+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b/_data",
"Name": "f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b",
"Options": null,
"Scope": "local"
}
]
[root@izbp10tup89om84qulgxbsz home]# docker volume inspect fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65
[
{
"CreatedAt": "2020-11-18T18:27:24+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65/_data",
"Name": "fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65",
"Options": null,
"Scope": "local"
}
]
结论:所有 docker 容器内的卷,在没有指定主机目录的情况下,默认挂载的地址都是:"/var/lib/docker/volumes/【volumn-name】/_data" 问题是匿名挂载的 volumn 的 名字都是一长串的随机字符,我们无法判断哪一个才是 nginx 容器挂载的地址,使用具名挂载可以解决这个问题。
具名挂载 nginx 示例(推荐):
# 具名挂载启动 nginx
[root@izbp10tup89om84qulgxbsz home]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 查看所有的 volume
[root@izbp10tup89om84qulgxbsz _data]# docker volume ls
DRIVER VOLUME NAME
local f05023335d743c9fc194ada48cabd0f58b8981416017dcc83db0ad3ef0e2225b
local fe42203caa62c5e66586f9476b32c7ff58f733b050bfb054c475906c106e4b65
local juming-nginx
# 查看指定的 volume 信息
[root@izbp10tup89om84qulgxbsz _data]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-11-18T18:46:47+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
# 进入挂载目录查看文件,找到了 nginx 的配置文件!
[root@izbp10tup89om84qulgxbsz _data]# cd /var/lib/docker/volumes/juming-nginx/_data
[root@izbp10tup89om84qulgxbsz _data]# ll
total 40
drwxr-xr-x 2 root root 4096 Nov 18 18:46 conf.d
-rw-r--r-- 1 root root 1007 Oct 27 23:09 fastcgi_params
-rw-r--r-- 1 root root 2837 Oct 27 23:09 koi-utf
-rw-r--r-- 1 root root 2223 Oct 27 23:09 koi-win
-rw-r--r-- 1 root root 5231 Oct 27 23:09 mime.types
lrwxrwxrwx 1 root root 22 Oct 27 23:25 modules -> /usr/lib/nginx/modules
-rw-r--r-- 1 root root 643 Oct 27 23:25 nginx.conf
-rw-r--r-- 1 root root 636 Oct 27 23:09 scgi_params
-rw-r--r-- 1 root root 664 Oct 27 23:09 uwsgi_params
-rw-r--r-- 1 root root 3610 Oct 27 23:09 win-utf
拓展:
默认rw挂载的目录可读可写,可以在容器内部对挂载的目录内的文件进行读写:
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx:rw
设置读写权限为ro(readOnly)的挂载目录,不可以在容器内对该目录内的文件进行写操作:
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx:ro
4.3 具名和匿名挂载
匿名
docker run -d -P --name naginx-1 -v /ect/nagix nginx
不写路径,然后docker 自动生成路径进行挂载
具名
docker run -d -P --name nagix02 -v nagix_1:/ect/nagix nagix
写路径的,但是路径并不是绝对路径,而是卷名
查看卷名
docker volume inspect
拓展
docker run -d -P --name nagix02 -v nagix_1:/ect/nagix:ro nagix
ro readonly 只读,只能进行宿主机来改变
docker run -d -P --name nagix02 -v nagix_1:/ect/nagix:rw nagix
rw readwrite 可读可写
5. DockerFile
dockerfile 就是构建docker镜像的构建文件,命令脚本
5.1 使用 dockerfile 挂载目录
在 /home 目录下新建 docker-test-volume 目录,进入该目录 在 /home/docker-test-volume 目录下,创建 dockerfile1 文件,写入以下内容:
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
测试
# 根据 dockerfile1 中的脚本创建镜像,镜像名为 docker-blu/centos 版本为1.0
[root@izbp10tup89om84qulgxbsz docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t docker-blu/centos:1.0 .
# 查看生成的镜像
[root@izbp10tup89om84qulgxbsz docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-blu/centos 1.0 65d304aadb42 43 seconds ago 215MB
# 启动自己创建的镜像
[root@izbp10tup89om84qulgxbsz docker-test-volume]# docker run -it 65d304aadb42 /bin/bash
# 查看目录,发现了挂载的目录 volume01 和 volume02
[root@c1a21b8c0d30 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 360 Nov 18 11:31 dev
drwxr-xr-x 1 root root 4096 Nov 18 11:31 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
drwx------ 2 root root 4096 Aug 9 21:40 lost+found
drwxr-xr-x 2 root root 4096 May 11 2019 media
drwxr-xr-x 2 root root 4096 May 11 2019 mnt
drwxr-xr-x 2 root root 4096 May 11 2019 opt
dr-xr-xr-x 97 root root 0 Nov 18 11:31 proc
dr-xr-x--- 2 root root 4096 Aug 9 21:40 root
drwxr-xr-x 11 root root 4096 Aug 9 21:40 run
lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 May 11 2019 srv
dr-xr-xr-x 13 root root 0 Nov 18 11:31 sys
drwxrwxrwt 7 root root 4096 Aug 9 21:40 tmp
drwxr-xr-x 12 root root 4096 Aug 9 21:40 usr
drwxr-xr-x 20 root root 4096 Aug 9 21:40 var
drwxr-xr-x 2 root root 4096 Nov 18 11:31 volume01
drwxr-xr-x 2 root root 4096 Nov 18 11:31 volume02
# 在 volume01 中创建一个文件
[root@c1a21b8c0d30 /]# cd volume01
[root@c1a21b8c0d30 volume01]# touch a.txt
# 查看容器id
[root@izbp10tup89om84qulgxbsz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1a21b8c0d30 65d304aadb42 "/bin/bash" 7 minutes ago Up 7 minutes festive_cerf
# 查看挂载点信息
[root@izbp10tup89om84qulgxbsz ~]# docker inspect c1a21b8c0d30
"Mounts": [
{
"Type": "volume",
"Name": "3dd6cd544b10b948ae38ce55a2b78c4a4c14945360867317fe8c7886e6141027",
"Source":"/var/lib/docker/volumes/3dd6cd544b10b948ae38ce55a2b78c4a4c14945360867317fe8c7886e6141027/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "61e4336db92d8dc970fbc407aa4bc19c5b059626745ef3e954f82c29af8e1342",
"Source": "/var/lib/docker/volumes/61e4336db92d8dc970fbc407aa4bc19c5b059626745ef3e954f82c29af8e1342/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
# 进入 volume01 挂载的主机目录,发现同步成功!
[root@izbp10tup89om84qulgxbsz ~]# cd /var/lib/docker/volumes/3dd6cd544b10b948ae38ce55a2b78c4a4c14945360867317fe8c7886e6141027/_data
[root@izbp10tup89om84qulgxbsz _data]# ls
a.txt
[root@izbp10tup89om84qulgxbsz _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1a21b8c0d30 65d304aadb42 "/bin/bash" 24 minutes ago Up 24 minutes festive_cerf
# 再启动一个容器,卷继承上一个容器
[root@izbp10tup89om84qulgxbsz _data]# docker run -it --name blu-centos02 --volumes-from c1a21b8c0d30 65d304aadb42 /bin/bash
# 进入 volume01 目录,发现了a.txt
[root@9740c6ea3675 volume01]# ls
a.txt
# 创建 b.txt
[root@9740c6ea3675 volume01]# touch b.txt
# 在之前的容器中发现了b.txt,同步成功!
[root@c1a21b8c0d30 volume01]# ls
a.txt b.txt
5.2 实战:使用数据卷容器实现多个MySQL的数据同步
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
DockerFile
- DockerFile 就是一个命令参数脚本,是用来构建docker镜像的文件
- 每个保留关键字(指令)都必须是大写字母
- # 号表示注释
- 每一个指令都会创建提交一个新的镜像层
DockerFile 的指令
FROM # 指定基础镜像
MAINTAINER # 指定维护者信息(姓名+邮箱)
RUN # 镜像构建时需要运行的命令
ADD # 在镜像中添加内容
WORKDIR # 设置当前工作目录
VOLUME # 设置卷,挂载主机目录
EXPOSE # 指定暴露端口
CMD # 指定容器启动时要运行的命令(只有最后一个CMD指令会生效)
ENTRYPOINT # 指定容器启动时要运行的命令,启动时可以追加命令参数
ONBUILD # 当构建一个被继承 DockerFile 时会执行的指令
COPY # 类似ADD,将文件拷贝至镜像中
ENV # 构建时设置环境变量
5.3 制作自己的镜像
5.3.1 创建一个自己的 CentOS 镜像:
编辑命令
vim mydockerfile-centos
输入命令
FROM centos
MAINTAINER BLU<2711978737@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
开始构建自己的centos
docker build -f mydockerfile-centos -t mycentos:0.1 .
docker history 命令查看指定镜像的构建过程(以mysql:5.7为例):
[root@blu ~]# docker history mysql:5.7
IMAGE CREATED CREATED BY SIZE COMMENT
c791733bf9b7 4 days ago /bin/sh -c #(nop) CMD ["mysqld"] 0B
<missing> 4 days ago /bin/sh -c #(nop) EXPOSE 3306 33060 0B
<missing> 4 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
<missing> 4 days ago /bin/sh -c ln -s usr/local/bin/docker-entryp… 34B
<missing> 4 days ago /bin/sh -c #(nop) COPY file:f9202f6b715c0e78… 13.1kB
<missing> 4 days ago /bin/sh -c #(nop) VOLUME [/var/lib/mysql] 0B
<missing> 4 days ago /bin/sh -c { echo mysql-community-server m… 313MB
<missing> 4 days ago /bin/sh -c echo "deb http://repo.mysql.com/a… 55B
<missing> 4 days ago /bin/sh -c #(nop) ENV MYSQL_VERSION=5.7.32-… 0B
<missing> 4 days ago /bin/sh -c #(nop) ENV MYSQL_MAJOR=5.7 0B
<missing> 4 days ago /bin/sh -c set -ex; key='A4A9406876FCBD3C45… 2.61kB
<missing> 4 days ago /bin/sh -c apt-get update && apt-get install… 52.2MB
<missing> 4 days ago /bin/sh -c mkdir /docker-entrypoint-initdb.d 0B
<missing> 4 days ago /bin/sh -c set -eux; savedAptMark="$(apt-ma… 4.17MB
<missing> 4 days ago /bin/sh -c #(nop) ENV GOSU_VERSION=1.12 0B
<missing> 4 days ago /bin/sh -c apt-get update && apt-get install… 9.34MB
<missing> 4 days ago /bin/sh -c groupadd -r mysql && useradd -r -… 329kB
<missing> 4 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 4 days ago /bin/sh -c #(nop) ADD file:d2abb0e4e7ac17737… 69.2MB
可能出现的问题
Errors during downloading metadata for repository ‘AppStream‘解决方法
在阿里云服务器centos7上,Dockerfile中写了一句RUN yum -y install vim,结果build的时候就一直出错
最后是发现因为把防火墙关了,把防火墙打开就可以了。 systemctl start firewalld.service
- vim CentOS-Base.repo
- vim CentOS-AppStream.repo
- vim CentOS-Extras.repo
将文件中三文件中的 mirrorlist注释,将baseurl 修改为阿里源 为 baseurl=
bashhttps://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/
bashyum makecache
bashsystemctl restart docker
5.3.2 创建一个 Tomcat 镜像:
FROM centos
MAINTAINER BLU<2711978737@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u271-linux-aarch64.tar.gz /usr/local/
ADD apache-tomcat-9.0.34.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN chmod -R 777 /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_271
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.34
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.34
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.34/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.34/logs/catalina.out
[root@blu tomcat]# docker build -t diytomcat .
[root@blu blu]# docker run -d -p 3001:8080 --name blu-diytomcat -v /usr/blu/tomcat/test/webapps:/usr/local/apache-tomcat-9.0.34/webapps -v /usr/blu/tomcat/test/tomcatlogs:/usr/local/apache-tomcat-9.0.34/logs diytomcat
5.3.3 在DockerHub上发布自己的镜像
- 第一步:先在这个网站注册一个账号:https://hub.docker.com/
- 第二步,在服务器上登录账号:
[root@blu tomcat]# docker login -u blucoding
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
- 第三步,将自己的镜像改名为标准格式:【作者名】/【镜像名】:版本号
- 注意作者名要和你刚刚注册的账号名一致,否则会被拒绝提交
docker tag 0d120b6ccaa8 blucoding/centos:1.0
- 第四步,提交镜像
docker push blucoding/centos:1.0
5.3.4 阿里云镜像服务上发布自己的镜像
- 第一步,在阿里云的容器镜像服务中创建一个命名空间:
- 第二步,创建一个镜像仓库:
- 第三步,点击镜像仓库查看详细信息和操作指南:
- 第四步,在服务器上退出刚刚登录的 dockerhub 账户:
docker logout
- 第五步,登录阿里云账户,密码是阿里云镜像仓库服务的密码:
sudo docker login --username=杀手的假期 registry.cn-hangzhou.aliyuncs.com
- 第六步,修改镜像名称:
sudo docker tag [镜像id] registry.cn-hangzhou.aliyuncs.com/blucoding/blu-test:[版本号]
- 第五步,发布镜像:
sudo docker push registry.cn-hangzhou.aliyuncs.com/blucoding/blu-test:[版本号]
6.Docker 网络
ip addr
一共有三个网卡
lo 是自己本身的,eth0 是 阿里云服务器创建的,docker0是 dokcer创建的网卡,用来管理网络
6.1 桥接模式
只要安装了docker,就会分配一个ip地址,就是桥接模式。使用的技术是evth-pair 技术
再次输入
ip addr
每次启动一个容器,就会多一个网卡。这就是evth-pair 技术
容器和容器之间是可以ping 通的
容器与容器之间能够用ip ping通,但是不能够用 名字ping 通
6.2 容器连接--link
使用了link ,就能够用 名字进行ping 通了
先删除container
docker rm tomcat01
docker rm tomcat02
创建
docker run -d --name tomcat01 tomcat
docker run -d --name tomcat02 --link tomcat01 tomcat
ping
docker exec -it tomcat02 ping tomcat01
但是,反向不能够ping 通
docker exec -it tomcat01 ping tomcat02
6.3 自定义网络
查看所有的docker 网络
网络模式
- bridge 桥接模式,默认
- none 不设置热呢配置
- host 和宿主机连接配置
- container 容器间连通(局限很大)
创建自定义网络
docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 mynetwork
查看
查看具体信息
创建容器连接上自定义网络
docker run -d -P --name tomcat-net-01 --net mynetwork tomcat
docker run -d -P --name tomcat-net-02 --net mynetwork tomcat
检查网络,就会发现,服务已经在上面
[
{
"Name": "mynetwork",
"Id": "ac8e8f17715318a7b238e1a54e8be50f1d1953b305b6c2318e622a69de7efbbe",
"Created": "2021-01-05T11:01:40.300113826+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/24",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"5948c7b4c7cdce9e5b5f29611069a18e0c6931e161f6ac66c1754c118ec390e2": {
"Name": "tomcat-net-02",
"EndpointID": "dd8281b34a371ec6b0dcb8ba4d1b742c957fd0f8a1a1c4f22f807ea239f296a2",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/24",
"IPv6Address": ""
},
"c29a840804c9a73933649dbe7db2310471bb21a58f6ec6111818f0c673d87e1a": {
"Name": "tomcat-net-01",
"EndpointID": "482dddfbda360b55735730841bf3f6200df84798b1449d4886abe4c251538f75",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/24",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
测试
docker exec -it tomcat-net-01 ping tomcat-net-02
6.4 网络连通
实现docker0 和mynet 连通
docker network connect mynetwork tomcat01
实现效果
就是把tomcat01 放置在了上面
@[TOC]
7. Docker-Compose
7.1 介绍
7.1.1 概念
Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。 Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
7.1.2 安装
安装官网
https://docs.docker.com/compose/install/
安装在centos 上
需要以下安装环境
py-pip
,python-dev
,libffi-dev
,openssl-dev
,gcc
,libc-dev
,和make
。下载
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
建议使用备用地址
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
设置权限
bashsudo chmod +x /usr/local/bin/docker-compose
设置快捷方式
bashsudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
检查是否成功
bashdocker-compose --version
如果下载太慢的话,使用这个
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
或者直接使用pip 安装
centos7 可以选择如下安装
yum -y install python-pip
pip install --upgrade pip
pip install docker-compose
docker-compose -version
centos8 需要使用pip3 命令安装
sudo pip3 install docker-compose
7.2 使用
- 使用定义您的应用环境,Dockerfile以便可以在任何地方复制。
- 定义组成应用程序的服务,
docker-compose.yml
以便它们可以在隔离的环境中一起运行。 - 运行
docker-compose up
Compose启动并运行您的整个应用程序。
docker-compose.yml
长成这样子
version: '2.0'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
7.2.1 快速开始
mkdir composetest
cd composetest
创建app.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
同目录下创建requirements.txt
flask
redis
创建Dockerfile
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
内容讲解
从Python 3.7映像开始构建映像。
将工作目录设置为/code。
设置flask命令使用的环境变量。
安装gcc和其他依赖项
复制requirements.txt并安装Python依赖项。
向图像添加元数据以描述容器正在侦听端口5000
将.项目中的当前目录复制到.映像中的工作目录。
将容器的默认命令设置为flask run。
创建docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
目录
启动
docker-compose up
观察连接
http://localhost:5000/
7.2.2 搭建自己的博客wordpress
mkdir my_wordpress
cd my_wordpress
创建 docker-compose.yml
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
启动项目
docker-compose up -d
7.2.3 搭建redis 集群
抄袭别人的
mkdir -p docker/redis docker/sentinel
cd docker/redis
touch docker-compose.yml
下一步编辑docker-compose.yml
version: '3'
services:
master:
image: redis
container_name: redis-master
command: redis-server --requirepass 123456
ports:
- 6379:6379
slave1:
image: redis
container_name: redis-slave-1
ports:
- 6380:6379
command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456
slave2:
image: redis
container_name: redis-slave-2
ports:
- 6381:6379
command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456
进入
cd ../sentinel
touch docker-compose.yml sentinel.conf
编辑docker-compose.yml
version: '3'
services:
sentinel1:
image: redis
container_name: redis-sentinel-1
ports:
- 26379:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
sentinel2:
image: redis
container_name: redis-sentinel-2
ports:
- 26380:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
sentinel3:
image: redis
container_name: redis-sentinel-3
ports:
- 26381:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
编辑 sentinel.conf
port 26379
dir /tmp
sentinel monitor mymaster 172.19.55.101 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
sentinel auth-pass mymaster 123456
注意点
① 第三行中 mymaster 是可以自定义集群的名字,如果使用其他语言连接集群,需要写上该名字。
② 192.168.223.129是我虚拟机的ip,请换成自己的ip,不要127.0.0.1 否则会链接到你的应用程序去,写IP就可以。
③ 那个2呢,是因为我有3台哨兵,2个投票超过50%了,所以设置2即可,如果是更多,设置超过50%概率就好,自己喜欢。
复制
sudo cp sentinel.conf sentinel1.conf
sudo cp sentinel.conf sentinel2.conf
sudo cp sentinel.conf sentinel3.conf
查看sentinel
分别启动 进入redis 中
cd /usr/local/docker/redis
启动
sudo docker-compose up -d
进入sential
cd /usr/local/docker/sentinel/
启动
sudo docker-compose up -d
查看是否成功
docker ps