Docker从入门到放弃
文章目录
Docker 概述
Docker为什么会出现
Docker思想来自于集装箱
JRE – 多个应用(端口冲突) – 原来都是交叉的
隔离:Docker核心思想,打包装箱,每个箱子都是隔离的
Docker通过隔离机制,把服务器利用到极致
Docker的历史
2010年,成立dotCloud公司
刚开始做paaa的云计算服务,LXC有关的容器技术
他们将自己的容器化技术命名为Docker
2013年
开放源代码使得Docker技术进一步发展,越来越的使用者发现了Docker的优点,几乎每月都会更新一个版本
2014年4月9日,Docker1.0发布
优势:轻量级虚拟化
vm : linux centos原生镜像(一个电脑) 隔离:需要开启多个虚拟机
Docker : 隔离 镜像(最核心的环境4M+jdk+mysql) 十分的小巧
Docker是基于Go语言开发的
官网:https://docs.docker.com/
Docker能干什么
之前的虚拟化技术
虚拟机技术缺点:
- 资源占用十分多
- 冗余步骤多
- 启动很慢
容器化技术
容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机技术的不同:
- 传统虚拟机,虚拟出一条硬件,运行 一个完整的操作系统,然后在这个系统上安装和运行软件;
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了;
- 每个容器是互相隔离,每个容器内都有一个属于自己的文件系统互不影响;
DevOps(开发/运维)
满足应用的更快速交付和部署
传统:一推帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
更便捷的升级和扩缩容
项目打包为一个镜像,扩展 服务器
更简单的系统运维
在容器化之后,我们开发,测试环境都高度一致
更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上运行很多容器实例,服务器性能可以被利用到极致
Docker安装
Docker的基本架构模型
镜像(image):
Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,Tomcat镜像==>run==>tomcat01容器(提供服务器)
容器(container)
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的
日东,停止,删除,基本命令
目前就可以吧这个容器理解为一个简易的Linux系统
仓库(repository)
Docker Hub 是国外库
阿里云等都有容器服务器(配置镜像加速)
安装Docker
环境准备
- Centos 7
- 使用远程软件远程操作
官网:https://docs.docker.com/
环境查看
# 系统信息
[root@hyu ~]# 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"
# 内核版本
[root@hyu ~]# uname -r
3.10.0-1062.18.1.el7.x86_64
安装步骤,可去官方文档查看https://docs.docker.com/
#1.卸载旧版本
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.设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#默认是从国外的,不推荐
#推荐使用国内的
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#4.安装docker相关的 docker-ce 社区版 而ee是企业版
yum install docker-ce docker-ce-cli containerd.io
#5、启动docker
systemctl start docker
#开机自启
systemctl enable docker
#6. 使用docker version查看是否安装成功
docker version
#7. 测试
docker run hello-world
#可不做操作
#加入root组
[root@sqx111 etc]# groupadd docker
[root@sqx111 etc]# usermod -aG docker $USER、
#重启docker
[root@sqx111 etc]# systemctl restart docker
了解:卸载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://dnbymi06.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker run image 命令 流程图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/59498452e2b8fe91f85626804253fb03.png)
底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
Docker-Server接收到Docker-Client的指令,就会执行这个命令!
为什么Docker比Vm快
1、docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
2、docker利用的是宿主机的内核,而不需要Guest OS。
GuestOS: VM(虚拟机)里的的系统(OS);
HostOS:物理机里的系统(OS);
因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。从而避免引导、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了这个复杂的过程,因此新建一个docker容器只需要几秒钟。
Docker的常用命令
帮助命令
docker version #显示docker的版本信息。
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
帮助文档地址:https://docs.docker.com/engine/reference/commandline
https://hub.docker.com/
镜像命令
查看镜像
docker images # 查看所有本地主机上的镜像 可以使用docker image ls代替
#解释
PEPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-all -a 显示所有信息
-q -quiet 只显示镜像ID
搜索镜像
docker search # 搜索镜像
[root@sqx ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10743 [OK]
mariadb MariaDB Server is a high performing open sou… 4046 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 790 [OK]
percona Percona Server is a fork of the MySQL relati… 532 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 87
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 81
#解释
DESCRIPTION #描述
#可选项
--filter=STARS=4046 #例:搜索出的镜像STARS大于4046
[root@sqx ~]# docker search mysql --filter=STARS=4046
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10743 [OK]
mariadb MariaDB Server is a high performing open sou… 4046 [OK]
拉取镜像 — 在虚拟机上运行docker拉取镜像时,如果是net网络模式,可使用DHCP自动分配地址模式,即可解决无法拉取报错
docker pull 镜像名 #如果不写[:tag],默认下载最新版
docker pull 镜像名[:tag] # 下载镜像 docker image pull
#指定版本下载
docker pull mysql:5.7 #期中5.7是mysql版本,可在docker官网中搜索mysql可显示支持版本
删除镜像
#删除单个
docker rmi -f 镜像ID # 删除指定的镜像 docker image rm -f 镜像ID 强制删除
#删除多个
docker rmi -f 镜像ID 镜像ID #删除多个镜像
#删除全部
docker rmi -f $(docker images -aq) # 删除全部的镜像,递归删除
#解释
rmi其中的i为image的缩写
-f #删除所有
容器命令
新建容器并启动
docker run 镜像id # 新建容器并启动
docker run [可选参数] image | docker container run [可选参数] image
#参数说明
--name="Name" 容器名字 tomcat01 tomcat02 用来区分容器
--net 网络配置
-d 后台方式运行
-it 使用交互方式运行,进入容器,查看内容
-v 挂载
-e 集群
-p 指定容器的端口 -p 8080(宿主机):8080(容器)
-p ip:主机端口:容器端口 #主机端口映射到容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
--privileged=true 授权
#随机指定
-P(大写) 随机指定端口
#---启动---进入
docker run -it 容器
#京东豆实例(使用镜像新建容器--启动--地址--日志--端口号)
docker run -dit --name jingdong -v /volume1/docker/jd_scripts/config:/jd/config -v /volume1/docker/jd_scripts/logs:/jd/log -p 5678:5678 --restart always 镜像地址
docker pull 镜像地址
查看容器状态
docker ps # 列出所有运行的容器 docker container list
#docker ps命令 #列出当前正在运行的容器
-a, --all #带出历史运行的容器
-n=数量, --last int #显示最近创建的几个容器
-q, --quiet #只显示容器的编号 (CONTAINER ID)
#实例
docker ps -aq #显示所有容器的ID
docker ps -a -n=2 #显示最近创建的两个容器
docker inspect name/容器ID #查看镜像详细信息,包括制作者、适应架构、各层的数字摘要等。
#返回Docker对象的底层信息
#-f, --format string 使用给定的Go模板格式化输出
#-s, --size 如果类型是container,则显示总文件大小
# --type string 返回指定类型的JSON
删除容器
docker rm # 容器id 删除指定容器(不能删除运行的容器,没有添加-f参数)
docker rm -f $(docker ps -qa) #强制全部删除所有容器
docker rm -a -q|xargs docker rm #删除所有容器
容器状态管理
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
exit #容器直接退出
ctrl+P+Q #容器不停止退出
其他常用命令
后台启动命令
# 命令 docker run -d 镜像名
docker run -d centos
#解释
-d 后台运行
#此时使用docker ps查看容器时发现容器消失了
#注意点:docker 容器使用后台使用,必须要有一个前台进程,docker发现没有应用,就会自动停止
查看日志
docker logs --help
Options:
--details Show extra details provided to logs
* -f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
* --tail string Number of lines to show from the end of the logs (default "all")
* -t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #练习模拟日志
#显示日志
-tf #显示日志信息(一直更新)
--tail number #需要显示日志条数
docker logs -t --tail 行数 容器id #查看多少行日志
docker logs -ft 容器id #全部显示,跟着日志
-c #循环执行后面的脚本,没有-c会自动关闭容器
查看容器进程命令
docker top 容器ID
[root@sqx ~]# docker top jingdong
UID PID PPID C STIME TTY
root 2951 6026 0 12:47 ?
root 3965 2951 0 12:52 ?
root 3966 2951 0 12:52 ?
root 4894 5973 0 Apr12 ?
root 5166 6026 0 Apr11 ?
root 5500 5166 0 Apr11 ?
查看镜像的元数据
# 命令
docker inspect 容器id
[root@sqx ~]# docker inspect jingdong
[
{
"Id": "811d671d0025d111f1132a7e1067a95ca94aec9f96b8afd60f450c2a2ee26331",
"Created": "2021-03-10T08:44:21.64480457Z",
"Path": "docker-entrypoint.sh",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 5996,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-04-06T02:12:56.309528123Z",
"FinishedAt": "2021-04-06T01:21:46.208283205Z"
},
"Image": "sha256:9a23fb41457fafcb62eb9763d84e5cada039898d1bf849f69aebb5bec692728d",
"ResolvConfPath": "/www/server/docker/containers/811d671d0025d111f1132a7e1067a95ca94aec9f96b8afd60f450c2a2ee26331/resolv.conf",
"HostnamePath": "/www/server/docker/containers/811d671d0025d111f1132a7e1067a95ca94aec9f96b8afd60f450c2a2ee26331/hostname",
"HostsPath": "/www/server/docker/containers/811d671d0025d111f1132a7e1067a95ca94aec9f96b8afd60f450c2a2ee26331/hosts",
"LogPath": "/www/server/docker/containers/811d671d0025d111f1132a7e1067a95ca94aec9f96b8afd60f450c2a2ee26331/811d671d0025d111f1132a7e1067a95ca94aec9f96b8afd60f450c2a2ee26331-json.log",
"Name": "/jingdong",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": [
"964c60d985d3f4bb49970b6cedfaefdc1af91b7ddadaf848f009687d46b5e046",
"a9887a3cec4e41d4a833d4b4b21d5849c9b13c99f133bc00a46991d42d5e8886",
"621c24ff9edd1fd056bc35949bab71c758b59095f55d72c8f33aa7da869c1e37"
],
"HostConfig": {
"Binds": [
"/volume1/docker/jd_scripts/config:/jd/config",
"/volume1/docker/jd_scripts/logs:/jd/log"
],
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {
"5678/tcp": [
{
"HostIp": "",
"HostPort": "5678"
}
]
},
"RestartPolicy": {
"Name": "always",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"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": "/www/server/docker/overlay2/0dc9d2026abde544c3b253f16e4967eb8325abe1ecd6ac9b07e1c3c876076fee-init/diff:/www/server/docker/overlay2/82051cf1526e1fba8018ea100c869f2f1f1c301c9795042b87614020d482c6ba/diff:/www/server/docker/overlay2/a5348d0e32d62b25f16397d57b323d44e90cc13fb2b4132f3e04ea729bc8c6ff/diff:/www/server/docker/overlay2/8bed411955d57a5a2cd6b631fe2c3ee12551758e73c3a4208c0a1fd23768bbc8/diff:/www/server/docker/overlay2/4cab1367c9b373fb29446a9fe32f6a8bb5958bc303a9240266bdc292351c0700/diff:/www/server/docker/overlay2/1a707ae6a8ef46aa16f663609d3ce042050c35d963921ba5f38ef7d310bdda9f/diff:/www/server/docker/overlay2/438d8f17e4198be5815839e6bc657e491751b3c89f7717a411ca06d259afa301/diff",
"MergedDir": "/www/server/docker/overlay2/0dc9d2026abde544c3b253f16e4967eb8325abe1ecd6ac9b07e1c3c876076fee/merged",
"UpperDir": "/www/server/docker/overlay2/0dc9d2026abde544c3b253f16e4967eb8325abe1ecd6ac9b07e1c3c876076fee/diff",
"WorkDir": "/www/server/docker/overlay2/0dc9d2026abde544c3b253f16e4967eb8325abe1ecd6ac9b07e1c3c876076fee/work"
},
"Name": "overlay2"
},
"Mounts": [
{
"Type": "bind",
"Source": "/volume1/docker/jd_scripts/config",
"Destination": "/jd/config",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "bind",
"Source": "/volume1/docker/jd_scripts/logs",
"Destination": "/jd/log",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
"Config": {
"Hostname": "811d671d0025",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"5678/tcp": {}
},
"Tty": true,
"OpenStdin": true,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NODE_VERSION=14.16.0",
"YARN_VERSION=1.22.5",
"LANG=zh_CN.UTF-8",
"SHELL=/bin/bash",
"PS1=\\u@\\h:\\w $ ",
"JD_DIR=/jd",
"ENABLE_HANGUP=true",
"ENABLE_WEB_PANEL=true"
],
"Cmd": null,
"Image": "shuye72/jd-base:gitee",
"Volumes": null,
"WorkingDir": "/jd",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "bf4027976aeaf55ae5f937ceecce2998aa9f0f09f9f19a840d9364b2e9f913e7",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"5678/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "5678"
}
]
},
"SandboxKey": "/var/run/docker/netns/bf4027976aea",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "ce20eee21f259a75b953bd6ec28fd53eeca782f0f7ff920e94383a23465831ba",
"Gateway": "172.18.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.18.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:12:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "d0e12b340469a553893fc8e5840165b6c52e5989c179e10327f114cc33a69845",
"EndpointID": "ce20eee21f259a75b953bd6ec28fd53eeca782f0f7ff920e94383a23465831ba",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:02",
"DriverOpts": null
}
}
}
}
]
进入当前正在运行的容器
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it 容器id bashshell
#测试
docker ps # 查看
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55321bcae33d centos "/bin/sh -c 'while t…" 10 minutes ago Up 10 minutes bold_bell
a7215824a4db centos "/bin/sh -c 'while t…" 13 minutes ago Up 13 minutes zen_kepler
55a31b3f8613 centos "/bin/bash" 15 minutes ago Up 15 minutes lucid_clarke
# 方式一
docker exec -it 55321bcae33d /bin/bash # 进入
# 方式二
docker attach 容器id
#测试
docker attach 55321bcae33d
正在执行当前的代码...
###################区别####################
#docker exec # 进入当前容器后开启一个新的终端,可以在里面操作(常用)
#docker attach # 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝到主机上
docker cp 容器id:容器内路径 主机的目的路径
#进入docker容器内部
docker exec -it 55321bcae33d /bin/bash
[root@55321bcae33d /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
#新建一个文件
[root@55321bcae33d /]# echo "hello" > java.java
[root@55321bcae33d /]# cat java.java
hellos
[root@55321bcae33d /]# exit
exit
docker cp 55321bcae33d:/java.java / #拷贝
cd /
ls #可以看见java.java存在
命令汇总
attach Attach local standard input, output, and error streams to a running container
#当前shell下attach连接指定运行的镜像
build Build an image from a Dockerfile # 通过Dockerfile定制镜像
commit Create a new image from a container changes #提交当前容器为新的镜像
cp Copy files/folders between a container and the local filesystem #拷贝文件
create Create a new container #创建一个新的容器
diff Inspect changes to files or directories on a containers filesystem #查看docker容器的变化
events Get real time events from the server # 从服务获取容器实时时间
exec Run a command in a running container # 在运行中的容器上运行命令
export Export a containers filesystem as a tar archive #导出容器文件系统作为一个tar归档文件[对应import]
history Show the history of an image # 展示一个镜像形成历史
images List images #列出系统当前的镜像
import Import the contents from a tarball to create a filesystem image #从tar包中导入内容创建一个文件系统镜像
info Display system-wide information # 显示全系统信息
inspect Return low-level information on Docker objects #查看容器详细信息
kill Kill one or more running containers # kill指定docker容器
load Load an image from a tar archive or STDIN #从一个tar包或标准输入中加载一个镜像[对应save]
login Log in to a Docker registry #注册或登录一个源服务器
logout Log out from a Docker registry #从当前docker registry
logs Fetch the logs of a container #输出房钱容器日志信息
pause Pause all processes within one or more containers #暂停容器
port List port mappings or a specific mapping for the container#查看映射端口对应的容器的内部源端口
ps List containers #列出容器列表
pull Pull an image or a repository from a registry #从docker镜像源服务器拉取指定镜像
push Push an image or a repository to a registry #推送指定镜像或者源服务器到docker源服务器
rename Rename a container #更改容器名
restart Restart one or more containers #重启运行的容器
rm Remove one or more containers #移除一个或者多个容器
rmi Remove one or more images#移除一个或者多个镜像(无容器使用该镜像才可删除,否则需删除相关容器或-f强制删除)
run Run a command in a new container #创建一个新的容器并运行一个命令
save Save one or more images to a tar archive #保存一个镜像为一个tar包【对应load】
search Search the Docker Hub for images #搜索镜像
start Start one or more stopped containers #启动容器
stats Display a live stream of container(s) resource usage statistics#
stop Stop one or more running containers #停止容器
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE #给源中镜像添加标签
top Display the running processes of a container #查看容器中运行的进程信息
unpause Unpause all processes within one or more container #取消暂停镜像
update Update configuration of one or more containers #更新一个或多个容器的配置
version Show the Docker version information #查看docker版本号
wait Block until one or more containers stop, then print their exit codes#截取容器停止时的退出状态值
可视化
- portainer
docker run -d -p 8088:9000 \
> --restart=always -v /var/run/dockerr.sock:/var/run/docker.sock --privileged=true portainer/portainer
[root@sqx111 ~]# docker run -d -p 8088:9000 \
> --restart=always -v /var/run/dockerr.sock:/var/run/docker.sock --privileged=true portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
94cfa856b2b1: Pull complete
49d59ee0881a: Pull complete
a2300fd28637: Pull complete
Digest: sha256:fb45b43738646048a0a0cc74fcee2865b69efde857e710126084ee5de9be0f3f
Status: Downloaded newer image for portainer/portainer:latest
WARNING: IPv4 forwarding is disabled. Networking will not work.
d2ede080c4ada528e718c8e28793330dcbc2a38ea7ae14d7ad566676331684cb
[root@sqx111 ~]#
- Rancher(CI/CD)
什么是portainer?
Docker图像化界面管理工具!提供一个后台面板供我们操作
Docker部署nginx
搜索镜像
#docker search nginx
[root@sqx111 ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 14741 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2013 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 813 [OK]
jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 179
linuxserver/nginx An Nginx container, brought to you by LinuxS… 142
tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 122 [OK]
jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager 105 [OK]
dockerhub搜索nginx
拉取镜像
[root@sqx111 ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
Digest: sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412
Status: Image is up to date for nginx:latest
docker.io/library/nginx:latest
生成容器
#检验镜像
[root@sqx111 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 62d49f9bab67 6 days ago 133MB
[root@sqx111 ~]# docker run -dit --name nginx -p 3344:80 nginx
WARNING: IPv4 forwarding is disabled. Networking will not work.
2fd8568a31f7006bdbed35c016a88f4282eba5e4804112967c1dd0bb2e0e7384
#解释
#--name 容器名
#-p 端口映射 宿主机端口:容器内端口
检验
[root@sqx111 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2fd8568a31f7 nginx "/docker-entrypoint.…" 23 seconds ago Up 18 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx
[root@sqx111 ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
如需外网访问,需放行3344端口
容器内
[root@sqx111 ~]# docker exec -it nginx /bin/bash
root@2fd8568a31f7:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@2fd8568a31f7:/#
#解释
#so文件在/usr/lib/nginx
#nginx配置文件在/etc/nginx
#html文件在/usr/share/nginx
Docker部署Tomcat
#官方用于测试命令
[root@sqx111 ~]# docker run -it --rm tomcat:9.0
#测试完成直接删除
正常流程
#下载
[root@sqx111 ~]# docker pull tomcat
Using default tag: latest
#docker images
#启动运行
[root@sqx111 ~]# docker run -d -p 3355:8080 --name tomcat tomcat
WARNING: IPv4 forwarding is disabled. Networking will not work.
7c17326ca7f821789c64e9578e315c309bc31f2d9a761cd3544550ffc5bb9fe4
#测试访问
[root@sqx111 ~]# curl localhost:3355
#或
#外网访问测试
#提示404
#进入容器
[root@sqx111 ~]# docker exec -it tomcat /bin/bash
root@7c17326ca7f8:/usr/local/tomcat# whereis tomcat
tomcat: /usr/local/tomcat
root@7c17326ca7f8:/usr/local/tomcat# ls
BUILDING.txt README.md conf temp
CONTRIBUTING.md RELEASE-NOTES lib webapps
LICENSE RUNNING.txt logs webapps.dist
NOTICE bin native-jni-lib work
#发现问题
#1、linux 命令少
root@7c17326ca7f8:/usr/local/tomcat# ll
bash: ll: command not found
root@7c17326ca7f8:/usr/local/tomcat# ls -al
total 148
drwxr-xr-x. 11 root root 4096 Apr 11 03:31 .
drwxr-xr-x. 12 root root 4096 Apr 11 03:25 ..
-rw-r--r--. 1 root root 18984 Mar 30 10:29 BUILDING.txt
-rw-r--r--. 1 root root 5587 Mar 30 10:29 CONTRIBUTING.md
-rw-r--r--. 1 root root 57092 Mar 30 10:29 LICENSE
-rw-r--r--. 1 root root 2333 Mar 30 10:29 NOTICE
-rw-r--r--. 1 root root 3257 Mar 30 10:29 README.md
-rw-r--r--. 1 root root 6898 Mar 30 10:29 RELEASE-NOTES
-rw-r--r--. 1 root root 16507 Mar 30 10:29 RUNNING.txt
drwxr-xr-x. 2 root root 4096 Apr 11 03:31 bin
drwxr-xr-x. 3 root root 4096 Apr 20 02:25 conf
drwxr-xr-x. 2 root root 4096 Apr 11 03:31 lib
drwxrwxrwx. 2 root root 4096 Apr 20 02:25 logs
drwxr-xr-x. 2 root root 4096 Apr 11 03:31 native-jni-lib
drwxrwxrwx. 2 root root 30 Apr 11 03:31 temp
drwxr-xr-x. 2 root root 6 Apr 11 03:31 webapps
drwxr-xr-x. 7 root root 81 Mar 30 10:29 webapps.dist
drwxrwxrwx. 2 root root 6 Mar 30 10:29 work
root@7c17326ca7f8:/usr/local/tomcat#
#2、没有webapps 阿里云镜像原因,默认为最小镜像,不必要的都已被剔除,保证最小化运行环境
root@7c17326ca7f8:/usr/local/tomcat/webapps# ls
root@7c17326ca7f8:/usr/local/tomcat/webapps#
#发现文件都在webapps.dist里面
root@7c17326ca7f8:/usr/local/tomcat# cd webapps.dist/
root@7c17326ca7f8:/usr/local/tomcat/webapps.dist# ls
ROOT docs examples host-manager manager
root@7c17326ca7f8:/usr/local/tomcat/webapps.dist# cd ..
root@7c17326ca7f8:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@7c17326ca7f8:/usr/local/tomcat#
#解释
# -r 由于webapps.dist目录里文件多所以要使用递归复制
ES(elasticsearch)+kibana
#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 #查看CPU存活状态
curl localhost:9200 #检测是否安装成功
#增加内存限制 -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@sqx111 ~]# curl localhost:9200
{
"name" : "9cff00958b7f",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "-9kQADztTnKJJPXzSud9CQ",
"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"
}
[root@sqx111 ~]#
kibana连接ES
Docker镜像加载原理
UnionFS(联合文件系统)
下载时分层就符合这个原理
Docker镜像讲解
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容、包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像
- 从远程仓库下载
- 复制
- 自己制作一个镜像DockerFile
Docker镜像加载原理
UnionFS(联合文件系统)
UnionFs(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层一层的叠加,同事可以将不同的目录挂载到通哟个虚拟文件系统下(unite several directories into a single vritual filesystem),Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性😋:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
docker镜像实际上由一层一层的文件系统租车仓,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加速器和内核。当boot加载完成之后整个内个就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
#解释
#kernel 核心
#BootLoader 引导程序
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以,因为底层直接用host的kernel,自己只需要提供rootfs就可以了,由此可见对于不同的Linux发行商,bootfs基本上是一直的,rootfs会有差别,因此不同的发行版可以公用bootfs。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GPdRPhOG-1634784766938)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210421094852500.png)]
分层理解
分层的镜像
分层下载
最大的好处莫过于资源共享,多个镜像都从相同的base构建而来,那么宿主机只需要在磁盘上保留一份base镜像,同时内存也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看镜像分层方式可以通过docker image inspect命令
[root@sqx111 ~]# docker image inspect nginx:latest
[
{
//....
"Type": "layers",
"Layers": [
"sha256:7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d",
"sha256:4dc529e519c4390939b1616595683c89465782bb7d9fc7b90b30cc1e95bc723a",
"sha256:23c959acc3d0eb744031aef67adf6ceb5120a19c8869727d588f7d9dabd75b09",
"sha256:15aac1be5f02f2188ab40430b28a5f79be1bcb805db315bbe4d70f70aeabaa36",
"sha256:974e9faf62f1a3c3210e3904420ffec1dc351b756ac33024f2dd2683bf44c370",
"sha256:64ee8c6d0de0cfd019841b29c8cb18f4ab38e4687f7784866b840d5b2c31c8b9"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层
如何提交自己的镜像
commit镜像
docker commit 提交容器成为一个新的容器
docker commit -m "提交的描述信息" -a "作者" 容器ID 目标镜像名:[TAG]
#[TAG] 版本
测试
之前拉取的Tomcat镜像生成容器后发现webapps目录下没有文件,现在做出修改后使用commit命令提交为新容器
[root@sqx111 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c17326ca7f8 tomcat "catalina.sh run" 24 hours ago Exited (143) 20 hours ago tomcat
[root@sqx111 ~]# docker start tomcat
tomcat
[root@sqx111 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c17326ca7f8 tomcat "catalina.sh run" 24 hours ago Up 4 seconds 0.0.0.0:3355->8080/tcp, :::3355->8080/tcp tomcat
[root@sqx111 ~]# docker exec -it tomcat /bin/bash
root@7c17326ca7f8:/usr/local/tomcat# cd webapps
root@7c17326ca7f8:/usr/local/tomcat/webapps# ls
root@7c17326ca7f8:/usr/local/tomcat/webapps#
#发现文件都在webapps.dist里面
root@7c17326ca7f8:/usr/local/tomcat# cd webapps.dist/
root@7c17326ca7f8:/usr/local/tomcat/webapps.dist# ls
ROOT docs examples host-manager manager
root@7c17326ca7f8:/usr/local/tomcat/webapps.dist# cd ..
root@7c17326ca7f8:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@7c17326ca7f8:/usr/local/tomcat# cd webapps
root@7c17326ca7f8:/usr/local/tomcat/webapps#ls
ROOT docs examples host-manager manager
root@7c17326ca7f8:/usr/local/tomcat/webapps# exit
exit
[root@sqx111 ~]# docker commit -m="add webapps app" -a="sqx" 7c17326ca7f8 tomcat01:1.0
sha256:8f60433007b0305b8cef5166b8672f5e32ed058c6ddfc983b415019a09eb3fd7
[root@sqx111 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c17326ca7f8 tomcat "catalina.sh run" 24 hours ago Up 2 minutes 0.0.0.0:3355->8080/tcp, :::3355->8080/tcp tomcat
[root@sqx111 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat01 1.0 8f60433007b0 10 seconds ago 672MB
tomcat latest bd431ca8553c 9 days ago 667MB
[root@sqx111 ~]#
[root@sqx111 ~]# curl localhost:3355
访问正常
如果想保存当前容器的状态,就可以通过commit来提交,获得一个新镜像(快照)
容器数据卷
什么是容器数据卷
将应用和环境打包成一个镜像
数据如果都在容器中,删除容器,数据就会丢失
需求:数据可以持久化、MySQL数据可以存储在本地
容器之间可以有一个数据共享技术!Docker容器中产生额数据,同步到本地!
卷技术,也就是目录的挂载。
将我们的容器内的目录,挂载到Linux
目的:容器的持久化和同步操作,容器间数据共享
使用数据卷
1、直接使用命令来挂载
docker run -it -p 主机端口:容器内目录 -v /
查看底层信息
docekr inspect 容器ID
找到Mounts即为挂载地址
- Source 宿主机内/目标地址
- Destination docker容器内的地址
测试
#docker run -it -p 宿主机端口:容器端口 --name 容器名字 -v 容器地址:宿主机地址(目的地址) 镜像
[root@sqx111 ~]# docker run -it -p 3355:8080 --name tomcat -v /home/tomcatshuju:/usr/local/tomcat/webapps tomcat
WARNING: IPv4 forwarding is disabled. Networking will not work.
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/openjdk-11
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usruli.jar
Using CATALINA_OPTS:
NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.ls=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.utilava.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/MED.....
[root@sqx111 ~]# docker start tomcat
tomcat
[root@sqx111 tomcatshuju]# docker inspect tomcat
.......
},
"Mounts": [
{
"Type": "bind",
"Source": "/home/tomcatshuju", #宿主机地址
"Destination": "/usr/local/tomcat/webapps", #容器地址
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
......
#出现挂载地址,说明挂载成功
[root@sqx111 ~]# docker exec -it tomcat /bin/bash
root@33eecd239d4b:/usr/local/tomcat# ls
BUILDING.txt NOTICE RUNNING.txt lib te
CONTRIBUTING.md README.md bin logs we
LICENSE RELEASE-NOTES conf native-jni-lib we
root@33eecd239d4b:/usr/local/tomcat# cd webapps
root@33eecd239d4b:/usr/local/tomcat/webapps# ls
root@33eecd239d4b:/usr/local/tomcat/webapps# cd ..
root@33eecd239d4b:/usr/local/tomcat# cp -r webapps.dist/* webap
root@33eecd239d4b:/usr/local/tomcat# cd webapps
root@33eecd239d4b:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
[root@sqx111 home]# cd tomcatshuju/
[root@sqx111 tomcatshuju]# ls
[root@sqx111 tomcatshuju]# ls
docs examples host-manager manager ROOT
[root@sqx111 tomcatshuju]#
继续测试
- 停止容器
- 宿主机上修改文件
- 启动容器
- 容器内的数据依旧是同步的
优势
- 文件只需要在宿主机进行修改,不必进去容器,即可自动同步
实战:安装mysql
MySQL数据持久化问题
#获取镜像
#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@sqx111 home]# docker run --name mysqlcs -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/data:/var/lib/mysql -v /home/mysql/conf:/etc/mysql/conf.d mysql:5.7
#验证
[root@sqx111 data]# docker inspect mysqlcs
.....
},
"Mounts": [
{
"Type": "bind",
"Source": "/home/mysql/data",
"Destination": "/var/lib/mysql",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
.....
[root@sqx111 ~]# cd /home
[root@sqx111 home]# ls
mysql sqx tomcatshuju
[root@sqx111 home]# cd mysql/
[root@sqx111 mysql]# ls
conf data
[root@sqx111 mysql]# cd data/
[root@sqx111 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@sqx111 data]#
#完成之后,可以在本地使用sqlyog测试
#使用sqlyog连接3310端口,创建数据库,发现宿主机/home/mysql/data目录下也生成刚才创建的数据库
#此时即使删除容器,宿主机的数据库也不会丢失,这就实现了容器数据持久化功能
匿名和具名挂载
#匿名挂载
-v 容器路径
docker run -d -P -v /etc/nginx --name nginx nginx
docker voluem ls #查看容器地址
#这里发现显示地址都是乱码,即匿名挂载,没有给宿主机设置名称
#使用docker inspect nginx可查看挂载的具体位置
#具名挂载
docker run -d -P -v jumingnginx:/etc/nginx --name nginx01 nginx
docker volume ls
#此时发现,出现卷名为jumingnginx的卷
docker inspect nginx01 #查看容器挂载目录
docker挂载时所有的卷,在未指定位置时,会默认存放在
/var/lib/docker/volumes
我们通常使用具名挂载,可以方便找到我们的卷
#如何确定使用的挂载方式
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v 宿主机路径:容器内路径 #指定路径挂载
拓展
#通过 -v 卷名:容器内路径:ro/rw 改变读写权限
ro readonly #只读:只能通过宿主机来操作,容器内部无法操作
rw readwrite #读写
初识DockerFile(构建镜像)
CockerFile就是用来构建docker镜像的构建文件,命令脚本!(手工打造镜像)
通过这个脚本生成镜像,镜像分层,脚本就是一个一个的命令
#创建一个dockerfile文件,名字可以随意,建议dockerfile
#dockerfile1内容----指令大写
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
#这里的每条命令都是镜像的一层
# docker build -f /地址/dockerfile -t sqx/centos:版本号 .
-f 指定dockerfile文件地址
-t 名字:TAG(版本号可加可不加,不加默认最新版本--latest)
. 当前目录下
#这里创建/home/docker-test/volume
#vim dockerfile1添加脚本
docker build -f /home/docekr-test-volume/dockerfile01 -t ceshi-centos .
测试
docker run -it --name ceshi-centos ceshi-centos /bin/bash
#进入容器发现volume01和volume02两个目录
#这是脚本中自动生成的生成-----并且匿名挂载
查看卷挂载路径
docker inspect ceshi-centos
#显示挂载地址
使用场景非常多,通常会构建自己的镜像
假设构建镜像时没有挂载卷,要手动镜像挂载 -v卷名:容器内路径
数据卷容器(容器备份)
多个mysql同步数据/共享(备份)
[root@sqx111 home]# docker run --name mysql01 -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /var/lib/mysql -v /etc/mysql/conf.d mysql:5.7
[root@sqx111 home]# docker run --name mysql02 -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --volumes-from mysql01 mysql:5.7
#此时可以实现容器的数据同步
结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
但是一旦持久化到本地,及时删除所有容器卷,本地数据也不会删除
存在问题:数据卷容器的可不可以端口相同?????????????????????????????????
DockerFile
dockerfile用来构建docker镜像的文件!命令参数脚本
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库)
进入dockerhub,看官方怎么做
官方镜像都是基础包,很多功能没有,我们通常自己搭建镜像来用
Dockerfile构建过程
基础知识
- 每个保留关键字(指令)必须是大写字母
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会提交一个新的镜像层,并提交
dockerfile面向开发,发布项目做镜像就要编写dockerfile文件,
docker镜像逐渐成为企业交付的标准
步骤:开发、部署、运维
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务器
DockerFile指令
FROM #基础镜像
MAINTAINER #镜像是谁写的 姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤 安装Tomcat镜像 Tomcat压缩包就是其中的添加的内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE :
CMD #指定这个容器启动的时候要需要运行的命令 只有最后一个会生效可被替代
ENTRYPOINT #指定这个容器启动的时候要需要运行的命令 可以追加的命令
ONBUILD #当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令,触发指令
COPY #类似ADD 将我们的文件拷贝到镜像中
ENV #构建镜像时候设置环境变量
实战测试
Docker Hub中99%镜像都是从这个基础镜像过来的FROM scratch, 然后配置需要的软件和配置来进行构建
#编写dockerfile配置文件
[root@sqx111 dockerfile]# vim mydockerfile
[root@sqx111 dockerfile]# cat mydockerfile
FROM centos
MAINTAINER sqx<562066852@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH #/bin/bash进入容器时所处于的目录
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
#构建镜像
docker build -f dockerfile所在位置 -t 镜像名字:[TAG] 保存地址
#最后的保存地址一定不要忘记
[root@sqx111 dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .
...
...
...
...
...
Successfully built d3cab43d7eaa
Successfully tagged mycentos:0.1
#测试
[root@sqx111 dockerfile]# docker run -it --name mycentos mycentos:0.1
[root@e53fdfa722bf local]# ls
bin etc games include lib lib64 libexec sbin share src
[root@e53fdfa722bf local]# pwd
/usr/local
[root@e53fdfa722bf local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
最原始的centos镜像,没有net-tools、没有vim命令,现在命令都可执行
发现进入容器所处默认的目录为/usr/loacl,之前默认为根目录
我们可以列出本地镜像的变更历史
[root@sqx111 dockerfile]# docker history mycentos:0.1
IMAGE CREATED CREATED BY SIZE COMMENT
d3cab43d7eaa 10 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
5b6a5580f534 10 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
f3c2e67eb3aa 10 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
951137e8ca5d 10 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
376d8b35b34b 10 minutes ago /bin/sh -c yum -y install net-tools 14.3MB
833b88504f5f 10 minutes ago /bin/sh -c yum -y install vim 58MB
0775b8488f7a 11 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
f0d12e7190b9 11 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
6a4f9d8f0384 11 minutes ago /bin/sh -c #(nop) MAINTAINER sqx<562066852@… 0B
300e315adb2f 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:bd7a2aed6ede423b7… 209MB
[root@sqx111 dockerfile]#
DockerFile中CMD和ENTRYPOINT区别
CMD #指定这个容器启动时要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动时要运行的命令,可以追加命令
测试:
#CMD
[root@sqx111 dockerfile]# vim dockerfile-cmd-text
FROM centos
CMD ["ls","-a" ]
[root@sqx111 dockerfile]# docker build -f dockerfile-cmd-text -t cmd-test .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : CMD ["ls","-a" ]
---> Running in 7e066e6c0a7e
Removing intermediate container 7e066e6c0a7e
---> 2b55b16e0cb8
Successfully built 2b55b16e0cb8
Successfully tagged cmd-test:latest
[root@sqx111 dockerfile]# docker run cmd-test -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
[root@sqx111 dockerfile]# docker run cmd-test ls -al
total 32
drwxr-xr-x. 17 root root 4096 Apr 23 06:03 .
drwxr-xr-x. 17 root root 4096 Apr 23 06:03 ..
-rwxr-xr-x. 1 root root 0 Apr 23 06:03 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Apr 23 06:03 dev
drwxr-xr-x. 52 root root 4096 Apr 23 06:03 etc
drwxr-xr-x. 2 root root 6 Nov 3 15:22 home
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------. 2 root root 6 Dec 4 17:37 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 15:22 media
drwxr-xr-x. 2 root root 6 Nov 3 15:22 mnt
drwxr-xr-x. 2 root root 6 Nov 3 15:22 opt
dr-xr-xr-x. 265 root root 0 Apr 23 06:03 proc
dr-xr-x---. 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x. 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx. 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 15:22 srv
dr-xr-xr-x. 13 root root 0 Apr 23 04:42 sys
drwxrwxrwt. 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x. 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x. 20 root root 4096 Dec 4 17:37 var
[root@sqx111 dockerfile]#
[root@sqx111 dockerfile]# vim dockerfile-entrypoint-test
FROM centos
ENTRYPOINT ["ls","-a"]
[root@sqx111 dockerfile]# docker build -f dockerfile-entrypoint-test -t entrypoint .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 065ca094510a
Removing intermediate container 065ca094510a
---> 102624161812
Successfully built 102624161812
Successfully tagged entrypoint:latest
[root@sqx111 dockerfile]# docker run entrypoint -l
total 32
drwxr-xr-x. 17 root root 4096 Apr 23 06:07 .
drwxr-xr-x. 17 root root 4096 Apr 23 06:07 ..
-rwxr-xr-x. 1 root root 0 Apr 23 06:07 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Apr 23 06:07 dev
drwxr-xr-x. 52 root root 4096 Apr 23 06:07 etc
drwxr-xr-x. 2 root root 6 Nov 3 15:22 home
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------. 2 root root 6 Dec 4 17:37 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 15:22 media
drwxr-xr-x. 2 root root 6 Nov 3 15:22 mnt
drwxr-xr-x. 2 root root 6 Nov 3 15:22 opt
dr-xr-xr-x. 265 root root 0 Apr 23 06:07 proc
dr-xr-x---. 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x. 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx. 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 15:22 srv
dr-xr-xr-x. 13 root root 0 Apr 23 04:42 sys
drwxrwxrwt. 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x. 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x. 20 root root 4096 Dec 4 17:37 var
[root@sqx111 dockerfile]#
实战Tomcat镜像
1、准备镜像文件Tomcat压缩包,jdk的压缩包
[root@sqx111 home]# cd tomcat
[root@sqx111 tomcat]# ls
apache-tomcat-9.0.24-windows-x64.zip jdk-7u79-linux-x64.tar.gz
[root@sqx111 tomcat]# ll
总用量 162472
-rw-r--r--. 1 root root 12856789 4月 23 16:44 apache-tomcat-9.0.24-windows-x64.zip
-rw-r--r--. 1 root root 153512879 4月 23 16:44 jdk-7u79-linux-x64.tar.gz
[root@sqx111 tomcat]#
2、编写dockerfile文件------官方命名为Dockerfile,build会自动寻找这个文件,如果名字为Dockerfile,则不需要-f指定了
#Dockerfile配置文件
1 FROM centos
2
3 MAINTAINER sqx<562066852@qq.com>
4
5 COPY readme.txt /usr/local/readme.txt
6
7 ADD jdk-8u291-linux-x64.tar.gz /usr/local/
8 ADD apache-tomcat-9.0.45.tar.gz /usr/local/
9
10 RUN yum -y install vim
11
12 ENV MYPATH /usr/local
13 WORKDIR $MYPATH
14
15 ENV JAVA_HOME /usr/local/jdk1.8.0_291
16 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME:/lib/tools.jar
17 ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.45
18 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.45
19 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
20
21
22 EXPOSE 8080
23
24 CMD /usr/local/apache-tomcat-9.0.45/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.45/bin/logs/catalina.out
docker build -t diytomcat .
[root@sqx111 tomcat]# docker build -t diytomcat .
Sending build context to Docker daemon 272.2MB
Step 1/15 : FROM centos
---> 300e315adb2f
Step 2/15 : MAINTAINER sqx<562066852@qq.com>
---> Using cache
---> 6a4f9d8f0384
Step 3/15 : COPY readme.txt /usr/local/readme.txt
---> ed00cfa36ab8
Step 4/15 : ADD jdk-8u291-linux-x64.tar.gz /usr/local/
---> d679e71c6c8a
Step 5/15 : ADD apache-tomcat-9.0.45.tar.gz /usr/local/
---> 9d98a38b0a40
Step 6/15 : RUN yum -y install vim
---> Running in 144a3f1ec07e
CentOS Linux 8 - AppStream 4.5 MB/s | 6.3 MB 00:01
CentOS Linux 8 - BaseOS 2.0 MB/s | 2.3 MB 00:01
CentOS Linux 8 - Extras 17 kB/s | 9.6 kB 00:00
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
...
...
...
Successfully built 6c1f4d497af7
Successfully tagged diytomcat:latest
[root@sqx111 tomcat]# docker run -it --name diytomcat -p 9090:8080 -v /home/tomcatbeifen:/usr/local/apache-tomcat-9.0.45/webapps/test -v /home/toncatlogs:/usr/local/apache-tomcat-9.0.45/logs diytomcat
[root@6e4375a5ade4 local]# ls
apache-tomcat-9.0.45 bin etc games include jdk1.8.0_291 lib lib64 libexec readme.txt sbin share src
#此时如果访问访问失败,报(56)错可能是run命令结尾添加了/bin/bash
#解决方法,把/bin/bash去掉
Docker全流程小结
#生成tar包
[root@sqx111 home]# docker save --help
Usage: docker save [OPTIONS] IMAGE [IMAGE...]
Save one or more images to a tar archive (streamed to STDOUT by default)
Options:
-o, --output string Write to a file, instead of STDOUT #目录
[root@sqx111 home]#
Docker网络(容器编排
理解Docker网络
首先清空所有资源环境
docker rm -f $(docker ps -aq)#强制删除所有容器
docker rmi -f $(docker images -aq)#强制删除所有镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FJwM2vzb-1634784766968)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210426125335686.png)]
三个网络
docker是如何处理容器网络访问的?
[root@sqx111 ~]# docker run -it -P --name tomcat01 tomcat
Unable to find image 'tomcat:latest' locally
latest: Pulling from library/tomcat
bd8f6a7501cc: Pull complete
[root@sqx111 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest c0e850d7b9bb 3 days ago 667MB
#查看容器网络状态
[root@sqx111 ~]# docker start tomcat01
tomcat01
[root@sqx111 ~]# 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
16: eth0@if17: <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
[root@sqx111 ~]# 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.247 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.051 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.068 ms
^Z
[3]+ 已停止 ping 172.17.0.2
[root@sqx111 ~]#
#此时主机可以ping通docker
宿主机[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UYotyYVR-1634784766969)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210426142758038.png)]
容器内部
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nlW0zjQh-1634784766971)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210426142826721.png)]
原理
1、如上图所示,我们启动docker容器,docker会给容器分配一个ip,我们只要安装了docker,宿主机就会多一个网卡docker0桥接模式,所使用的技术就是veth-pair技术,
2、新建tomcat02,发现结论–网卡成对增加
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VNH6mhlf-1634784766972)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210426144025150.png)]
veth-pair:一对的虚拟设备接口,都是成对出现,一端连着协议,一端彼此相连,可充当桥梁,连接各种虚拟网络设备
OpenStack,Docker容器之间的连接,OVS的连接都是使用veth -pair技术
3、测试下容器内部是否互通
[root@sqx111 ~]# docker exec -it tomcat02 /bin/bash
root@f759ef90802f:/usr/local/tomcat# 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.240 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.089 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.175 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.079 ms
^Z
[1]+ Stopped ping 172.17.0.2
root@f759ef90802f:/usr/local/tomca
网络模型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zaJTMHtY-1634784766974)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210426144630861.png)]
结论:
1、tomcat01和tomcat02共用一个“路由器”,docker0 。所有不使用 --net 参数指定网络的情况下,都是使用docker0路由,docker会给我们的容器分配默认可用ip
2、docker网络使用的是Linux桥接,宿主机中的容器网桥:docker0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BKkWxseI-1634784766977)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210426145423661.png)]
3、docker网络接口都是虚拟的,优势:转发效率高,删除容器,对应网桥自行消失。
–link
重点:
高可用:编写一个微服务,database url:ip ,项目不用重启,数据库ip换掉了,用名字来进行访问容器。
[root@sqx111 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f759ef90802f tomcat "catalina.sh run" 26 minutes ago Up 9 seconds 0.0.0.0:49157->8080/tcp, :::49157->8080/tcp tomcat02
b75155152046 tomcat "catalina.sh run" 47 minutes ago Up 44 minutes 0.0.0.0:49155->8080/tcp, :::49155->8080/tcp tomcat01
[root@sqx111 ~]# docker exec -it tomcat01 ping tomcat02
ping: tomcat02: Name or service not known
[root@sqx111 ~]#
此时无法ping通
link相当于添加host文件里的地址
实操
#在VMware虚拟机中,使用net模式固定ip连接网络后,需要在虚拟机内更改DHCP自动获取模式
#否则link不通
[root@sqx111 ~]# docker run -it -P --name tomcat03 --link tomcat02 tomcat
WARNING: IPv4 forwarding is disabled. Networking will not work.
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/openjdk-11
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
...
...
...
[root@sqx111 ~]# 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.277 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.052 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.053 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.052 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=5 ttl=64 time=0.052 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=6 ttl=64 time=0.061 ms
^Z64 bytes from tomcat02 (172.17.0.3): icmp_seq=7 ttl=64 time=0.062 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=8 ttl=64 time=0.054 ms
--- tomcat02 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 11ms
rtt min/avg/max/mdev = 0.052/0.082/0.277/0.074 ms
[root@sqx111 ~]#
#成功
#查看tomcat03容器的hosts文件
[root@sqx111 ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
"172.17.0.3 tomcat02 f759ef90802f" #此处为link自动增加的hosts映射
172.17.0.4 f96a4c9ef5fe
#尝试使用tomcat02 ping tomcat03
[root@sqx111 ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Temporary failure in name resolution
#不通,检查发现hosts文件没有像tomcat03那样的映射配置
[root@sqx111 ~]# docker exec -it tomcat02 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 f759ef90802f
[root@sqx111 ~]#
#查看某一容器的网络配置
docker network ls
docker network inspect 网卡信息
docker0出现问题,不支持容器名连接访问
自定义网络
查看所有的docker网络
[root@sqx111 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f7285957e979 bridge bridge local
06d548b90454 host host local
390307e9a4b6 none null local
[root@sqx111 ~]#
网络模式
- bridge:桥接(docker默认,如docker0,自己创建时也是使用bridge模式)
- none:不配置网络
- host:和宿主机共享网络
- container:容器网络连通(局限性)
测试
#之前我们使用直接启动命令"docker run -it --name 容器名 镜像名"生成镜像时,相当于"docker run -it --name 容器名 --net bridge 镜像名" --net bridge 就是docker0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NLtxidLG-1634784766978)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210427162845731.png)]
#docker0特点:默认的,域名不能访问,--link可以打通连接
#我们可以自定一个网络
#规范:
docker network creare --driver bridge --subnet 子网(192.168.0.0/16)--gateway 网关(192.168.0.1)网桥名称
**实操:**自定义网络
#--driver bridge #默认桥接
#--subnet 192.168.0.0/16 #子网地址
#--gateway 192.168.0.1 #网关
[root@sqx111 ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
8224f0202d67d2a28b45cfa6933015675edfe9fcbbb834f04b7db0cd093466f7
[root@sqx111 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f7285957e979 bridge bridge local
06d548b90454 host host local
8224f0202d67 mynet bridge local
390307e9a4b6 none null local
[root@sqx111 ~]#
#查看
[root@sqx111 ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "8224f0202d67d2a28b45cfa6933015675edfe9fcbbb834f04b7db0cd093466f7",
"Created": "2021-04-27T16:43:01.674642851+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@sqx111 ~]#
#默认bridge网桥默认不能ping容器名,而自建的网桥可以
#验证:使用新建的网桥新建容器
[root@sqx111 ~]# docker run -it -P --name tomcat-mynet-01 --net mynet tomcat
[root@sqx111 ~]# docker run -it -P --name tomcat-mynet-02 --net mynet tomcat
[root@sqx111 ~]# docker start tomcat-mynet-01 tomcat-mynet-02
tomcat-mynet-01
tomcat-mynet-02
#此时没通过--link添加hosts映射
[root@sqx111 ~]# docker exec -it tomcat-mynet-01 ping tomcat-mynet-02
PING tomcat-mynet-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-mynet-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.112 ms
64 bytes from tomcat-mynet-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.060 ms
64 bytes from tomcat-mynet-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.057 ms
64 bytes from tomcat-mynet-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.108 ms
^C
--- tomcat-mynet-02 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 0.057/0.084/0.112/0.026 ms
[root@sqx111 ~]#
#不使用--link也可以ping通
自定义的网络,自动维护好了对应的关系
好处:
- Redis不同的集群使用不同的网络
- mysql不同集群使用不同的网络,保证集群是安全和健康的
网络连通
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v2mOtZVM-1634784766979)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210427171424063.png)]
[root@sqx111 ~]# docker network connect mynet tomcat01
[root@sqx111 ~]# docker network inspect mynet
...
...
...
"Containers": {
"0b4f3f93fb8f420806dcbeeb8f25c14b272a9a7e806f24d49ac807d9c0f57d50": {
"Name": "tomcat-mynet-02",
"EndpointID": "4c8ba6697cd4cc4b0a452b1e3cf0dde25fc8fdaec28a6c5eab9e9fb26f1cb2da",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"3515aa36c78aab9537026bd0678890cac9b4f17257aec8f1762f885af3451d66": {
"Name": "tomcat-mynet-01",
"EndpointID": "b128cd425e15399d8216ac0d2cea29afa5b6ed1e783e5e115473db23539a9fc6",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"b75155152046247fec96117b9b7f3c9b245086eed4a119cbe9698084c41e126f": {
"Name": "tomcat01",
"EndpointID": "5bdf8a368606d5b02f9fbdd5f9658bffa373e2a058827dc6218ea3f9d0a46060",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
}
},
...
...
...
#发现tomcat01容器加入到mynet网桥中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eqjgr5LY-1634784766981)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210427171941018.png)]
tomcat01容器加入到mynet网桥中
一个容器两个ip
[root@sqx111 ~]# docker inspect tomcat01
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FBb7U4h6-1634784766983)(C:\Users\苏全兴\AppData\Roaming\Typora\typora-user-images\image-20210427172407985.png)]
tomcat01的打通,不影响tomcat02
结论:要使用跨网络操作,就需要使用 docker network connect 网桥 容器名
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
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
68.0.3): icmp_seq=4 ttl=64 time=0.108 ms
^C
— tomcat-mynet-02 ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 0.057/0.084/0.112/0.026 ms
[root@sqx111 ~]#
#不使用–link也可以ping通
自定义的网络,自动维护好了对应的关系
**好处:**
- Redis不同的集群使用不同的网络
- mysql不同集群使用不同的网络,保证集群是安全和健康的
## 网络连通
[外链图片转存中...(img-v2mOtZVM-1634784766979)]
```shell
[root@sqx111 ~]# docker network connect mynet tomcat01
[root@sqx111 ~]# docker network inspect mynet
...
...
...
"Containers": {
"0b4f3f93fb8f420806dcbeeb8f25c14b272a9a7e806f24d49ac807d9c0f57d50": {
"Name": "tomcat-mynet-02",
"EndpointID": "4c8ba6697cd4cc4b0a452b1e3cf0dde25fc8fdaec28a6c5eab9e9fb26f1cb2da",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"3515aa36c78aab9537026bd0678890cac9b4f17257aec8f1762f885af3451d66": {
"Name": "tomcat-mynet-01",
"EndpointID": "b128cd425e15399d8216ac0d2cea29afa5b6ed1e783e5e115473db23539a9fc6",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"b75155152046247fec96117b9b7f3c9b245086eed4a119cbe9698084c41e126f": {
"Name": "tomcat01",
"EndpointID": "5bdf8a368606d5b02f9fbdd5f9658bffa373e2a058827dc6218ea3f9d0a46060",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
}
},
...
...
...
#发现tomcat01容器加入到mynet网桥中
tomcat01容器加入到mynet网桥中
一个容器两个ip
[root@sqx111 ~]# docker inspect tomcat01
[外链图片转存中…(img-FBb7U4h6-1634784766983)]
tomcat01的打通,不影响tomcat02
结论:要使用跨网络操作,就需要使用 docker network connect 网桥 容器名