docker学习笔记
docker概述
docker为什么流行?它的优势是什么?能解决什么问题?
- 解决部署的难题,尤其是集群环境的部署
- 版本更新及不同环境下导致运行出问题
docker特点
- 容器与容器之间相互隔离
- 最大得发挥服务器的性能
docker在百度云服务器的安装
服务器版本要求
centos 3.10.0-957.27.2.el7.x86_64
第一步:卸载旧版本的docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
第二步:安装依赖
yum install -y yum-utils
第三步:配置阿里云镜像安装docker
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
第四步:安装最新社区版docker
yum install docker-ce docker-ce-cli containerd.io
第五步:启动docker
systemctl start docker
第六步:确认docker是否安装成功,同时确认docker安装版本
docker version
第七步:运行hello-world
docker run hello-world
第八步:查看镜像docker images
[root@instance-xrx1ekbd docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 8 months ago 13.3kB
第九步:删除docker
# 第一步
yum remove docker-ce docker-ce-cli containerd.io
# 第二步
rm -rf /var/lib/docker
配置阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://5wjhaci2.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker 常用命令
帮助命令
docker version # docker版本信息
docker info # docker 详细信息
docker 命令 --help # docker 帮助命令
镜像
docker images 查看所有本地主机上的镜像
[root@instance-xrx1ekbd ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 4 days ago 133MB
hello-world latest bf756fb1ae65 8 months ago 13.3kB
# 可选
-a, --all # 列出所有的镜像
-q, --quiet # 只显示镜像的id
docker search 搜索镜像
[root@instance-xrx1ekbd ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 13736 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1873 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 786 [OK]
# 可选项
--filter=stars=1873
[root@instance-xrx1ekbd ~]# docker search nginx --filter=STARS=1873
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 13736 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1873 [OK]
docker pull 下载镜像
# 下载镜像docker pull mysql:5.7 下载5.7固定版本
[root@instance-xrx1ekbd ~]# docker pull mysql
Using default tag: latest # 默认下载最新版本
latest: Pulling from library/mysql
d121f8d1c412: Already exists
f3cebc0b4691: Pull complete # 文件分层下载,核心是 联合文件系统
1862755a0b37: Pull complete
489b44f3dbb4: Pull complete
690874f836db: Pull complete
baa8be383ffb: Pull complete
55356608b4ac: Pull complete
dd35ceccb6eb: Pull complete
429b35712b19: Pull complete
162d8291095c: Pull complete
5e500ef7181b: Pull complete
af7528e958b6: Pull complete
Digest: sha256:e1bfe11693ed2052cb3b4e5fa356c65381129e87e38551c6cd6ec532ebe0e808 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
docker rmi -f 镜像id 删除镜像
[root@instance-xrx1ekbd ~]# docker rmi -f e1d7dc9731da
Untagged: mysql:latest
Untagged: mysql@sha256:e1bfe11693ed2052cb3b4e5fa356c65381129e87e38551c6cd6ec532ebe0e808
Deleted: sha256:e1d7dc9731daa2c79858307d65ef35f543daf97457b9c11b681f78bb86f7a158
Deleted: sha256:303dd82484b7080d07af8ab7f383755d8b4d723a2ade8c2e3a516ae59fbc1d63
Deleted: sha256:6346e1a264e283de286e399bc798b8e6a910176180aa1ef1acc54dbace18111a
Deleted: sha256:6c7a3d83131ddf3414e34e14826cbfb8f01a6d6486cd41d9a7a2bcc84350b4f0
Deleted: sha256:79b91792bcadd6668ab861a83623dedcc38574c5f033d2f8336671588a1c4de0
Deleted: sha256:00bdff03938c98e1fee710e8c447a1c30e7365859dd28e2a166792d7cd343fa9
# 删除所有的镜像
[root@instance-xrx1ekbd ~]# docker rmi -f $(docker images -aq)
容器
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="name" 容器名字,用来区分不同的容器
-d 以后台进程启动
-it 使用交互式方式启动,直接进入容器内部
-p 指定容器的端口
-p 主机端口:容器端口 常用
-p 容器端口
-P 指定随机端口(大写)
[root@instance-xrx1ekbd ~]# docker run -it centos /bin/bash
# 进入到容器内部
[root@15fb42080876 /]# ll
bash: ll: command not found
[root@15fb42080876 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@15fb42080876 /]# exit # 退出容器
查看运行的容器
docker ps
# 正在运行的容器
-a # 查看运行过的容器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号
# 查看正在运行的容器
[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15fb42080876 centos "/bin/bash" About a minute ago Up About a minute awesome_mclean
# 查看运行过的容器
[root@instance-xrx1ekbd ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15fb42080876 centos "/bin/bash" 2 minutes ago Exited (0) 7 seconds ago awesome_mclean
78529ee8eb85 hello-world "/hello" 3 days ago Exited (0) 3 days ago crazy_easley
退出容器
exit # 容器停止并退出
ctrl + p + q # 容器不停止退出
停止运行容器
docker stop 容器id # 停止容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker kill 容器id # 强制停止容器
删除容器
docker rm 容器id # 删除指定容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) # 可删除所有容器
docker rm -a -q|xargs docker rm # 可删除所有容器
常用其他容器
后台启动容器
docker run -d centos
[root@instance-xrx1ekbd ~]# docker run -d centos
c8f9952ea9cbc77cd8d1d34ba3f2b4623e4564768a58aa7fecb59b923b55c1d2
[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 发现centos 并没有后台运行,即centos停止了
# 解释:centos 后台运行的条件是必须要有一个前台进程,docker发现没有应用,就会自动停止
查看日志
[root@instance-xrx1ekbd ~]# docker logs -f -t --tail 10 容器id
# 显示日志
-ft # 显示日志
--tail # 显示指定条数的日志
查看容器中的进程信息
# docker top 容器id
[root@instance-xrx1ekbd ~]# docker top c4757790f1d2
UID PID PPID C STIME TTY TIME CMD
root 18367 18340 0 23:18 pts/0 00:00:00 /bin/bash
查看镜像的元数据
# docker inspect 容器id
[root@instance-xrx1ekbd ~]# docker inspect c4757790f1d2
[
{
"Id": "c4757790f1d235e10600117e9789e33c999578b6562495333c38ae414187e9f0",
"Created": "2020-09-16T15:18:43.781056665Z",
"Path": "/bin/bash",
"Args": [],
进入当前运行的容器
# 容器一般都是后台运行的,常用操作进入正在运行的容器的
# 命令 docker exec -it 容器id bash shell
[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c4757790f1d2 centos "/bin/bash" 13 minutes ago Up 13 minutes gracious_panini
[root@instance-xrx1ekbd ~]# docker exec -it c4757790f1d2 /bin/bash
[root@c4757790f1d2 /]#
# 方式二 docker attach -it 容器id bash shell
# docker exec # 进入开启新的终端
# docker attach # 进入正在运行的终端
从容器内拷贝东西到宿主机
# 命令:docker cp
# test.java 拷贝不出来???
[root@instance-xrx1ekbd home]# docker exec -it 72b8a35ff5c1 /bin/bash
[root@72b8a35ff5c1 /]# cd home/
[root@72b8a35ff5c1 home]# ls
test.java
[root@72b8a35ff5c1 home]# exit
exit
[root@instance-xrx1ekbd home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72b8a35ff5c1 centos "/bin/bash" 6 minutes ago Up About a minute practical_clarke
[root@instance-xrx1ekbd home]# docker cp 72b8a35ff5c1:/home/test.jave /home
Error: No such container:path: 72b8a35ff5c1:/home/test.jave
# 问题所在:文件名书写错误
[root@instance-xrx1ekbd home]# docker cp 72b8a35ff5c1:/home/test.java /home
实操
将tomcat 镜像启动后重新打包成新的镜像
打包成新的镜像
# 后台启动tomcat 并将端口映射到80
[root@instance-xrx1ekbd ~]# docker run -d -p 80:8080 tomcat:9.0
9a23727963ffd3d579dd5c72689133f80b66e5b104a35e7909dd7eb598d9d267
[root@instance-xrx1ekbd ~]# dockerps
-bash: dockerps: 未找到命令
[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a23727963ff tomcat:9.0 "catalina.sh run" 7 seconds ago Up 6 seconds 0.0.0.0:80->8080/tcp goofy_leakey
# 进入到运行中的容器
[root@instance-xrx1ekbd ~]# docker exec -it 9a23727963ff /bin/bash
root@9a23727963ff:/usr/local/tomcat# ll
bash: ll: command not found
root@9a23727963ff:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
# 将webapps.dist拷贝到webapps
root@9a23727963ff:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@9a23727963ff:/usr/local/tomcat# cd webapps
root@9a23727963ff:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
root@9a23727963ff:/usr/local/tomcat/webapps#
# 访问80端口确认tomcat 是否开启成功
[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a23727963ff tomcat:9.0 "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:80->8080/tcp goofy_leakey
# 将运行的容器打包成新的镜像
[root@instance-xrx1ekbd ~]# docker commit -a="pipi" -m="add webapps app" 9a23727963ff myTomcat:1.0
invalid reference format: repository name must be lowercase # 名称不能大写
[root@instance-xrx1ekbd ~]# docker commit -a="pipi" -m="add webapps app" 9a23727963ff mytomcat:1.0
sha256:dbe9d82ea3a9156ce5823bea0cfb543219296e4a955b2a53edb5b328d3e0fb8a
[root@instance-xrx1ekbd ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 1.0 dbe9d82ea3a9 13 seconds ago 652MB
tomcat 9.0 f796d3d2c195 3 days ago 647MB
nginx latest 7e4d58f0e5f3 9 days ago 133MB
mysql 5.7 ef08065b0a30 9 days ago 448MB
centos latest 0d120b6ccaa8 5 weeks ago 215MB
hello-world latest bf756fb1ae65 8 months ago 13.3kB
[root@instance-xrx1ekbd ~]#
启动新的镜像
[root@instance-xrx1ekbd ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 1.0 dbe9d82ea3a9 13 seconds ago 652MB
tomcat 9.0 f796d3d2c195 3 days ago 647MB
nginx latest 7e4d58f0e5f3 9 days ago 133MB
mysql 5.7 ef08065b0a30 9 days ago 448MB
centos latest 0d120b6ccaa8 5 weeks ago 215MB
hello-world latest bf756fb1ae65 8 months ago 13.3kB
[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a23727963ff tomcat:9.0 "catalina.sh run" 11 minutes ago Up 11 minutes 0.0.0.0:80->8080/tcp goofy_leakey
[root@instance-xrx1ekbd ~]# docker stop
"docker stop" requires at least 1 argument.
See 'docker stop --help'.
Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...]
[root@instance-xrx1ekbd ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a23727963ff tomcat:9.0 "catalina.sh run" 11 minutes ago Up 11 minutes 0.0.0.0:80->8080/tcp goofy_leakey
[root@instance-xrx1ekbd ~]# docker stop 9a23727963ff
9a23727963ff
[root@instance-xrx1ekbd ~]# ll
总用量 44
drwxr-xr-x 6 root root 4096 1月 2 2020 ѡ??????ϵͳ
drwxr-xr-x 7 root root 4096 6月 1 18:23 ant-design-pro
drwxr-xr-x 5 root root 4096 11月 25 2019 daily_fresh
drwxr-xr-x 2 root root 4096 9月 13 16:17 docker
drwxr-xr-x 3 root root 4096 3月 31 22:38 env
drwxr-xr-x 3 root root 4096 11月 21 2019 html
drwxr-xr-x 4 root root 4096 3月 31 19:42 lh-healthy
drwxr-xr-x 2 root root 4096 11月 25 2019 packages
drwxr-xr-x 3 root root 4096 11月 16 2019 python
-rw-r--r-- 1 root root 1478 11月 25 2019 requirements.txt
-rw-r--r-- 1 root root 735 12月 2 2019 uploadFiles.html
[root@instance-xrx1ekbd ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 1.0 dbe9d82ea3a9 7 minutes ago 652MB
tomcat 9.0 f796d3d2c195 3 days ago 647MB
nginx latest 7e4d58f0e5f3 9 days ago 133MB
mysql 5.7 ef08065b0a30 9 days ago 448MB
centos latest 0d120b6ccaa8 5 weeks ago 215MB
hello-world latest bf756fb1ae65 8 months ago 13.3kB
[root@instance-xrx1ekbd ~]# docker run -d -p 3344:8080 mytomcat:1.0
b4c3ed0df1fa0fc1c222d645428d6eeefe727cfb58b39ed86a7e3198554ca7eb

容器数据卷
目的:为了容器的持久化和同步操作
使用数据卷
直接使用 -v 来挂载
# 启动容器并挂载数据到服务器/home/test目录下
[root@instance-xrx1ekbd ~]# docker run -it -v /home/test:/home centos
[root@9cf5683a9dac /]# cd /home/
[root@9cf5683a9dac home]# ll
bash: ll: command not found
[root@9cf5683a9dac home]# ls
[root@9cf5683a9dac home]# touch test.txt
[root@9cf5683a9dac home]# ll
bash: ll: command not found
[root@9cf5683a9dac home]# ls
test.txt
# 切换到服务器/home/test 目录下
[root@instance-xrx1ekbd ~]# cd /home/
[root@instance-xrx1ekbd home]# ll
总用量 4
drwxr-xr-x 2 root root 4096 9月 19 23:20 test
[root@instance-xrx1ekbd home]# cd test
[root@instance-xrx1ekbd test]# ll
总用量 0
[root@instance-xrx1ekbd test]# ls
test.txt
查看元数据挂载情况
[root@instance-xrx1ekbd test]# docker inspect 9cf5683a9dac
[
"Mounts": [
{
"Type": "bind",
"Source": "/home/test",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
]
实战mysql
mysql数据持久化的问题
# 获取镜像
[root@instance-xrx1ekbd test]# docker pull mysql:5.7
# 运行容器,需要做数据挂载 安装mysql需要配置密码
# 官方命令 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动命令
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 指定别名
[root@instance-xrx1ekbd test]# docker run --name mysqlme -p 3305:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
70a79cd380c65e8811d89926940649f87294c637f0bfe4bb30ddb8aa5352a983

# 启动mysql后通过navicat连接成功后进入到容器挂载的服务器目录查看,并测试在navicat创建数据库,看挂载目录是否同步数据,事实显示数据同步没问题
[root@instance-xrx1ekbd data]# pwd
/home/mysql/data
[root@instance-xrx1ekbd data]# ls
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem
[root@instance-xrx1ekbd data]# ls
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem test
docker 运行 mysql 报错
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# docker run --name mysql -p 3306:3306 -v /mydata/mysql_docker/conf:/etc/mysql/conf.d -v /mydata/mysql_docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
// 报错
docker: Error response from daemon: Conflict. The container name "/mysql" is already in use by container "99d2176d0421f8fd326430dccec9b5ac77dcdca32d934c7b39fc6a0dc75dd541". You have to remove (or rename) that container to be able to reuse that name.
// 原因:之前运行docker容器还没有退出,导致出现容器重名情况
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99d2176d0421 mysql:5.7 "docker-entrypoint.s…" 13 minutes ago Created mysql
4d7410d9e39e mysql:5.7 "docker-entrypoint.s…" 19 minutes ago Created mysqlme
004edb8a18e1 redis "docker-entrypoint.s…" 47 hours ago Up 47 hours 0.0.0.0:6379->6379/tcp redis
b8129b2dd58f hello-world "/hello" 2 days ago Exited (0) 2 days ago affectionate_panini
// 解决办法:删除重名的容器
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# docker rm 99d2176d0421
99d2176d0421
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# docker rm 4d7410d9e39e
4d7410d9e39e
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]#
docker 运行 mysql报错iptables failed
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# docker run --name mysql -p 3306:3306 -v /mydata/mysql_docker/conf:/etc/mysql/conf.d -v /mydata/mysql_docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
ffe1cdb677fd2531155501424ad322a57d293dc339b047013785249ff4527228
docker: Error response from daemon: driver failed programming external connectivity on endpoint mysql (fd147056d9b71efae8364dea1c01e5a3432353c09933ad40fc85c6f44e04f7f9): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-destination 172.17.0.3:3306 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).
// 解决方法:重启docker
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# systemctl restart docker
// 重新运行:运行正常
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# docker run --name mysql -p 3306:3306 -v /mydata/mysql_docker/conf:/etc/mysql/conf.d -v /mydata/mysql_docker/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
2de61f0652ec3edd789927c8721e79b10b6c5e3eca7137b4cebc33857230b816
实战安装redis
获取redis镜像
docker pull redis
查看本地镜像
docker images
先在服务器创建挂载的目录和配置文件
mkdir -p /mydata/redis/conf
[root@iZwz9hw4qywrrl4vj6o0j1Z ~]# cd /mydata/redis/conf/
[root@iZwz9hw4qywrrl4vj6o0j1Z conf]# touch redis.conf
启动redis
docker run -p 6379:6379 --name redis -v /mydata/redis/redis.conf:/etc/redis/redis.conf -v /mydata/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
# 结果
[root@iZwz9hw4qywrrl4vj6o0j1Z conf]# docker run -p 6379:6379 --name redis -v /mydata/redis/redis.conf:/etc/redis/redis.conf -v /mydata/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
004edb8a18e1f3f53702ef423834129cb060450046fc8452a833da244fa0a42b
- 命令解释
- -p 6379:6379 端口映射:前表示主机部分,:后表示容器部分。
- --name myredis 指定该容器名称,查看和进行操作都比较方便。
- -v 挂载目录,规则与端口映射相同。
- -d redis 表示后台启动redis
- redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录/usr/local/docker/redis.conf
- appendonly yes 开启redis 持久化
进入redis
[root@iZwz9hw4qywrrl4vj6o0j1Z conf]# docker exec -it redis redis-cli
127.0.0.1:6379>
具名和匿名挂载
# 匿名挂载
-v 容器内路径 # 匿名挂载
-v 服务器路径:容器内路径 # 具名挂载
-v /服务器路径:容器内路径 # 指定路径挂载
-v 容器内路径 ro rw # ro 只读 rw 可读可写,默认
# 匿名挂载nginx
[root@instance-xrx1ekbd data]# docker run -d -P --name nginx01 -v /etc/nginx nginx
01212adfe8817807ded3d27ac7a43bada131b5ed48d24bcf7f7fc1c4051921ee
[root@instance-xrx1ekbd data]# docker volumns ls
docker: 'volumns' is not a docker command.
See 'docker --help'
[root@instance-xrx1ekbd data]# docker volume ls
DRIVER VOLUME NAME
local 6ce13f8fe124b56f09182832bfa9c0761116b9a5f9b051345f380dc583cc32ec
local b20f1495bd4e5603bf2599d9519daf34fac649b9f6e265d7d5bf66a3f75147f1
# 具名挂载nginx 一般使用具名挂载
[root@instance-xrx1ekbd data]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
eba1c55d3c47863e303e15977b05bf015ef752ec921461f4b5168de19519143b
[root@instance-xrx1ekbd data]# docker volume ls
DRIVER VOLUME NAME
local 6ce13f8fe124b56f09182832bfa9c0761116b9a5f9b051345f380dc583cc32ec
local b20f1495bd4e5603bf2599d9519daf34fac649b9f6e265d7d5bf66a3f75147f1
local juming-nginx
# 查看挂载的目录地址
[root@instance-xrx1ekbd data]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-09-20T00:10:06+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", # 存储的目录
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
[root@instance-xrx1ekbd data]# cd /var/lib/docker/volumes/juming-nginx/_data
[root@instance-xrx1ekbd _data]# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
Dockerfile
DockerFile的指令
FROM # 基础镜像
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个【tomcat】压缩包要添加的内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOST # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令。只有最后一个会生效,可被替代
ENTRPPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行ONBUILD的指令,触发指令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量
Docker 网络
Docker0
清空所有环境

redis集群
# 创建自己的网卡实战
[root@instance-xrx1ekbd ~]# docker network create redis --subnet 172.38.0.0/16
a6ccd838229d98a340889407eca8690ae7cc01cec5cf6c4b909236819db469dd
[root@instance-xrx1ekbd ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ae398ace097e bridge bridge local
6874e8639270 host host local
56ecf8446811 none null local
a6ccd838229d redis bridge local
[root@instance-xrx1ekbd ~]# docker network inspect redis
[
{
"Name": "redis",
"Id": "a6ccd838229d98a340889407eca8690ae7cc01cec5cf6c4b909236819db469dd",
"Created": "2020-09-20T10:41:58.210398693+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.38.0.0/16"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
# redis集群搭建的脚本及相关命令
for port in $(seq 1 6);
do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
# 节点1
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 节点2
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 节点3
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 节点4
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 节点5
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 节点6
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 以交互模式进入redis
docker exec -it redis-1 /bin/sh
# 创建redis集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 \
172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 \
172.38.0.16:6379 --cluster-replicas 1
# 成功界面
/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 \
> 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 \
> 172.38.0.16:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 13f7c971bc1de1e45c3ac7989fdcfe6959a1d2c2 172.38.0.11:6379
slots:[0-5460] (5461 slots) master
M: 0348f1bc9463455ba3cf6c796297eaf301c2c5ef 172.38.0.12:6379
slots:[5461-10922] (5462 slots) master
M: 7e00472bdc843f274d065f252126f889bb025e64 172.38.0.13:6379
slots:[10923-16383] (5461 slots) master
S: 21663fb29c337c4371deb495699c1e0b695e308d 172.38.0.14:6379
replicates 7e00472bdc843f274d065f252126f889bb025e64
S: 9f2b29e1ea43ac369c62a869881ad4029428e297 172.38.0.15:6379
replicates 13f7c971bc1de1e45c3ac7989fdcfe6959a1d2c2
S: 7625dbab43ba2c2f2579366c242f1f5e8675834c 172.38.0.16:6379
replicates 0348f1bc9463455ba3cf6c796297eaf301c2c5ef
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: 13f7c971bc1de1e45c3ac7989fdcfe6959a1d2c2 172.38.0.11:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 7625dbab43ba2c2f2579366c242f1f5e8675834c 172.38.0.16:6379
slots: (0 slots) slave
replicates 0348f1bc9463455ba3cf6c796297eaf301c2c5ef
M: 7e00472bdc843f274d065f252126f889bb025e64 172.38.0.13:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 21663fb29c337c4371deb495699c1e0b695e308d 172.38.0.14:6379
slots: (0 slots) slave
replicates 7e00472bdc843f274d065f252126f889bb025e64
S: 9f2b29e1ea43ac369c62a869881ad4029428e297 172.38.0.15:6379
slots: (0 slots) slave
replicates 13f7c971bc1de1e45c3ac7989fdcfe6959a1d2c2
M: 0348f1bc9463455ba3cf6c796297eaf301c2c5ef 172.38.0.12:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
# 进一步查看集群配置,并进行测试
/data # redis-cli -c
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:47
cluster_stats_messages_pong_sent:46
cluster_stats_messages_sent:93
cluster_stats_messages_ping_received:41
cluster_stats_messages_pong_received:47
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:93
127.0.0.1:6379> cluster nodes
7625dbab43ba2c2f2579366c242f1f5e8675834c 172.38.0.16:6379@16379 slave 0348f1bc9463455ba3cf6c796297eaf301c2c5ef 0 1600572760036 6 connected
7e00472bdc843f274d065f252126f889bb025e64 172.38.0.13:6379@16379 master - 0 1600572761038 3 connected 10923-16383
13f7c971bc1de1e45c3ac7989fdcfe6959a1d2c2 172.38.0.11:6379@16379 myself,master - 0 1600572759000 1 connected 0-5460
21663fb29c337c4371deb495699c1e0b695e308d 172.38.0.14:6379@16379 slave 7e00472bdc843f274d065f252126f889bb025e64 0 1600572759535 4 connected
9f2b29e1ea43ac369c62a869881ad4029428e297 172.38.0.15:6379@16379 slave 13f7c971bc1de1e45c3ac7989fdcfe6959a1d2c2 0 1600572760537 5 connected
0348f1bc9463455ba3cf6c796297eaf301c2c5ef 172.38.0.12:6379@16379 master - 0 1600572760537 2 connected 5461-10922
# 关于redis集群高可用的简单测试
127.0.0.1:6379> set msg "hello,I like your blog!" 设置值
-> Redirected to slot [6257] located at 172.38.0.12:6379
OK
172.38.0.12:6379> get msg //取值
"hello,I like your blog!"
//用docker stop模拟存储msg值的redis主机宕机
[root@instance-001 panhom]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
705e41851450 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 20 minutes ago Up 20 minutes 0.0.0.0:6376->6379/tcp, 0.0.0.0:16376->16379/tcp redis-6
89844e29f714 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 20 minutes ago Up 20 minutes 0.0.0.0:6375->6379/tcp, 0.0.0.0:16375->16379/tcp redis-5
8f1ead5ca10a redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 20 minutes ago Up 20 minutes 0.0.0.0:6374->6379/tcp, 0.0.0.0:16374->16379/tcp redis-4
f77c5d93a97a redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 21 minutes ago Up 21 minutes 0.0.0.0:6373->6379/tcp, 0.0.0.0:16373->16379/tcp redis-3
cc2a93a6b4dd redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 21 minutes ago Up 21 minutes 0.0.0.0:6372->6379/tcp, 0.0.0.0:16372->16379/tcp redis-2
6c9c3b813129 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 26 minutes ago Up 26 minutes 0.0.0.0:6371->6379/tcp, 0.0.0.0:16371->16379/tcp redis-1
[root@instance-001 panhom]# docker stop redis-2
redis-2
//重新进入集群交互界面,并尝试获取msg消息
/data # exit
[root@instance-001 panhom]# docker exec -it redis-1 /bin/sh
/data # redis-cli -c
127.0.0.1:6379> get ms
-> Redirected to slot [13186] located at 172.38.0.13:6379
(nil)
172.38.0.13:6379> get msg
-> Redirected to slot [6257] located at 172.38.0.16:6379 //此时由备用机返回msg
"hello,I like your blog!"

浙公网安备 33010602011771号