Docker
Docker概述
Docker 为什么出现?#
一款产品:开发-上线 两套环境!应用环境,应用配置!
开发 --- 运维问题:我在我的电脑上可以运行!版本更新,导致服务不可用!对于运维来说,考验就变大了?
开发即运维!
环境配置是十分的麻烦,每一个机器都要部署环境(Redis、ES、Hadoop) ,费时费力
发布一个项目jar(Redis、MySQL、jdk、ES)项目能不能带上环境安装打包!
之前在服务器配置一个环境Redis、MySQL、jdk、ES、Hadoop,配置很麻烦,不能够跨平台
如果在Windows配置,最后部署发布在Linux的话,是会有天壤之别
传统:丢一个jar包,运维去做
现在:开发打包部署上线,一套流程做完!
java --- apk(软件)--- 发布(应用商店) ---- 现在有一个用户去使用这个软件 -- 安装就可以使用
java --- jar(环境都在里面) --- 打包项目带上环境(镜像) ---(Docker仓库:就好比上面的商店)--- 如果现在有人需要用(直接运行即可)
Docker给以上的问题,提出了解决方案
Docker的思想就来自于集装箱
如果现在java运行环境(JRE) -- 跑了多个应用(端口冲突) --- 原来都是交叉的!
隔离:Docker核心思想!打包装箱!每个箱子都是互相隔离
Docker的历史#
2010年,有几个搞IT的年轻人,在美国dotCloud
做一下pass的云计算服务 ! LXC有关的容器技术
他们将自己的技术(容器化技术)命名就是Docker!
Docker 刚刚诞生,没有引起行业的注意!dotCloud,就或不下去
开源
开放源代码!
2013年,Docker开源
Docker越来越多人发现docker的优点火了,Docker每个一个月就更新一个版本
2014年4月9日,Docker1.0发布!
Docker为什么这么火?十分的轻巧!
在容器技术出来之前,我们都是使用虚拟机技术!
虚拟机:在window中装一个Vmware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!
虚拟机也是属于虚拟化技术,Docker容器技术,也是一种虚拟化技术
vm, linux centos原生镜像(一个电脑!) 隔离,需要开启多个虚拟机
docker 隔离,镜像(最核心的环境 4m + jdk + mysql) 十分的小巧,运行镜像就可以!小巧!几个M kb秒级启动
到现在,所有开发人员都必须要会Docker!
聊聊Docker
Docker 是基于Go语言开发的!开发项目
文档地址:https://docs.docker.com/develop/
Docker能干嘛#
虚拟机技术缺点:
1.资源占用十分多
2.冗余步骤多
3.启动很慢
容器化技术
容器化技术不是模拟的一个完整的操作系统
比较Docker 和虚拟机技术的不同:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后再这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是相互隔离,每个容器内都有一个属于自己的的文件系统,互不影响
DevOps(开发,运维)
应用更快速的交付和部署#
传统:一堆帮助文档,安装程序
Docker:一键运行打包镜像发布测试,一键运行
更便捷的升级和扩展和扩缩容#
使用Docker之后,我们部署应用和搭积木一样
项目打包为一个镜像,扩展 服务器A 服务器B
更简单的运维#
在容器化之后,我们的开发,测试环境都是高度一致
更高效的计算资源利用#
Docker是内核级别的虚拟化,可以再一个物理机可以运行很多容器实例!服务器的性能可以被压榨到极致
Docker安装
Docker的基本组成 😭#
图片显示不了就网上找
镜像(image):#
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像 => run=> tomcat01容器(提供服务器),通过这个镜像可以创建多个容器,(最终服务运行或者项目运行就是在容器中)
容器(container):#
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个简易的Linux的系统
仓库(repository)#
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库!
Docker Hub
安装Docker#
环境准备
1、需要会点linux的基础
2、CentOS 7
3、我们使用Xshell连接远程服务器进行操作!
查看环境
# 系统内核是3.10
[root@iZwz94cw1gup8aldclit1qZ ~]# uname -r
3.10.0-1062.18.1.el7.x86_64
[root@iZwz94cw1gup8aldclit1qZ ~]# uname -r
3.10.0-1062.18.1.el7.x86_64
[root@iZwz94cw1gup8aldclit1qZ ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安装
帮助文档
# 1.卸载旧的版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2.需要的安装包
yum install -y yum-utils
# 3.设置镜像的仓库
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里云
# 更新yum软件包索引
yum makecache fast
# 5.安装docker 相关的内容 docker-ce社区版 ee企业版
yum install docker-ce docker-ce-cli containerd.io
# 6.启动docker
systemctl start docker
# 注意需要启动进行以下一系列的操作
# 不然会报 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
# 查看版本
[root@iZwz94cw1gup8aldclit1qZ /]# docker version
Client: Docker Engine - Community
Version: 19.03.11
API version: 1.40
Go version: go1.13.10
Git commit: 42e35e61f3
Built: Mon Jun 1 09:13:48 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.11
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 42e35e61f3
Built: Mon Jun 1 09:12:26 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
# 8、查看一下下载的这个 hello-world 镜像
[root@iZwz94cw1gup8aldclit1qZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 5 months ago 13.3kB
了解:卸载docker
# 1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2.删除资源
rm -rf /var/lib/docker
# /var/lib/docker docker的默认路径
阿里镜像加速#
1.登录阿里云找到
2.找到镜像加速地址
3.配置使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://p3jr2wkc.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker # 启动
回顾HelloWorld流程
Docker运行原理图:
DockerHub:是一个仓库
底层原理#
Docker是怎么工作的?
Docker是一个Client-Server 结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令
Docker 为什么比VM快?
1、Docker有着比虚拟机更少的抽象层
2、docker利用的是宿主机的内核,vm需要的是Guest OS
所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导,虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略复杂的过程,秒级
Docker的常用命令
帮助命令#
docker version # 显示版本信息
docker info # 显示docker的系统信息,包括镜像和容器数量
docker 命令 --help # 帮助命令
帮助文档的地址:https://docs.docker.com/reference/
镜像命令#
docker images 查看所有本地的主机上的镜像
[root@iZwz94cw1gup8aldclit1qZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 5 months ago 13.3kB
# 解析
REPOSITORY #镜像的仓库源
TAG #镜像的标签
IMAGE ID #镜像的id
CREATED #镜像的创建时间
SIZE #镜像的大小
[root@iZwz94cw1gup8aldclit1qZ /]# docker images --help
Options:可选项
-a, --all # 列出所有镜像
-q, --quiet # 只显示镜像的id
移除所有镜像#
[root@iZwz94cw1gup8aldclit1qZ /]# docker rmi -f $(docker ps -aq)
docker search 搜索镜像
[root@iZwz94cw1gup8aldclit1qZ /]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9582 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3482 [OK]
# 可选项 ,通过收藏来过滤
docker search mysql --filter=STARS=3000 #搜索出来的镜像就是STARS大与3000的
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9582 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3482 [OK]
[root@iZwz94cw1gup8aldclit1qZ /]# docker search mysql --filter=STARS=5000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9582 [OK]
docker pull 下载镜像
# 下载镜像docker pull 镜像名
[root@iZwz94cw1gup8aldclit1qZ /]# docker pull mysql
Using default tag: latest # 如果不写tag 默认既是最新版
latest: Pulling from library/mysql
afb6ec6fdc1c: Pull complete # 分层下载,docker iamge的核心,联合文件系统
0bdc5971ba40: Pull complete
97ae94a2c729: Pull complete
f777521d340e: Pull complete
1393ff7fc871: Pull complete
a499b89994d9: Pull complete
7ebe8eefbafe: Pull complete
597069368ef1: Pull complete
ce39a5501878: Pull complete
7d545bca14bf: Pull complete
211e5bb2ae7b: Pull complete
5914e537c077: Pull complete
Digest: sha256:a31a277d8d39450220c722c1302a345c84206e7fd4cdb619e7face046e89031d #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
# 等价于它
docker pull mysql == docker.io/library/mysql:latest
#指定版本下载
[root@iZwz94cw1gup8aldclit1qZ /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
afb6ec6fdc1c: Already exists
0bdc5971ba40: Already exists
97ae94a2c729: Already exists
f777521d340e: Already exists
1393ff7fc871: Already exists
a499b89994d9: Already exists
7ebe8eefbafe: Already exists
4eec965ae405: Pull complete
a531a782d709: Pull complete
270aeddb45e3: Pull complete
b25569b61008: Pull complete
Digest: sha256:d16d9ef7a4ecb29efcd1ba46d5a82bda3c28bd18c0f1e3b86ba54816211e1ac4
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 删除镜像
[root@iZwz94cw1gup8aldclit1qZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 a4fdfd462add 2 weeks ago 448MB
mysql latest 30f937e841c8 2 weeks ago 541MB
hello-world latest bf756fb1ae65 5 months ago 13.3kB
[root@iZwz94cw1gup8aldclit1qZ /]# docker rmi -f bf756fb1ae65 #删除指定的容器
Untagged: hello-world:latest
Untagged: hello-world@sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
[root@iZwz94cw1gup8aldclit1qZ /]# docker rmi -f a4fdfd462add
Untagged: mysql:5.7
Untagged: mysql@sha256:d16d9ef7a4ecb29efcd1ba46d5a82bda3c28bd18c0f1e3b86ba54816211e1ac4
Deleted: sha256:a4fdfd462add8e63749aa08ff0044b13d342a042965f1ec6744586cda10dfce9
Deleted: sha256:637f0ff7e591e53fe997c634cf10e63ab810dd1d6cb587ce46a57f753c36bdbf
Deleted: sha256:65ba4d5ac7eb5218cfb4be1e7807584425c19f47606bc1e6d53e050d480d9581
Deleted: sha256:7d0236d50948d993a686c69889c6f016a8da89b8557c5e0eaf6af145ea5877cb
Deleted: sha256:a6219b1270405f43892a7a12895ae1e0ccff307d162cf0025df3ed87f511754b
[root@iZwz94cw1gup8aldclit1qZ /]# docker rmi -f $(docker images -aq) # 删除全部的容器
Untagged: mysql:latest
Untagged: mysql@sha256:a31a277d8d39450220c722c1302a345c84206e7fd4cdb619e7face046e89031d
Deleted: sha256:30f937e841c82981a9a6363f7f6f35ed6b9d5e3f16df50a72207e4a2a389983f
Deleted: sha256:8a5e032615340d8936e0e3707a39ce3da51dc952368176818f879e2f868b535b
Deleted: sha256:c74673a735ca31b9b5162808ab451a8b20876a15e16a7899f2101f3c9b82df60
Deleted: sha256:430365c8e22a9207dca4638c523dc82163bca3ab8a335a71147af41d1551561f
Deleted: sha256:1ede41b1dbec1a5e4385200b62283ffb25c425275530ea9e9cc36b921186cd08
Deleted: sha256:2f6badb9fd9965261d3463591f8af4afddf5f141456de83dc994690ae64b34eb
Deleted: sha256:37803884320881cd931c77dea2ee4d8a7231dfed5a02dc595e6046ffacfa6e1b
Deleted: sha256:cefc9066dc1aa84f6cddead1bb5a8c590e8368d56fb65694e8783d70791bec20
Deleted: sha256:3bfbd2dd4507386ce56fd731b3c97d10bc058e6aa478f901466da69108db50e1
Deleted: sha256:9652363dd4c1146b3f9a519800a9f379adf0b6c4f9aece1ffe965dce5f52a8ca
Deleted: sha256:0ed190016efa0f19bcc5f1d66ffffc7b09716f3c57bcc5de74a4ce217af92278
Deleted: sha256:8399fb13d72603fdc8781075672ee25fedf8384f6721639a70dd3533250ed9e4
Deleted: sha256:ffc9b21953f4cd7956cdf532a5db04ff0a2daa7475ad796f1bad58cfbaf77a07
# docker rmi -f 镜像id #删除指定的容器
# docker rmi -f 镜像id,镜像id,镜像id #删除多个容器
# docker rmi -f $(docker images -aq) # 删除全部的容器
容器命令#
说明:我们有了镜像才可以创建容器,linux,下载一个centos 镜像来测试学习
docker pull centos
新建容器并启动#
docker run [可选参数] image
# 参数说明
--name=“Name" 容器名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080
-p ip:主机段端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
# 启动并进入到容器
[root@iZwz94cw1gup8aldclit1qZ /]# docker run -it centos /bin/bash
[root@d3757d18a8e7 /]#
列出所有的运行的容器
# docker ps 命令
#列出当前正在运行的容器
-a #列出当前正在运行的容器,带出历史运行过的容器
-n=? #显示最近创建的容器
-q #只显示容器编号
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3757d18a8e7 centos "/bin/bash" 3 minutes ago Exited (0) About a minute ago heuristic_wilson
01c7eef64c15 bf756fb1ae65 "/hello" 2 hours ago Exited (0) 2 hours ago
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps -a -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3757d18a8e7 centos "/bin/bash" 7 minutes ago Exited(0) 5 minutes ago heuristic_wilson
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps -aq
d3757d18a8e7
01c7eef64c15
退出容器
exit #直接退出容器
Ctrl + p + q # 容器不停止直接退出
# 查看
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORT NAMES
27f5afcc55c2 centos "/bin/bash" 34 seconds ago Up 33 seconds hopeful_banach
删除容器
docker rm 容器id #删除指定的容器 不能删除正在运行的容器,如果要强制删除rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -aq | xargs docker rm -f #删除所有的容器
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps -aq | xargs docker rm -f
27f5afcc55c2
启动和停止容器的操作
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
常用其他命令#
后台启动容器#
# 命令 docker run -d 镜像名
[root@iZwz94cw1gup8aldclit1qZ /]# docker run -d centos
# 问题docker ps 发现centos 停止了
# 常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立即停止,没有程序就会停止
查看日志命令#
# docker logs -f -t --tail 100 79b8c8f83b8f 查看前100条的日志
# 如果没有日志的话,自己写一个Shell脚本
# 通过docker写一个shell脚本
[root@2fae659c4a46 tmp]# vi hello.sh
#! /bin/bash
while
true
do
echo 'hello shell'
sleep 1;
done
# 显示日志
-tf # 显示日志
--tail number #要显示日志条数
# 这里需要服务器宿主机进行访问
docker logs -tf --tail 10 2fae659c4a46
如下可以看到一监控,运行hell.sh宿主机就能够检测到日志
查看镜像元数据#
[root@iZwz94cw1gup8aldclit1qZ tmp]# docker inspect 22fa19932db2
[
{
"Id": "22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b",
"Created": "2020-06-04T15:31:42.802413935Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 8240,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-06-04T15:31:43.103749077Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:470671670cac686c7cf0081e0b37da2e9f4f768ddc5f6a26102ccd1c6954c1ee",
"ResolvConfPath": "/var/lib/docker/containers/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b/hostname",
"HostsPath": "/var/lib/docker/containers/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b/hosts",
"LogPath": "/var/lib/docker/containers/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b/22fa19932db2580601375c920788e48fbd691ca202e8bd275cdeadec33b5537b-json.log",
"Name": "/sad_euclid",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Capabilities": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/577a554570a3b45302c3991c84d0ab78bbbf10ac559e23d688d8c88b84b64b28-init/diff:/var/lib/docker/overlay2/8da4cd669d4ba75e5aae59a0b99b386b7b54dd58da758a3eb56f91da3e3b460f/diff",
"MergedDir": "/var/lib/docker/overlay2/577a554570a3b45302c3991c84d0ab78bbbf10ac559e23d688d8c88b84b64b28/merged",
"UpperDir": "/var/lib/docker/overlay2/577a554570a3b45302c3991c84d0ab78bbbf10ac559e23d688d8c88b84b64b28/diff",
"WorkDir": "/var/lib/docker/overlay2/577a554570a3b45302c3991c84d0ab78bbbf10ac559e23d688d8c88b84b64b28/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "22fa19932db2",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200114",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS",
"org.opencontainers.image.created": "2020-01-14 00:00:00-08:00",
"org.opencontainers.image.licenses": "GPL-2.0-only",
"org.opencontainers.image.title": "CentOS Base Image",
"org.opencontainers.image.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "d4b50f9c15899a2ca59357d0d9c3effd8e42bc020c3a2ef63781b1a4f7f3d959",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/d4b50f9c1589",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "fb48cf4c42e91609af0ecb640797381368bb1f6df389426b4ffcb1b553803b29",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.8",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:08",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "97e9416f43bc7aedbbbf68e8397b5ea42431efb6a002f26187e2729c7de00ae5",
"EndpointID": "fb48cf4c42e91609af0ecb640797381368bb1f6df389426b4ffcb1b553803b29",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.8",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:08",
"DriverOpts": null
}
}
}
}
]
进入当前正在运行的容器
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it 容器
# 第一种
[root@iZwz94cw1gup8aldclit1qZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
713f94102873 centos "/bin/bash" 18 minutes ago Up 18 minutes elated_dhawan
22fa19932db2 centos "/bin/bash" 35 minutes ago Up 35 minutes sad_euclid
2fae659c4a46 centos "/bin/bash" 44 minutes ago Up 44 minutes zealous_stonebraker
c0d60da80c75 centos "/bin/bash" 2 hours ago Up 2 hours xenodochial_northcutt
8cbeb2158afc centos "/bin/bash" 3 hours ago Up 3 hours unruffled_swirles
51184e1e6ec3 centos "/bin/bash" 3 hours ago Up 3 hours jovial_roentgen
5bb81e29582d centos "/bin/bash" 3 hours ago Up 3 hours nice_mayer
79b8c8f83b8f centos "/bin/bash" 6 hours ago Up 6 hours elegant_lalande
[root@iZwz94cw1gup8aldclit1qZ /]# docker exec -it 5bb81e29582d /bin/bash
[root@5bb81e29582d /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@5bb81e29582d /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:06 pts/0 00:00:00 /bin/bash
root 19 0 0 16:08 pts/1 00:00:00 /bin/bash
root 33 19 0 16:08 pts/1 00:00:00 ps -ef
[root@5bb81e29582d /]#
#第二种
[root@iZwz94cw1gup8aldclit1qZ /]# docker attach 22fa19932db2
[root@22fa19932db2 tmp]# ls
ks-script-_srt3u3c ks-script-gpqu_kuo
[root@22fa19932db2 tmp]# cd ..
[root@22fa19932db2 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@22fa19932db2 /]# cd tmp
# docker exec -it 容器id # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach 容器id # 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
# 进入到容器中
docker exec -it 51184e1e6ec3 /bin/bash
# 在容器中新建一个文件
[root@51184e1e6ec3 home]# touch rzk.java
[root@51184e1e6ec3 home]# ls
rzk.java
[root@51184e1e6ec3 home]# exit
exit
# 把这个文件拷贝出来到我们主机上
[root@iZwz94cw1gup8aldclit1qZ /]# ls
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@iZwz94cw1gup8aldclit1qZ /]# docker cp 51184e1e6ec3:/home/rzk.java /tmp
[root@iZwz94cw1gup8aldclit1qZ tmp]# ls
hello.sh hsperfdata_root rzk.java
#拷贝是一个手动的过程,未来我们使用的是 -v卷的技术可以实现
Docker 安装Nginx#
1.搜索 nginx
# docker search nginx
2.下载 nginx
# docker pull nginx
3.运行测试
这里的 # -p 3344:80
# -p 暴露防火墙端口 通过3344 去访问 内部80端口
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d --name nginx02 -p 3344:80 nginx
02b2f941a66da088d4d0d814aaedb39c62f6e724cee8fbb98e272641645bd486
[root@iZwz94cw1gup8aldclit1qZ ~]# dicker ps
-bash: dicker: command not found
[root@iZwz94cw1gup8aldclit1qZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
02b2f941a66d nginx "/docker-entrypoint.…" 14 seconds ago Up 13 seconds 0.0.0.0:3344->80/tcp nginx02
c0d60da80c75 centos "/bin/bash" 3 hours ago Up 3 hours xenodochial_northcutt
51184e1e6ec3 centos "/bin/bash" 4 hours ago Up 4 hours jovial_roentgen
5bb81e29582d centos "/bin/bash" 4 hours ago Up 4 hours nice_mayer
79b8c8f83b8f centos "/bin/bash" 7 hours ago Up 7 hours elegant_lalande
[root@iZwz94cw1gup8aldclit1qZ ~]# curl localhost:3344
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@iZwz94cw1gup8aldclit1qZ ~]#
# 进入容器
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it nginx02 /bin/bash
root@02b2f941a66d:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@02b2f941a66d:/# cd /etc/nginx
root@02b2f941a66d:/etc/nginx# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
root@02b2f941a66d:/etc/nginx#
Docker 安装Tomcat#
# 官方使用
docker run -it --rm tomcat:9.0
# 之前使用的启动都是后台,停止了容器之后,容器还是可以查询得到,docker run -it --rm一般用来测试,用完就可以删除
# 下载启动
docker pull tomcat9.0
# 启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat
# 进入容器
docker exec -it tomcat01 /bin/bash
# 发现问题,1.linux 命令少了,2.没有webapps,阿里云镜像的原因导致的,它把不必要的都踢除了
# 保证最小运行的环境
思考问题:以后要部署项目的话,如果每次都要进入容器是不是很麻烦?我要是可以 在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了
Docker 安装Elasticsearch#
# es 暴露的端口多
# es 十分的耗内存
# es 的数据一般需要放置到安全目录,挂载
# --net somenetwork 网络配置
# 启动elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 查看运行的状态 docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
1afed8e13fa8 elasticsearch 0.31% 1.236GiB / 3.7GiB 33.40% 0B / 0B 0B / 0B 43
8febdf517af1 toncat01 0.18% 87.5MiB / 3.7GiB 2.31% 928kB / 50.4kB 0B / 0B 36
02b2f941a66d nginx02 0.00% 1.875MiB / 3.7GiB 0.05% 9.16kB / 11.9kB 0B / 0B 3
79b8c8f83b8f elegant_lalande 0.00% 544KiB / 3.7GiB 0.01% 972B / 0B 0B / 0B 1
# 测试一下ES是否启动成功
[root@iZwz94cw1gup8aldclit1qZ /]# curl localhost:9200
{
"name" : "1afed8e13fa8",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "El2Y1JA-TSW_ER82xWektA",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
# 启动成功之后就可以关闭,增加内存的测试
# 赶紧关闭,增加内存的限制,修改配置文件 -e 配置修改
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@iZwz94cw1gup8aldclit1qZ ~]# curl localhost:9200
{
"name" : "5c97790a32e8",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "3xE4EY7kTFGE0q4bxXlCmQ",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
使用 kibana连接es
需要加Linux内网Ip
可视化😄#
- portainer (先用这个)
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
- Rancher (CI/CD再用)
什么portainer?#
Docker 图形化界面管理工具!提供一个后台面板供我们操作
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试:外网:8088
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -p 8088:9000 \
> --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
d1e017099d17: Pull complete
b8084bf83dcf: Pull complete
Digest: sha256:55c7614b1ad61eabc27214299c42d41bb49e5ef78238c0e5783031f041499284
Status: Downloaded newer image for portainer/portainer:latest
b0fbdea34c7faf0017c4e9f33c22f78d9274cb62691ff00856c1c1bb384afe84
访问测试:http://ip:8088/
通过地址访问
Container:运行有几个,停止有几个
Images:当前仓库有几个镜像
Volume:数据卷挂载
Docker镜像讲解
特点
Docker 镜像都是只读的,当容器启动是,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层
如何提交一个自己的镜像#
commit镜像
docker commit 提交容器成为一 个新的副本
#命令和git原理类似
docker comit -m="提交的描述信息" -a=“作者” 容器id 目标镜像名,[TAG]
实战测试
# 启动一个默认的tomcat
# 发现这个默认的tomcat,webapps是没有文件的,把webapps.dist 下的拷到webapps下
cp -r webapps.dist/* webapps
# 拷完就直接
[root@iZwz94cw1gup8aldclit1qZ ~]# docker commit -a="rzk" -m="add webapps app" 5d487edfdbb4 tomcat02:1.0
sha256:4e478467565c893a0e2260eb6f34018120444576e7238cac4d5e7293d4d6b511
[root@iZwz94cw1gup8aldclit1qZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 4e478467565c 4 seconds ago 647MB
nginx latest 4392e5dad77d 5 days ago 132MB
portainer/portainer latest cd645f5a4769 6 days ago 79.1MB
redis latest 36304d3b4540 10 days ago 104MB
tomcat 9.0 1b6b1fe7261e 3 weeks ago 647MB
tomcat latest 1b6b1fe7261e 3 weeks ago 647MB
elasticsearch 7.6.2 f29a1ee41030 2 months ago 791MB
centos latest 470671670cac 4 months ago 237MB
容器数据卷
什么事容器数据卷#
docker的理念回顾
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我吧容器删除,数据就会丢失! 需求:数据可以持久化
那要是把MySQL容器刪了,就可以删库跑路了, 需求:MySQL数据可以存储在本地!
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面
总结一句话;容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷#
方式一:直接使用命令来挂载 -v
docker inspect bc4baa086e3e
Destination: 目的地 docker容器内的地址
Source:挂载区 主机内地址
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
测试文件同步
第一步在主机编写一个hello.java:
[root@iZwz94cw1gup8aldclit1qZ ceshi]# vi hello.java
[root@iZwz94cw1gup8aldclit1qZ ceshi]# ls
hello.java
[root@iZwz94cw1gup8aldclit1qZ ceshi]# cat hello.java
!# /bin/bash
echo '你好'
查看docker容器:
[root@bc4baa086e3e home]# ls
hello.java
[root@bc4baa086e3e home]# cat -n hello.java
1 !# /bin/bash
2
3 echo '你好'
会发现容器里面会出现一个和主机一样的文件
如果把容器停了,主机新建一个文件,容器会不会同步主机的文件呢#
# 停止容器 在宿主机编写
[root@iZwz94cw1gup8aldclit1qZ ceshi]# docker stop bc4baa086e3e
bc4baa086e3e
[root@iZwz94cw1gup8aldclit1qZ ceshi]# docker stop bc4baa086e3e
bc4baa086e3e
# 在宿主机修改文件
[root@iZwz94cw1gup8aldclit1qZ ceshi]# vi hello.java
[root@iZwz94cw1gup8aldclit1qZ ceshi]# cat hello.java
!# /bin/bash
echo '你好,我把容器停了,宿主机编写这段文字'
echo '哈哈哈,我又來了'
# 启动容器
[root@iZwz94cw1gup8aldclit1qZ ceshi]# docker start bc4baa086e3e
bc4baa086e3e
# 进入容器
[root@iZwz94cw1gup8aldclit1qZ ceshi]# docker attach bc4baa086e3e
[root@bc4baa086e3e home]# cat hello.java
!# /bin/bash
echo '你好,我把容器停了,宿主机编写这段文字'
echo '哈哈哈,我又來了'
以上可以得出,只要容器不删除,把容器停了,编写文件也会被同步到里面
实战:MySQL的数据持久化的问题!#
思考数据持久化
获取镜像
# docker pull mysql:5.7
# 运行容器,需要做数据挂载
# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
# -v /home/mysql/data:/var/lib/mysql 把mysql里面的东西挂载到data里面
[root@iZwz94cw1gup8aldclit1qZ home]# 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
be3e92f2f41715d7ce90c8b8af2a3506bacb6c50740d29ae88c4ec320b973279
# 启动成功之后,我们本地使用sqlyog来连接测试一下
# sqlyog -连接到服务器的3310 --- 331- 和容器内的3306映射,这个时候我们可以连接上了
# 在本地测试一个数据库,查看一下我们映射的路径是否ok!
# 步骤在SQLyog 新建一个test数据库,然后去终端mysql/data查看会不会出现一个test名字的文件
[root@iZwz94cw1gup8aldclit1qZ home]# ls
ceshi mysql nginx-1.14.0 nginx-1.14.0.tar.gz rzk
[root@iZwz94cw1gup8aldclit1qZ home]# cd mysql
[root@iZwz94cw1gup8aldclit1qZ mysql]# ls
conf data
[root@iZwz94cw1gup8aldclit1qZ mysql]# cd data
[root@iZwz94cw1gup8aldclit1qZ data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem
[root@iZwz94cw1gup8aldclit1qZ data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem test
[root@iZwz94cw1gup8aldclit1qZ data]#
假设把容器删除#
# 删除容器
root@iZwz94cw1gup8aldclit1qZ data]# docker rm -f mysql01
[root@iZwz94cw1gup8aldclit1qZ data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 查看mysql已经不在了
[root@iZwz94cw1gup8aldclit1qZ data]# docker ps -a
bc4baa086e3e centos "/bin/bash" 19 hours ago Up 16 hours xenodochial_goldstine
数据卷还是在的
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem test
可以发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能
具名和匿名挂载#
# 匿名挂载
-v 容器内路径
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
docker run -d -P --name nginx01 -v /etc/nginx naginx
[root@iZwz94cw1gup8aldclit1qZ test]# docker volume ls
DRIVER VOLUME NAME
local 427983870a2bffc00778cc5d1dc9d1dc9e91aae5a161fcaf6965e46b5d7b99b3
# 这里发现 ,这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径
# 具名挂载 通过 -v 卷名:容器内路径
-v 容器内路径
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
[root@iZwz94cw1gup8aldclit1qZ test]# docker run -d -P --name naginx02 -v juming-nginx:/etc/nginx nginx
50e60ad6712300264eb4acf707eac20d76a7dbc9597f08f0c9613a7877caadc3
[root@iZwz94cw1gup8aldclit1qZ test]# docker volume ls
DRIVER VOLUME NAME
local 427983870a2bffc00778cc5d1dc9d1dc9e91aae5a161fcaf6965e46b5d7b99b3
local b4e09d34098f10f10921f3a9b7960bb1c033b57c982d380272780c41d426857d
local juming-nginx
# 通过 -v 卷名:容器内路径
# 查看一下这个卷
[root@iZwz94cw1gup8aldclit1qZ data]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-06-09T16:36:01+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/***/data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用 具名挂载
区分具名和匿名挂载,还是指定路径挂载#
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
拓展
# 通过 -v 容器内路径 ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了
# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作
初始Dockerfile#
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!先体验一下!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命名,每个命令都是一层!
# 创建一个dockerfile文件,名字可以随意
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# pwd
/home/docker-test-volume
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# vim dockerfile1
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]#
# 文件内容
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# cat dockerfile1
FORM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
# 创建一个自己的镜像
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t rzk/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 470671670cac
Step 2/4 : VOLUME ["volume01","volume02"]
---> Using cache
---> 9305bf5771fa
Step 3/4 : CMD echo "----end----"
---> Using cache
---> 95ffd2f99bd0
Step 4/4 : CMD /bin/bash
---> Using cache
---> 2b667e117705
Successfully built 2b667e117705
Successfully tagged rzk/centos:1.0
# 查看镜像
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rzk/centos 1.0 2b667e117705 About an hour ago 237MB
rzk/centos latest 2b667e117705 About an hour ago 237MB
tomcat02 1.0 4e478467565c 31 hours ago 647MB
nginx latest 4392e5dad77d 6 days ago 132MB
portainer/portainer latest cd645f5a4769 7 days ago 79.1MB
redis latest 36304d3b4540 11 days ago 104MB
mysql 5.7 a4fdfd462add 2 weeks ago 448MB
tomcat 9.0 1b6b1fe7261e 3 weeks ago 647MB
tomcat latest 1b6b1fe7261e 3 weeks ago 647MB
elasticsearch 7.6.2 f29a1ee41030 2 months ago 791MB
centos latest 470671670cac 4 months ago 237MB
# 运行刚刚创建的镜像
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run -it 2b667e117705 /bin/bash
[root@2dbfa8697ecf /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
# 可以看到最后两行有我们挂载的数据卷目录
[root@2dbfa8697ecf /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 360 Jun 9 11:03 dev
drwxr-xr-x 1 root root 4096 Jun 9 11:03 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 Jan 13 21:48 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 128 root root 0 Jun 9 11:03 proc
dr-xr-x--- 2 root root 4096 Jan 13 21:49 root
drwxr-xr-x 11 root root 4096 Jan 13 21:49 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 Jun 9 10:54 sys
drwxrwxrwt 7 root root 4096 Jan 13 21:49 tmp
drwxr-xr-x 12 root root 4096 Jan 13 21:49 usr
drwxr-xr-x 20 root root 4096 Jan 13 21:49 var
drwxr-xr-x 2 root root 4096 Jun 9 11:03 volume01
drwxr-xr-x 2 root root 4096 Jun 9 11:03 volume02
可以看到最后两行有我们挂载的数据卷目录#
volume01和volume02有挂载肯定和外部有一个同步的目录
接下来就去查找挂载目录
# 创建一个文件
[root@2dbfa8697ecf /]# touch centainer.txt
# 在主机上查看运行的镜像id
[root@iZwz94cw1gup8aldclit1qZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2dbfa8697ecf 2b667e117705 "/bin/bash" 5 minutes ago Up 5 minutes
# 查看当前容器的信息 会看到一个Mounts
[root@iZwz94cw1gup8aldclit1qZ ~]# docker inspect 2dbfa8697ecf
# 找到
"Source": "/var/lib/docker/volumes/2bc86f85ca5cb0284857c7563ae5e3ed3fed075d88c2ccb29b9616a5896a07b4/_data"
进入到目录里面ls 查看是否同步文件
数据卷容器#
centos02 ---实现数据同步---> centos01
-- volumes - from 数据卷容器
两个或者多个容器之间实现数据共享
把01容器变成数据卷容器,然后别的容器来连接
启动3个容器,通过我们刚才自己写镜像启动
#第一个
[root@iZwz94cw1gup8aldclit1qZ /]# docker run -it --name docker10 rzk/centos:1.0
[root@9a956c283b13 /]#
#第二个
# --volumes-from 进行挂载
# 通过后面的docker10 进行绑定
# 通过rzk/centos:1.0 启动
[root@iZwz94cw1gup8aldclit1qZ _data]# docker run -it --name docker20 --volumes-from docker10 rzk/centos:1.0
[root@5444e01431e3 /]#
进行绑定后10 和20 的数据卷就同步挂载一起
只有数据卷会同步挂载,别的文件目录同步挂载不了
# 如果退出就进入正在运行的容器
docker attach 容器id
# 如果在搞第三个容器绑定的是docker10数据卷会同步吗
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -it --name docker30 --volumes-from docker10 rzk/centos:1.0
[root@9bedcf663ac0 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@9bedcf663ac0 /]# cd volume01
[root@9bedcf663ac0 volume01]# ls
file filedocker20
注意
进行绑定后10 和20 的数据卷就同步挂载一起
只有数据卷会同步挂载,别的文件目录同步挂载不了
测试:如果把docker10删了,查看一下20和30容器的数据卷里面的内容会不会没了
答案:不会
多个mysql实现共享
[root@iZwz94cw1gup8aldclit1qZ home]# 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
[root@iZwz94cw1gup8aldclit1qZ home]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
# 就可以实现两个容器数据同步
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止 。
一旦你持久化到本地,这个时候回,本地的数据是不会删除
DockerFile
DockerFile介绍#
dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建:
1.编写一个dockerfile文件
2.docker build构建成为一个镜像
3.docker run运行镜像
4.docker push 发布镜像(DockerHub,阿里云镜像仓库)
DockerFile构建过程#
基础知识:
1.每个保留字(指令)都必须是大写字母
2.执行从上到下顺序执行
3.# 表示注释
4.每个指令都会创建提交一个新的镜像层,并提交!
dockerfile是面向开发的,以后发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为企业交付的标准,必须掌握
DockerFile:构建文件,定义一切的步骤,源代码
Dockerimages:通过DockerFIle构成生成的镜像,最终发布和运行产品
Docker:容器就是镜像运行起来提供服务器
DockerFile的指令#
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行命令
ADD # 步骤,Tomcat镜像,这个tomcat压缩包,添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOST # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量
实战测试#
Docker Hub中99%镜像都会从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建的
创建一个Centos#
# 编写Dockerfile的文件
[root@iZwz94cw1gup8aldclit1qZ home]# cat dockerfile
FROM centos
MAINTAINER rzk<176907@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPAH
CME echo "---end---"
CMD /bin/bash
# 2.通过这个文件构成镜像
# 命令:docker build -f dockerfile文件路径 -t 镜像名:[tag]
Successfully built efbcb7388645
Successfully tagged mycentos:0.1
# 3.测试运行
# 查看有没有创建好镜像
[root@iZwz94cw1gup8aldclit1qZ mydockerfile-centos]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 efbcb7388645 About a minute ago 321MB
rzk/centos 1.0 7b22da40bcbd 2 hours ago 237MB
tomcat02 1.0 4e478467565c 47 hours ago 647MB
nginx latest 4392e5dad77d 7 days ago 132MB
portainer/portainer latest cd645f5a4769 8 days ago 79.1MB
redis latest 36304d3b4540 12 days ago 104MB
mysql 5.7 a4fdfd462add 2 weeks ago 448MB
tomcat 9.0 1b6b1fe7261e 3 weeks ago 647MB
tomcat latest 1b6b1fe7261e 3 weeks ago 647MB
elasticsearch 7.6.2 f29a1ee41030 2 months ago 791MB
centos latest 470671670cac 4 months ago 237MB
# 启动镜像
[root@iZwz94cw1gup8aldclit1qZ mydockerfile-centos]# docker run -it efbcb7388645
# 这个是在配置中设定好的,直接进入到local目录
[root@c8d7cf9a1600 local]# pwd
/usr/local
官方的centos是纯净的,连pwd都没有
自己配的centos
[root@c8d7cf9a1600 local]# pwd
/usr/local
查看镜像构建历史
[root@iZwz94cw1gup8aldclit1qZ ~]# docker history efbcb7388645
IMAGE CREATED CREATED BY SIZE COMMENT
efbcb7388645 5 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
f1810e7f530a 5 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
a648efc67641 5 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
125e5fb2eb41 5 hours ago /bin/sh -c #(nop) EXPOSE 80 0B
19a643e8cb4f 5 hours ago /bin/sh -c yum -y install net-tools 24.1MB
7cf165e5ab89 5 hours ago /bin/sh -c yum -y install vim 59.8MB
2adc83de3c37 5 hours ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
6d1fe1a19a57 5 hours ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
554a6e0ceb18 5 hours ago /bin/sh -c #(nop) MAINTAINER rzk<176907@qq.… 0B
470671670cac 4 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 4 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 4 months ago /bin/sh -c #(nop) ADD file:aa54047c80ba30064… 237MB
CMD和ENTRYPOINT 区别
#CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
#ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试cmd
# 编写 dockerfile2
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# cat dockerfile2
FROM centos
CMD ["ls","-a"]
# 构建镜像
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker build -f dockerfile2 -t cmdcentos .
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cmdcentos latest 2df214355824 12 seconds ago 237MB
mycentos 0.1 efbcb7388645 5 hours ago 321MB
rzk/centos 1.0 7b22da40bcbd 7 hours ago 237MB
tomcat02 1.0 4e478467565c 2 days ago 647MB
nginx latest 4392e5dad77d 7 days ago 132MB
portainer/portainer latest cd645f5a4769 8 days ago 79.1MB
redis latest 36304d3b4540 12 days ago 104MB
mysql 5.7 a4fdfd462add 2 weeks ago 448MB
tomcat 9.0 1b6b1fe7261e 3 weeks ago 647MB
tomcat latest 1b6b1fe7261e 3 weeks ago 647MB
elasticsearch 7.6.2 f29a1ee41030 2 months ago 791MB
centos latest 470671670cac 4 months ago 237MB
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run -it 2df214355824
. .dockerenv dev home lib64 media opt root sbin sys usr
.. bin etc lib lost+found mnt proc run srv tmp var
# 运行会发现ls启动
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run 2df214355824
测试ENTRYPOINT
# 编写ENTRYPOINT
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# vi entrypoint
FROM centos
entrypoint ["ls","-a"]
# 构建
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker build -f entrypoint -t entrypoint-test .
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run d16c0b89b79f
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# entrypoint加 -l
[root@iZwz94cw1gup8aldclit1qZ docker-test-volume]# docker run d16c0b89b79f -l
total 56
drwxr-xr-x 1 root root 4096 Jun 10 08:37 .
drwxr-xr-x 1 root root 4096 Jun 10 08:37 ..
-rwxr-xr-x 1 root root 0 Jun 10 08:37 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 Jun 10 08:37 dev
drwxr-xr-x 1 root root 4096 Jun 10 08:37 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 Jan 13 21:48 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 150 root root 0 Jun 10 08:37 proc
dr-xr-x--- 2 root root 4096 Jan 13 21:49 root
drwxr-xr-x 11 root root 4096 Jan 13 21:49 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 Jun 9 10:54 sys
drwxrwxrwt 7 root root 4096 Jan 13 21:49 tmp
drwxr-xr-x 12 root root 4096 Jan 13 21:49 usr
drwxr-xr-x 20 root root 4096 Jan 13 21:49 var
实战:Tomcat#
1.准备镜像文件 tomcat压缩包,JDK的压缩包
2.编写dockerfile文件,官方命名 Dockerfile
,build 会自动寻找这个文件,就不需要-f指定了
FROM centos
MAINTAINER rzk(176@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u241-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.31.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_241
ENV ClASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.31
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.31
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.31/bin/startup.sh && tail -F
/url/local/apache-tomcat-9.0.31/bin/logs/catalina.out
3.构建镜像
#如果有正在运行容器的端口先暂停
或者删除
# 删除容器 docker ps -a找到运行的容器id
docker rm 容器id
# 1.docker build -t diytomcat .
[root@iZwz94cw1gup8aldclit1qZ tomcat]# docker run -d -p 9889:8080 --name Tomcat -v /home/tomcat/test:/url/local/apache-tomcat-9.0.31/webapps/test -v /home/tomcat/tomcatlogs/:/url/local/apache-tomcat-9.0.31/logs diytomcat
ef08847039525522b70c461d2784c8f6bfe943d9381383a97a5affd33c5f3b7f
# 2.如果出现端口
docker: Error response from daemon: driver failed programming external connectivity on endpoint Tomcat (814bfe3ff4ce8f2e069f8199a5de21a846151ce82c810d2881c2302ea20b55cf): Error starting userland proxy: listen tcp 0.0.0.0:9090: bind: address already in use.
# 解决重启docker服务后再启动容器
systemctl restart docker
# 3.构建镜像
[root@iZwz94cw1gup8aldclit1qZ tomcat]# ls
apache-tomcat-9.0.31.tar.gz Dockerfile jdk-8u241-linux-x64.tar.gz readme.txt test tomcatlogs
# 4.运行容器
[root@iZwz94cw1gup8aldclit1qZ tomcat]# docker run -d -p 9889:8080 --name Tomcat -v /home/tomcat/test:/url/local/apache-tomcat-9.0.31/webapps/test -v /home/tomcat/tomcatlogs/:/url/local/apache-tomcat-9.0.31/logs diytomcat
0377387f992a388d046817e652f8a80ece7f04fb9dee0c00f44055f9f32458a1
# 5.进入正在运行的容器
[root@iZwz94cw1gup8aldclit1qZ tomcat]# docker exec -it 0377387f992a /bin/bash
[root@0377387f992a local]# ls
apache-tomcat-9.0.31 bin etc games include jdk1.8.0_241 lib lib64 libexec readme.txt sbin share src
[root@0377387f992a local]# ls -l
total 52
drwxr-xr-x 1 root root 4096 Jun 10 09:43 apache-tomcat-9.0.31
drwxr-xr-x 2 root root 4096 May 11 2019 bin
drwxr-xr-x 2 root root 4096 May 11 2019 etc
drwxr-xr-x 2 root root 4096 May 11 2019 games
drwxr-xr-x 2 root root 4096 May 11 2019 include
drwxr-xr-x 7 10143 10143 4096 Dec 11 10:39 jdk1.8.0_241
drwxr-xr-x 2 root root 4096 May 11 2019 lib
drwxr-xr-x 2 root root 4096 May 11 2019 lib64
drwxr-xr-x 2 root root 4096 May 11 2019 libexec
-rw-r--r-- 1 root root 0 Jun 10 09:42 readme.txt
drwxr-xr-x 2 root root 4096 May 11 2019 sbin
drwxr-xr-x 5 root root 4096 Jan 13 21:49 share
drwxr-xr-x 2 root root 4096 May 11 2019 src
# 测试能否访问端口
root@iZwz94cw1gup8aldclit1qZ tomcat]# curl localhost:9090
# 6.发布项目
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
如果退出容器想要进入容器的话#
[root@0377387f992a local]# exit
exit
[root@iZwz94cw1gup8aldclit1qZ tomcat]# docker exec -it 0377387f992a /bin/bash
[root@0377387f992a local]# ls -l
total 52
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Rzk</title>
</head>
<body>
RzkBlog<br/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>
发布自己的镜像#
DockerHub
1.地址 https://hub.docker.com/ 注册自己的账号
2.确定这个账号可以登录
3.在我们的服务器上提交自己的镜像
[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker login -u ruizhukai
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
4.登录完毕后就可以提交镜像,就剩一步docker push
# push自己的镜像到服务器上
# push镜像的问题
[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker push ruizhukai/tomcat:2.0
The push refers to repository [docker.io/ruizhukai/tomcat]
An image does not exist locally with the tag: ruizhukai/tomcat
# 解决,增加一个tag
[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker tag 0faea1dfca19 ruizhukai/tomcat:1.0
# docker push 上去即可!自己发布的镜像尽量带上版本号
[root@iZwz94cw1gup8aldclit1qZ tomcatlogs]# docker push ruizhukai/tomcat:1.0
The push refers to repository [docker.io/ruizhukai/tomcat]
f858ba4c4cbc: Pushed
a7f0f23a00d2: Pushed
3ec21c6199b9: Pushing [=======> ] 62.48MB/403.7MB
7fe7e9ffcc98: Pushed
0683de282177: Mounted from library/centos
发布到阿里云镜像上#
1.登录阿里云
2.找到容器镜像服务
3.创建命名空间
在镜像仓库里面新建一个
4.创建容器镜像
Docker网络
理解Docker网络#
清空所有的镜像
# docker rm -f $(docker ps -aq) 删除运行中的容器
# docker rmi -f $(docker images -aq) 删除全部镜像
查看网络
[root@iZwz94cw1gup8aldclit1qZ /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo <----- #对应的是本机回环地址
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:0e:e0:36 brd ff:ff:ff:ff:ff:ff
inet 172.18.233.211/20 brd 172.18.239.255 scope global dynamic eth0 # 阿里云内网地址
valid_lft 310864134sec preferred_lft 310864134sec
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:91:dd:12:c7 brd ff:ff:ff:ff:ff:ff # docker0地址
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
# 问题docker 是如何处理容器网络访问的?
# [root@iZwz94cw1gup8aldclit1qZ /]# docker run -d -P --name tomcat01 tomcat
# 查看容器的内部网络地址 ip addr 发现容器启动的时候会得到一个 eth0@if367 ip地址,docker分配的
# [root@iZwz94cw1gup8aldclit1qZ /]# docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
366: eth0@if367: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# 思考 , linux能不能ping 通容器
[root@iZwz94cw1gup8aldclit1qZ /]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.060 ms
# linux 可以ping 通 docker 容器内部
运行tomcat02
# [root@iZwz94cw1gup8aldclit1qZ /]# docker run -d -P --name tomcat02 tomcat
0c8a2fecd529531c92ffbe14d091823828d58e1e9f05ed69f96a41bf1a807d59
# [root@iZwz94cw1gup8aldclit1qZ /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:0e:e0:36 brd ff:ff:ff:ff:ff:ff
inet 172.18.233.211/20 brd 172.18.239.255 scope global dynamic eth0
valid_lft 310863367sec preferred_lft 310863367sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:91:dd:12:c7 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
367: vethe189624@if366: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 16:2b:5d:d8:35:41 brd ff:ff:ff:ff:ff:ff link-netnsid 0
369: vetha836941@if368: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether fa:ff:8c:d0:93:a3 brd ff:ff:ff:ff:ff:ff link-netnsid 1
# [root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat02 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
368: eth0@if369: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# 我们发现这个容器带来网卡,都是一对一对的
# evth-pair 就是一堆的虚拟设备接口,他们就是成对出现的,一段连着协议,一段彼此相连
# 正因为这个特性, evth-pair充当一个桥梁
原理#
1.我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装docker,就会有一个网卡 docker0,桥接模式,使用的技术是evth-pair技术
-- link#
思考一个场景,我们编写一个微服务,database url = ip ,项目不重启,数据库ip换掉了 ,我们希望可以处理这个问题,可以名字来进行访问容器?
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known
# [root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat01 tomcat
c9e51b6f5c164a946fe39601115d89e4692044e6dc0cfa8845051a5000a1e380
# [root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat02 tomcat
67d9ac053fd0b841ac48127238708bcd9b9a5f677588c00a69385f887a09bdec
# [root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
22eabed874351db1066828f0a1b2e26f04f3fb44c74bba3062e7410c10fbff0b
# 通过 --link 就可以连通网络
# [root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.100 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.075 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.077 ms
# 反向可以ping通吗?
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
如果要想访问容器具体的网络信息
[root@iZwz94cw1gup8aldclit1qZ ~]# docker newwork ls
docker: 'newwork' is not a docker command.
See 'docker --help'
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
85f4d9d63b38 bridge bridge local
b4bf70c72308 host host local
b12914554bcc none null local
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network inspect 85f4d9d63b38
探究:inspect
"Containers": {
"22eabed874351db1066828f0a1b2e26f04f3fb44c74bba3062e7410c10fbff0b": {
"Name": "tomcat03",
"EndpointID": "a2550318c36526ade484de76ffced2f52a35aee7f0b4250e6c3961f38694af5b",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
},
"67d9ac053fd0b841ac48127238708bcd9b9a5f677588c00a69385f887a09bdec": {
"Name": "tomcat02",
"EndpointID": "c8e0526801518058d9688c9f691ec9c913fd97aaf671195e2b0c83c426cf5067",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"c9e51b6f5c164a946fe39601115d89e4692044e6dc0cfa8845051a5000a1e380": {
"Name": "tomcat01",
"EndpointID": "b8a5ffddd521169ece2eb27ece96f370925d1f946876dfc48a3ab122246a456a",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
自定义网络
查看所有网络#
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
85f4d9d63b38 bridge bridge local
b4bf70c72308 host host local
b12914554bcc none null local
bridge:桥接 docker(默认)
host:和宿主机共享网络
none:不配置网络
[root@iZwz94cw1gup8aldclit1qZ ~]# docker rm -f $(docker ps -aq) 清空所有的网络
# 创建tomcat默认是这样指定网络
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P tomcat01 --net brige tomcat
#docker0特点,默认,域名不能访问 --link可以打通连接
# 可以自定义一个网络
# --driver bridge
# --subnet 192.168.0.0/16 192.168.0.2 192.168.255.255
# --gateway 192.168.0.1
#
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
bb8036aff34ef2fba3815f8c9ec2041a71cafad5136517bcae57319e451d301a
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
85f4d9d63b38 bridge bridge local
b4bf70c72308 host host local
bb8036aff34e mynet bridge local
b12914554bcc none null local
查看自己创建的网络
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "bb8036aff34ef2fba3815f8c9ec2041a71cafad5136517bcae57319e451d301a",
"Created": "2020-06-11T09:43:15.975142029+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
0b8455084d24ef5b9671ef001a70b024c6b90d58f4987757d056b4464f8851a2
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
2795089168bead0bf351c0a7c3ef9a3c696d03a1837c77d40c69d4833d6dfe9f
[root@iZwz94cw1gup8aldclit1qZ ~]# docker inspect mynet
[
{
"Name": "mynet",
"Id": "bb8036aff34ef2fba3815f8c9ec2041a71cafad5136517bcae57319e451d301a",
"Created": "2020-06-11T09:43:15.975142029+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0b8455084d24ef5b9671ef001a70b024c6b90d58f4987757d056b4464f8851a2": {
"Name": "tomcat-net-01",
"EndpointID": "4bc1e155dbd756746f089aeffc2accca845f8f9f6906c14e05e747405a24b690",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"2795089168bead0bf351c0a7c3ef9a3c696d03a1837c77d40c69d4833d6dfe9f": {
"Name": "tomcat-net-02",
"EndpointID": "4060a7613ae92954d76ad3a8bc6b82e37b1d688a525a2de00bbbe91c05fd3072",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
测试ping连接
# 再次ping网络
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.124 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.068 ms
# 不是用--link也可以ping的通名字了
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.059 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.070 ms
自定义网络docker都已经帮我们维护好了对应的关系,推荐我们这样使用
好处:
redis:
mysql:
网络连通#
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat01 tomcat
7b9181aa0d39f2ed823db2d1f7cd2bed0cf7a069f9d8c6ac9704d2b63794f901
[root@iZwz94cw1gup8aldclit1qZ ~]# docker run -d -P --name tomcat02 tomcat
f983c91ee178d820603545e2554d4263f24193b1aa949cfecef594944a544a4a
[root@iZwz94cw1gup8aldclit1qZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f983c91ee178 tomcat "catalina.sh run" 3 seconds ago Up 2 seconds 0.0.0.0:32778->8080/tcp tomcat02
7b9181aa0d39 tomcat "catalina.sh run" 6 seconds ago Up 6 seconds 0.0.0.0:32777->8080/tcp tomcat01
2795089168be tomcat "catalina.sh run" 16 minutes ago Up 16 minutes 0.0.0.0:32776->8080/tcp tomcat-net-02
0b8455084d24 tomcat "catalina.sh run" 17 minutes ago Up 17 minutes 0.0.0.0:32775->8080/tcp tomcat-net-01
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
# 查看怎么使用
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
--alias strings Add network-scoped alias for the container
--driver-opt strings driver options for the network
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--link list Add link to another container
--link-local-ip strings Add a link-local address for the container
# 测试打通
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network connect mynet tomcat01
[root@iZwz94cw1gup8aldclit1qZ ~]# docker inspect mynet
[
{
"Name": "mynet",
"Id": "bb8036aff34ef2fba3815f8c9ec2041a71cafad5136517bcae57319e451d301a",
"Created": "2020-06-11T09:43:15.975142029+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0b8455084d24ef5b9671ef001a70b024c6b90d58f4987757d056b4464f8851a2": {
"Name": "tomcat-net-01",
"EndpointID": "4bc1e155dbd756746f089aeffc2accca845f8f9f6906c14e05e747405a24b690",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"2795089168bead0bf351c0a7c3ef9a3c696d03a1837c77d40c69d4833d6dfe9f": {
"Name": "tomcat-net-02",
"EndpointID": "4060a7613ae92954d76ad3a8bc6b82e37b1d688a525a2de00bbbe91c05fd3072",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"7b9181aa0d39f2ed823db2d1f7cd2bed0cf7a069f9d8c6ac9704d2b63794f901": {
"Name": "tomcat01",
"EndpointID": "c9970b3fd3abdb0631c356fe795b517bd39a29dd6f2c8ec14bbb242d57796f9f",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
# 测试tomcat01能否ping通 tomcat-net-01
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.089 ms
# 02依旧ping不通
[root@iZwz94cw1gup8aldclit1qZ ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.089 ms
实战Redis
# 1.创建一个redis服务
[root@iZwz94cw1gup8aldclit1qZ ~]# docker network create redis --subnet 172.38.0.0/16
# 2.通过脚本创建六个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
docker run -p 6379${port}:6379 -p 1637${port}:1637 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \
# 3.创建六个redis配置
docker run -p 6371:6379 -p16371: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
docker run -p 6372:6379 -p16372: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
docker run -p 6373:6379 -p16373: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
docker run -p 6374:6379 -p16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/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
docker run -p 6375:6379 -p16375: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
docker run -p 6376:6379 -p16376: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
# 4.进入redis
# docker exec -it redis-1 /bin/sh
# 5.进入data
/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.1
5: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: 07b02dc06880ab596c94e00f124ed6ee85f4bf35 172.38.0.11:6379
slots:[0-5460] (5461 slots) master
M: 3961bedfc0ba9fafc856048182240b6dc82c2c88 172.38.0.12:6379
slots:[5461-10922] (5462 slots) master
M: 749eb4729d1a7c699677bcfd59f2d3fa48a8809e 172.38.0.13:6379
slots:[10923-16383] (5461 slots) master
S: 46583dea294055b779db7f1e53d79bbe2501e418 172.38.0.14:6379
replicates 749eb4729d1a7c699677bcfd59f2d3fa48a8809e
S: b18057c30f4bcb69ad9c3add993e225d5c8d23fa 172.38.0.15:6379
replicates 07b02dc06880ab596c94e00f124ed6ee85f4bf35
S: 9220ceed708855941493691cd15c5524389aa2fb 172.38.0.16:6379
replicates 3961bedfc0ba9fafc856048182240b6dc82c2c88
Can I set the above configuration? (type 'yes' to accept): y
/data #
# 7 连接
# 加 -c 是集群的意思
#/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:19447
cluster_stats_messages_pong_sent:19363
cluster_stats_messages_sent:38810
cluster_stats_messages_ping_received:19358
cluster_stats_messages_pong_received:19447
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:38810
# 8 查看主机和从机
#127.0.0.1:6379> cluster nodes
46583dea294055b779db7f1e53d79bbe2501e418 172.38.0.14:6379@16379 slave 749eb4729d1a7c699677bcfd59f2d3fa48a8809e 0 1591860270594 4 connected
9220ceed708855941493691cd15c5524389aa2fb 172.38.0.16:6379@16379 slave 3961bedfc0ba9fafc856048182240b6dc82c2c88 0 1591860269000 6 connected
749eb4729d1a7c699677bcfd59f2d3fa48a8809e 172.38.0.13:6379@16379 master - 0 1591860269591 3 connected 10923-16383
3961bedfc0ba9fafc856048182240b6dc82c2c88 172.38.0.12:6379@16379 master - 0 1591860270000 2 connected 5461-10922
b18057c30f4bcb69ad9c3add993e225d5c8d23fa 172.38.0.15:6379@16379 slave 07b02dc06880ab596c94e00f124ed6ee85f4bf35 0 1591860270092 5 connected
07b02dc06880ab596c94e00f124ed6ee85f4bf35 172.38.0.11:6379@16379 myself,master - 0 1591860268000 1 connected 0-5460
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK
# 9 设置键值对
# set a b
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.14:6379 # 可以扩大是放在4号机
OK
# 查看机器运行的状态
# 172.38.0.13:6379> cluster nodes
9220ceed708855941493691cd15c5524389aa2fb 172.38.0.16:6379@16379 slave 3961bedfc0ba9fafc856048182240b6dc82c2c88 0 1591860886546 6 connected
46583dea294055b779db7f1e53d79bbe2501e418 172.38.0.14:6379@16379 master,fail - 1591860650075 1591860647867 7 connected
3961bedfc0ba9fafc856048182240b6dc82c2c88 172.38.0.12:6379@16379 master - 0 1591860885544 2 connected 5461-10922
b18057c30f4bcb69ad9c3add993e225d5c8d23fa 172.38.0.15:6379@16379 slave 07b02dc06880ab596c94e00f124ed6ee85f4bf35 0 1591860885000 5 connected
07b02dc06880ab596c94e00f124ed6ee85f4bf35 172.38.0.11:6379@16379 master - 0 1591860885544 1 connected 0-5460
749eb4729d1a7c699677bcfd59f2d3fa48a8809e 172.38.0.13:6379@16379 myself,master - 0 1591860884000 8 connected 10923-16383
# 把对应的机器停掉,这里是4号机
-> Redirected to slot [15495] located at 172.38.0.14:6379
# docker stop redis-6
# 设置键值对完可能需要退出再进入
127.0.0.1:6379> set E G
-> Redirected to slot [6241] located at 172.38.0.16:6379
OK
#进入
# /data # redis-cli -c
Docker运行redis#
docker run -d --name myredis -p 6379:6379 -v data:/data redis:latest
--requirepass "你的密码(数字字母)" --appendonly yes
命令说明:
-p 6379:6379 : 将容器的6379端口映射到主机的6379端口
-v $PWD/data:/data : 将主机中当前目录下的data挂载到容器的/data
redis-server --appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置
docker run -d --name oosredis -p 6379:6379 -v /home/redis/data:/home/redis/data redis:latest --requirepass "rzkruizhukai123." --appendonly yes
Docker运行redis#
[root@rzk ~]# docker exec -it 90 redis-cli -- 进入redis
127.0.0.1:6379>
如果有密码需要输入密码才能set值
127.0.0.1:6379> auth rzkruizhukai123.
OK
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> set a 2
OK
127.0.0.1:6379> get a
"2"
SringBoot 微服务打包Docker镜像
1.构架springbook项目
2.打包应用
点击右栏的maven里面有Lifecycle找到packaage点击打包
3.在springboot项目里面编写dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
上面两部运行完之后,把这两个东西移动到linux的home/idea(idea项目名字随便)
4.构建镜像
#构建一个自己的镜像
# [root@iZwz94cw1gup8aldclit1qZ idea]# docker build -t rzk .
Sending build context to Docker daemon 16.47MB
Step 1/5 : FROM java:8
---> d23bdf5b1b1b
Step 2/5 : COPY *.jar /app.jar
---> ded6026c2e68
Step 3/5 : CMD ["--server.port=8080"]
---> Running in 88b3b92214ec
Removing intermediate container 88b3b92214ec
---> 9126a566d003
Step 4/5 : EXPOSE 8080
---> Running in 1a05e78ff468
Removing intermediate container 1a05e78ff468
---> 89e88b9ea304
Step 5/5 : ENTRYPOINT ["java","-jar","/app.jar"]
---> Running in 8471db1bb9cc
Removing intermediate container 8471db1bb9cc
---> cc6206f47451
Successfully built cc6206f47451
Successfully tagged rzk:latest
5.发布运行
docker run -d --restart=always --name oos -v /usr/local/logs:/home/jar-logs -p 8890:8089 oos
docker run -d --restart=always --name wxsever -v /usr/local/logs:/home/jar-logs -p 80:80 wxsever
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2020-01-14 jdbc oracle和mysql连接
2020-01-14 jdbc连接oracle