> 文档中心 > Docker的学习笔记

Docker的学习笔记


Docker

Docker概述

Docker为什么会出现

一款产品 : 开发—上线 两套环境 应用环境 应用配置

开发 — 运维 问题 我在我的电脑上可以运行 版本更新 导致服务不可用 对于运维来说 考验十分大?
环境配置是十分的麻烦 每一个机器都要部署环境(集群 Redis、ES、Hadoop…) 费时费力

发布一个项目(jar + (Redis MySql jdk Es)) 项目能不能带上环境安装打包!

之前在服务器配置一个应用的环境 redis mysql jdk es hadoop 配置超麻烦了 不能够跨平台

windows 最后发布到linux!

传统 : 开发jar 运维来做

现在 开发打包部署上线 一套流程做完

java----apk ---- 发布(应用商店) ---- 张三使用apk — 安装即可用

java — jar (环境) — 打包项目带上环境(镜像) ----- (Docker仓库:商店) ---- 下载我们发布的镜像 ----- 直接运行即可

docker的出现就是为了解决以上问题的

Docker的学习笔记

Docker的思想就来自于集装箱

jRE --多个应用(端口冲突) – 原来都是交叉的!

隔离: Docker核心思想 打包装箱 每个箱子是互相隔离的

水果 生化武器

Docker 通过隔离机制 可以将服务器利用到极致

本质 所有的技术都是因为一些问题 我们就需要去解决这些问题 所以才去学习

Docker的历史

2010年 几个搞IT的年轻人 就在美国成立一家公司dotCloud

做一些pass的云计算服务 LXC有关的容器技术

他们将自己的技术 (容器化技术)命名就是Docker

Docker刚刚诞生的时候没有引起行业的注意 docCloud 就活不下去啦

就想到啦开源

开发源代码!

2013年 Docker开源

Docker 越来越多的人发现Docker的优点 火了 Docker每个月都会更新一个版本

2014 年4月9日 Docker1.0发布

Docker为什么这么火 十分的轻巧

在容器技术出来之前 我们都是使用虚拟机技术

虚拟机 在windows中装一个Vmware 通过这个软件我们可以虚拟出一台或者多台电脑 比较笨重 虚拟机也是属于虚拟化技术 Docker容器技术 也是一种虚拟化技术

vm: linux centos原生镜像(一个电脑) 隔离 需要开启多个虚拟机 几个G 几分钟docker: 隔离 镜像(最核心的环境 4m+jdk+mysql) 十分的小巧 运行镜像就可以了 小巧 几个M kb 秒级启动!

聊聊Docker

Docker是基于Go语言开发的 开源项目

官网:https://www.docker.com/

文档:https://docs.docker.com/

仓库地址: https://hub.docker.com/

Docker安装

Docker的基本组成

Docker的学习笔记

镜像(image)

docker镜像就好比是一个模板 可以通过这个模板来创建容器服务 tomcat镜像===> run ==> tomcat01容器(提供服务器)

通过这个镜像可以创建多个容器 (最终服务运行或者项目运行就是在容器中的)

容器(container)

Docker利用容器技术 独立运行一个或者一个组应用 通过镜像来创建的

启动 停止 删除 基本命令!

目前就可以吧这个容器理解为就是一个简易的linux系统

仓库(repository)

仓库就是存放镜像的地方

仓库分为公有仓库和私有仓库

Docker Hub(默认是国外的)

阿里云… 都有容器服务器(配置镜像加速)

安装Docker

环境准备

1.需要会一点点的Liunx的基础

2.CentOs 7

3.我们需要Xshell连接远程服务器进行操作

环境查看

#系统内核是3.10以上的[root@guchenstudy /]# uname -r3.10.0-514.26.2.el7.x86_64
[root@guchenstudy /]# uname -r3.10.0-514.26.2.el7.x86_64[root@guchenstudy /]# cat /etc/os-releaseNAME="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"

帮助文档:https://docs.docker.com/

1.卸载旧的版本

sudo yum remove docker \    docker-client \    docker-client-latest \    docker-common \    docker-latest \    docker-latest-logrotate \    docker-logrotate \    docker-engine

2.需要的安装包

sudo yum install -y yum-utils

3.设置镜像的仓库

# 默认是境外的仓库,很慢不建议使用sudo yum-config-manager \    --add-repo \    https://download.docker.com/linux/centos/docker-ce.repo# 阿里云镜像仓库,推荐使用sudo yum-config-manager \    --add-repo \    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 更新软件包索引yum makecache fast

4.安装docker docker-ce 社区版 ee 企业版

sudo yum install docker-ce docker-ce-cli containerd.io

5.启动docker

sudo systemctl start docker

6.使用 docker version 查看是否安装成功

7.hello world

sudo docker run hello-world

8.查看一下下载的hello-world镜像

docker images

卸载docker

# 卸载依赖sudo yum remove docker-ce docker-ce-cli containerd.io# 删除docker资源目录# /var/lib/docker   docker的默认工作路径sudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerd

阿里云镜像加速器

Docker的学习笔记

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{  "registry-mirrors": ["https://lnb63opu.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker

回顾docker中的helloWorld

docker run 指令原理图

Docker的学习笔记

底层原理

Docker是什么工作的?

Docker是一个Client - Server结构的系统 Docker的守护进程运行在主机上 通过Scoket从客户端访问

DockerServer 接收到Docker-Client的指令 就会执行这个命令

Docker的学习笔记

Docker 为什么比VM快?

1.Docker有着比虚拟机更少的抽象层

2.docker 利用的是宿主机的内核 vm需要是Guest OS

Docker的学习笔记

所以说 新建一个容器的时候 docker不需要像虚拟机一样重新加载一个操作系统内核 避免引导 虚拟机是加载Cuest Os 分钟级别 而Docker 是 利用宿主机的操作系统吗 省略了这个复杂的过程 秒级

docker的常用命令

帮助命令

docker version --查看版本信息docker info --查看详细信息docker 命令 --help #万能命令

帮助文档地址:https://docs.docker.com/engine/reference/builder/

镜像命令

docker images 查看所有本地的主机上的镜像

[root@guchenstudy ~]# docker imagesREPOSITORY    TAGIMAGE ID SIZEhello-world   latest    d1165f221234   2 months ago   13.3kB#解释REPOSITORY 镜像的仓库源TAG 镜像的标签IMAGE ID 镜像的idCREATED 镜像的创建时间SIZE 镜像的大小#可选项  -a, --all #查询全部  -q, --quiet      #只显示镜像的id

docker search 镜像搜索

[root@guchenstudy ~]# docker search mysqlNAME  DESCRIPTION  STARS     OFFICIAL   AUTOMATEDmysql MySQL is a widely used, open-source relation…   10881     [OK]mariadb      MariaDB Server is a high performing open sou…   4104      [OK]mysql/mysql-server  Optimized MySQL Server Docker images. Create…   808    [OK]percona      Percona Server is a fork of the MySQL relati…   537[OK]    #可选项docker search mysql  --filter=stars=3000 搜索出来的镜像就是Strats 大于 3000
[root@guchenstudy ~]# docker search mysql  --filter=stars=3000NAME      DESCRIPTION  STARS     OFFICIAL   AUTOMATEDmysql     MySQL is a widely used, open-source relation…   10881     [OK]mariadb   MariaDB Server is a high performing open sou…   4104      [OK][root@guchenstudy ~]# docker search mysql  --filter=stars=5000NAME      DESCRIPTION  STARS     OFFICIAL   AUTOMATEDmysql     MySQL is a widely used, open-source relation…   10881     [OK]     

docker pull 镜像名称 下载镜像

[root@vvvv ~]# docker pull mysqlUsing default tag: latest #如果不写版本,默认下载最新的latest: Pulling from library/mysqla076a628af6f: Pull complete  #分层下载,docker images的核心 联合文件系统f6c208f3f991: Pull complete 88a9455a9165: Pull complete 406c9b8427c6: Pull complete 7c88599c0b25: Pull complete 25b5c6debdaf: Pull complete 43a5816f1617: Pull complete 1a8c919e89bf: Pull complete 9f3cf4bd1a07: Pull complete 80539cea118d: Pull complete 201b3cad54ce: Pull complete 944ba37e1c06: Pull complete Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8cStatus: Downloaded newer image for mysql:latestdocker.io/library/mysql:latest # 真实地址#等价于它docker pull mysql docker pull docker.io/library/mysql:latest

指定版本下载

[root@vvvv ~]# docker pull mysql:5.75.7: Pulling from library/mysqla076a628af6f: Already exists # 联合文件,因为latest里面有这些所以无需下载f6c208f3f991: Already exists 88a9455a9165: Already exists 406c9b8427c6: Already exists 7c88599c0b25: Already exists 25b5c6debdaf: Already exists 43a5816f1617: Already exists 1831ac1245f4: Pull complete # 只需要下载5.7特有的即可37677b8c1f79: Pull complete 27e4ac3b0f6e: Pull complete 7227baa8c445: Pull complete Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808dfStatus: Downloaded newer image for mysql:5.7docker.io/library/mysql:5.7

docker rmi -f 镜像id 删除镜像

docker rmi -f 镜像id  #删除一个镜像 通过id删除docker rmi -f 镜像id 镜像id 镜像id  #删除多个镜像 通过id删除docker rmi -f $(docker images -aq) #删除查询出来的所有的镜像ID 依次递归删除

容器命令

新建容器并启动

docker run [可选参数] image#参数说明 --name = "Name" 容器名字 tomcat01 tomcat02 用来区分容器的-d 后台方式运行-it 使用交互方式运行 进入容器查看内容-p 指定容器的端口 -p 8080:8080-p ip 主机端口 容器端口-p 主机端口:容器端口-p 容器端口容器端口-P 随机指定端口#测试 启动并进入容器docker run -it 镜像名称 /bin/bash#从容器中退出exit  #直接容器停止并退出Ctrl+P+Q #容器不停止退出#查看正在运行中的容器docker ps-a #列出所有的正在运行的容器 带出历史运行过的容器-n=? #显示最近创建的容器-q # 显示容器的编号#删除容器 docker rm  #容器id 删除指定的容器id 不能删除正在运行的容器 如果要强制删除 rm -fdocker rm -f $(docker ps -aq) #递归删除查询出所有的容器iddocker ps -a -q|xargs docker rm #删除所有的容器#启动和停止容器的操作docker start 容器id # 启动容器docker restart 容器id #重启容器docker stop 容器id #停止当前正在运行的容器docker kill 容器id #强制停止当前容器

常用其他命令

后台启动容器

#命令 docker run -d 镜像名 !

docker run -d centos

#问题 docker ps 发现 centos 停止了

常见的坑 docker容器使用后台运行 就必须要有一个前台进程 docker发现没有应用 就会自动停止

比如nginx 容器启动后 发现自己没有提供服务 就会立刻停止 就是没有程序运行 所以就会立即杀死

查看日志

docker logs -f -t --tail 容器 查看日志#自己编写一段shell脚本docker run -d centos /bin/sh -c "while true;do echo kuangshen;sleep 1; done"#参数详解--tf #显示日志--tail number #显示日志停止条数 number表示条数#测试命令docker logs -tf --tail 10 容器id

查看dokcer中的进程信息

#命令 docker top 容器id

Docker的学习笔记

查看镜像的元数据

docker inspect 容器id#测试[root@guchenstudy /]# docker inspect 6933fd39db19[    { "Id": "6933fd39db1900bb4a3f014dc15a05a79d0e178a197811c8ac0ff36dd8fe93ec", "Created": "2021-05-18T06:43:28.088848126Z", "Path": "/bin/bash", "Args": [], "State": {     "Status": "running",     "Running": true,     "Paused": false,     "Restarting": false,     "OOMKilled": false,     "Dead": false,     "Pid": 32090,     "ExitCode": 0,     "Error": "",     "StartedAt": "2021-05-18T06:43:28.348389809Z",     "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55", "ResolvConfPath": "/var/lib/docker/containers/6933fd39db1900bb4a3f014dc15a05a79d0e178a197811c8ac0ff36dd8fe93ec/resolv.conf", "HostnamePath": "/var/lib/docker/containers/6933fd39db1900bb4a3f014dc15a05a79d0e178a197811c8ac0ff36dd8fe93ec/hostname", "HostsPath": "/var/lib/docker/containers/6933fd39db1900bb4a3f014dc15a05a79d0e178a197811c8ac0ff36dd8fe93ec/hosts", "LogPath": "/var/lib/docker/containers/6933fd39db1900bb4a3f014dc15a05a79d0e178a197811c8ac0ff36dd8fe93ec/6933fd39db1900bb4a3f014dc15a05a79d0e178a197811c8ac0ff36dd8fe93ec-json.log", "Name": "/stupefied_chaplygin", "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,     "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": "/var/lib/docker/overlay2/e960904618add6cad78268dc00d0804e33e59d6c6110c712e99872e94c8636de-init/diff:/var/lib/docker/overlay2/ee4a7d2321b34119b7af4bd4ddaf040075af83fb1562958bdeb384b1483cf89a/diff",  "MergedDir": "/var/lib/docker/overlay2/e960904618add6cad78268dc00d0804e33e59d6c6110c712e99872e94c8636de/merged",  "UpperDir": "/var/lib/docker/overlay2/e960904618add6cad78268dc00d0804e33e59d6c6110c712e99872e94c8636de/diff",  "WorkDir": "/var/lib/docker/overlay2/e960904618add6cad78268dc00d0804e33e59d6c6110c712e99872e94c8636de/work"     },     "Name": "overlay2" }, "Mounts": [], "Config": {     "Hostname": "6933fd39db19",     "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": "20201204",  "org.label-schema.license": "GPLv2",  "org.label-schema.name": "CentOS Base Image",  "org.label-schema.schema-version": "1.0",  "org.label-schema.vendor": "CentOS"     } }, "NetworkSettings": {     "Bridge": "",     "SandboxID": "4db413b15f2f81479c9ce4b2fddc096578be6beb177d94dd765e42074cacc2a4",     "HairpinMode": false,     "LinkLocalIPv6Address": "",     "LinkLocalIPv6PrefixLen": 0,     "Ports": {},     "SandboxKey": "/var/run/docker/netns/4db413b15f2f",     "SecondaryIPAddresses": null,     "SecondaryIPv6Addresses": null,     "EndpointID": "6a75286874f3f990b08a29c19f4b14f7cfa8e406864f883522fa5c9afeb22b89",     "Gateway": "172.17.0.1",     "GlobalIPv6Address": "",     "GlobalIPv6PrefixLen": 0,     "IPAddress": "172.17.0.2",     "IPPrefixLen": 16,     "IPv6Gateway": "",     "MacAddress": "02:42:ac:11:00:02",     "Networks": {  "bridge": {      "IPAMConfig": null,      "Links": null,      "Aliases": null,      "NetworkID": "b5ccae51de7d8c84ac95c588dc31a8dbf0e327e88bd25047957089967653cd9a",      "EndpointID": "6a75286874f3f990b08a29c19f4b14f7cfa8e406864f883522fa5c9afeb22b89",      "Gateway": "172.17.0.1",      "IPAddress": "172.17.0.2",      "IPPrefixLen": 16,      "IPv6Gateway": "",      "GlobalIPv6Address": "",      "GlobalIPv6PrefixLen": 0,      "MacAddress": "02:42:ac:11:00:02",      "DriverOpts": null  }     } }    }]

进入当前正在运行的容器

#我们通常容器都是使用后台方式运行的 需要进入容器 修改一些配置#命令docker exec -it 容器id bashShell#测试[root@guchenstudy /]# docker psCONTAINER ID   IMAGE     COMMANDCREATED   STATUS   PORTS     NAMES48cae1240ab6   centos    "/bin/bash"   13 seconds ago   Up 12 seconds      goofy_tesla[root@guchenstudy /]# docker exec -it 48cae1240ab6 /bin/bash[root@48cae1240ab6 /]# ps -efUID PID  PPID  C STIME TTY   TIME CMDroot  1     0  0 06:51 pts/0    00:00:00 /bin/bashroot 15     0  0 06:52 pts/1    00:00:00 /bin/bashroot 30     0  1 06:53 pts/2    00:00:00 /bin/bashroot 44    30  0 06:53 pts/2    00:00:00 ps -ef#方式二docker attach 容器id#测试docker attach 容器id显示正在执行当前的代码....#docker exec  # 进入容器后开启一个新的终端 可以在里面进行操作(常用)#docker attach #进入容器正在执行的终端 不回启动新的进程

从容器内拷贝文件到主机上

docker cp 容器id  容器内路径 目的地主机路径[root@guchenstudy home]# docker run -it centos /bin/bash[root@5b72d081fca3 /]# lsbin  etc   lib  lost+found  mnt  proc  run   srv  tmp  vardev  home  lib64  mediaopt  root  sbin  sys  usr[root@5b72d081fca3 /]# cd /home[root@5b72d081fca3 home]# touch text.java[root@5b72d081fca3 home]# lstext.java[root@5b72d081fca3 home]# exitexit[root@guchenstudy home]# docker ps -aCONTAINER ID   IMAGE   COMMANDCREATEDSTATUS    PORTS     NAMES5b72d081fca3   centos  "/bin/bash"   About a minute ago   Exited (0) 19 seconds ago  naughty_kapitsa6933fd39db19   centos  "/bin/bash"   19 minutes agoExited (0) 15 minutes ago  stupefied_chaplyginf54ac01edcc4   centos  "/bin/bash"   25 minutes agoExited (130) 25 minutes agofocused_dubinskyd2e11ab86c97   centos  "/bin/bash"   About an hour ago    Exited (0) About an hour ago      priceless_kirchd401b85bf954   d1165f221234   "/hello"      21 hours ago  Exited (0) 21 hours ago    heuristic_keldyshf135635d9f76   d1165f221234   "/hello"      5 days ago    Exited (0) 5 days ago      boring_hofstadter[root@guchenstudy home]# docker cp 5b72d081fca3:/home/text.java /home[root@guchenstudy home]# lsguchen  jdk  redis  text.java  www#拷贝是一个手动过程 未来我们使用 -v卷的技术 可以实现

查看docker所有容器的占cpu,内存情况

docker stats

小结

Docker的学习笔记

练习

安装Nginx

[root@guchenstudy home]# docker pull nginxUsing default tag: latestlatest: Pulling from library/nginx69692152171a: Already exists 49f7d34d62c1: Pull complete 5f97dc5d71ab: Pull complete cfcd0711b93a: Pull complete be6172d7651b: Pull complete de9813870342: Pull complete Digest: sha256:df13abe416e37eb3db4722840dd479b00ba193ac6606e7902331dcea50f4f1f2Status: Downloaded newer image for nginx:latestdocker.io/library/nginx:latest[root@guchenstudy home]# docker imagesREPOSITORY   TAGIMAGE IDCREATED SIZEnginx latest    f0b8a9a54136   5 days ago     133MBmysql latest    c0cdc95609f1   5 days ago     556MBcentoslatest    300e315adb2f   5 months ago   209MB[root@guchenstudy home]# docker run -d --name nginx01 -p 5000:80 nginx2e156fa85b6419502a952b32d519436061aafc4a8a19acd96c13c5ff008d7fa0[root@guchenstudy home]# docker psCONTAINER ID   IMAGE     COMMAND    CREATED   STATUS   PORTSNAMES2e156fa85b64   nginx     "/docker-entrypoint.…"   16 seconds ago   Up 16 seconds   0.0.0.0:5000->80/tcp, :::5000->80/tcp   nginx01#进入容器[root@guchenstudy home]# docker exec -it nginx01 /bin/bashroot@2e156fa85b64:/# whereis nginx #查询所有存在的目录nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginxroot@2e156fa85b64:/# cd /etc/nginx root@2e156fa85b64:/etc/nginx# lsconf.dkoi-utf  mime.types  nginx.conf   uwsgi_paramsfastcgi_paramskoi-win  modules     scgi_params  win-utf

端口暴露概念

Docker的学习笔记

es+kibana

# 下载并启动docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.12.1# 发现服务器异常卡顿,es占用内存过高 -e 环境配置文件修改docker run -d --name es1 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTs="-Xms64m -Xmx526m" elasticsearch:7.12.1docker run --name kibana -e ELASTICSEARCH_URL=ip:9200 -p 5601:5601 -d kibana:7.12.1

可视化面板

portainer

Docker图形化界面管理工具 提供后天面板供我们操作使用

docker run -d -p 9000:9000 \   --restart=always \   -v /var/run/docker.sock:/var/run/docker.sock \   --name portainer-test \   docker.io/portainer/portainer

镜像讲解

概述

Docker镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含某个软件所需的所有内容,包括代码、库、环境变量、配置文件、运行时环境等。
所有的应用,直接打包成Docker镜像,然后通过镜像创建出容器,然后就可以直接跑起来。

如何得到镜像:

  • 从远程仓库下载,比如docker hub、阿里云的镜像仓库等。
  • 朋友拷贝给你。
  • 自己制作一个镜像DockerFile。
  • 通过对原有的镜像创建的容器进行一些修改(也可以不修改),然后通过Commit命令提交一个新的镜像。

Docker镜像加载原理

UnionFS(联合文件系统)

我们在下载某个镜像的时候,可能会看到下载了一层一层的多个镜像。

在这里插入图片描述

联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层叠加,联合文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像的镜像)比如centos镜像,可以制作出各种具体应用的镜像,比如mysql镜像。一个成型的应用进行都是由若干个镜像一层层组成的。

Docker镜像加载原理

docker镜像实际上是由一层层的文件系统组成,这种层级文件系统就是联合文件系统。

bootfs(boot file system)主要包含BootLoader和kernel,BootLoader主要负责引导加载kernel,Linux刚启动时会加载bootfs文件系统来引导内核的加载,Docker镜像的最底层就是bootfs。这一层与我们典型的unix系统是一样的,包含boot引导器和内核,当boot加载完成后整个内核就在内存中了,此时内存的使用权已经由bootfs转交给内核,此时系统会卸载bootfs。

rootfs(root file system)在bootfs之上,包含的就是典型的unix系统的/dev、 /proc、 /etc等标准目录和文件和一些命令,rootfs就是不同unix系统的发行版,比如Ubuntu、centos等。

我们平时安装的虚拟机centos镜像好几个G,Docker安装的才200多m,因为对于一个精简的OS,rootfs可以很小,只需包含最基本的命令,工具和程序库就行了,因为底层直接使用宿主机的内核,自己只需提供rootfs(相当于操作内核的客户端)就可以,由此可见不同发行版的bootfs基本是一致的,roorfs有差别,因此不同的发行版可以公有bootfs。

在这里插入图片描述

第一个图仅仅是bootfs+rootfs,然后如果要制作一个emacs环境的镜像,就在这个基础上新加一层emacs镜像,如图二。如果要在添加一个Apache环境,那就再图二基础上加一个apache镜像。如图三。图中的每一层镜像都能进行复用。

比如:上面的redis镜像。使用docker inspect redis镜像的ID 命令查看镜像的元信息,找到layer信息。在这里插入图片描述

由上图可以看到下载的redis镜像是由6个镜像一层层组成的。

在这里插入图片描述

这些镜像都是一个个独立可复用的镜像,如果下载其他镜像是,某一层镜像是已经存在本地的了,就不用在下载,直接复用该镜像,节省空间。比如上面下载redis镜像时,提示某个镜像已经存在。

在这里插入图片描述

注意:

Docker镜像都是只读的,用镜像创建容器启动时,实际上是在原本的镜像上新建了一层可写层到原本镜像的顶部,这一层我们叫作容器层,容器层之下的叫作镜像层。

在这里插入图片描述

如上图,使用Tomcat镜像创建容器后,会在Tomcat镜像的基础上新建一个可写层,容器的写入是在可写层进行记录,然后使用commit命令把该容器创建一个新的镜像,实际上新的镜像是tomcat镜像+可写层镜像,以tomcat镜像为基础。通过下面介绍使用容器构建镜像,可以更好地理解。

commit镜像

docker commit 提交容器成为新的镜像#命令和git原理类似docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:tag tag 表示版本号

##实战测试

  1. 启动一个默认的tomcat
  2. 对默认的tomcat进行自己需要的修改
  3. 将我们操作过的容器通过commit提交为一个镜像 我们以后就可以使用自己提交过的镜像即可 就是我们自己修改的镜像

容器数据卷(重点)

什么是容器数据卷

docker的理念回顾

将应用和环境打包一个镜像

数据 如果数据都在容器中 那么我们容器删除 数据机会丢失 需求 数据可以持久化

Mysql 容器删了 删库跑路 需求 mysql数据可以存储在本地

容器之间可以有一个数据共享的技术 docker容器中产生的数据 同步到本地

这就是卷技术 目录的挂载 将我们容器内的目录 挂载到linux上面

Docker的学习笔记

总结一句话 容器的持久化和同步操作 容器间也是可以数据共享的

使用数据卷

基本操作

创建卷:docker volume create
查看所有的卷:docker volume ps
查看具体某一个卷的信息: docker volume inspect 卷名

方式一 直接使用命令来挂载 -v

docker run -it -v 主机目录 容器目录 -p #测试

Docker的学习笔记

测试文件的同步

Docker的学习笔记

好处: 我们以后只需要在宿主机上面修改即可 因为绑定了容器数据卷 就会自动同步到绑定的目录上

具名和匿名挂载

# 匿名挂载-v 容器内路径! # -P 大写p 的意思 由docker 默认给端口开发docker run -d -P --name 取名字 -v 容器挂载的路径 镜像名称#查看所有的volume 的情况[root@guchenstudy date]# docker volume lsDRIVER    VOLUME NAMElocal     8cacc94e643579e01d4672e4a7a35401163bca18d1ac34a1569e7a08287aa1e5#这里发现 这种就是匿名挂载 我们在-v只写了容器内的路径 没有写容器外的路径#具名挂载# docker run -d -P --name 名字 -v 外部名字:容器挂载目录 镜像名字DRIVER VOLUME NAMElocal 具体写的名字#通过 -v 卷名:容器内路径#查看一下这个卷的信息docker volume inspect 外部名字

Docker的学习笔记

所有的docker容器内的卷 没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data

我们通过具名挂载可以方便的找到我们的一个卷 大多数情况在使用的是具名挂载

# 如何确定是具名挂载还是匿名挂载 还是指定路径挂载-v 容器内路径 #匿名挂载-v 卷名:容器内路径 #具名挂载-v /宿主机的路径:容器内路径 #指定路径挂载

拓展:

# 通过 -v 容器内路径:ro rw 改变读写权限ro readonly 只读rw readwrite 可读可写#一旦这个设置了容器权限 容器对我们挂载出来的内容就有限定了docker run -d -P --name nginx -v juming-nginx:/etc/nginx:ro nginxdocker run -d -P --name nginx -v juming-nginx:/etc/nginx:rw nginx#ro 只要看到ro就说明这个路径只能通过宿主机来操作 容器内部无法操作

容器中的数据卷同步

多个mysql同步数据

Docker的学习笔记

多容器实现同步数据的方式:https://blog.csdn.net/weixin_43342105/article/details/109984865

结论:

容器之间配置信息的传递 数据卷容器的生命周期一直持续到没有容器使用为止

但是一旦你持久化到了本地 这个时候 本地的数据是不会删除的啦 除非自己手动删除

DockerFile(重点)

初识DockerFile

dockerFile就是用来构建docker镜像的构建文件 命令脚本 先体验一下

通过这个脚本可以生成自己的镜像 镜像是一层层的 脚本一个个的命令 每个命令都是一层!

# 创建一个dockerfile文件 名字可以随机 建议使用dockerfile# 文件中的内容 指令(大写) 参数FROM centosVOLUME ["数据卷名字","数据卷名字"]CMD echo "---打印的内容---"CMD /bin/bash#这里的每个命令 就是镜像的一层!

Docker的学习笔记

测试了一下 挂载的路径下跟我容器中的新建的文件同步啦

DockerFile介绍

dockerfile是用来构建docker镜像的文件 命令参数脚本

构建步骤:

  1. 编写一个dockerfile文件
  2. docker build 构建一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像 (docker Hub 阿里云镜像仓库)

基础知识

  1. 每个保留关键字(指令) 都是必须是大写字母
  2. 执行从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层 并提交

Docker的学习笔记

Docker 镜像逐渐成为企业交付的标准 必须要掌握

步骤

DockerFile 构建文件 定义了一切的步骤 源代码

DockerImages 通过dockerFile构建生成的镜像 最终发布和运行的产品

Docker容器: 容器就是镜像运行起来提供服务器

DockerFile的指令

FORM # 基础镜像 一切从这里开始构建MAINTAINER # 镜像是谁写的 姓名+邮箱RUN# 镜像构建的时候需要运行的命令ADD# 步骤 tomcat镜像 这个tomcat压缩包 添加内容WORKDIR# 镜像的工作目录VOLUME# 挂载的目录EXPOSE # 保留端口配置CMD # 指定这个容器启动的时候要运行的命令 只有最后一个会生效 可被替代ENTRYPOINT # 指定这个容器启动的时候要运行的命令 可以追加命令ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行ONBUILD 的指令 触发指令COPY # 类似ADD 将我们文件拷贝到镜像中ENV# 构建的时候 设置环境变量

Docker的学习笔记

自己编些一个dockerFile测试

1.编写一个dockerFile文件

FROM centos #在centos的基础进行增加MAINTAINER 作者信息# 配置环境变量ENV MYPATH /usr/local WORKDIR $MYPATH #工具目录# 导入需要执行的包RUN yum -y install vim  #安装vimRUN yum -y install net-tools #安装ip指令EXPOSE 80 #暴露端口CMD echo $MYPATH #输出CMD echo "------end------"CMD /bin/bash #以bash运行

2.执行自己写好的dockerFile
docker build -f dockerfile文件路径 -t 镜像名字:[tag] . “.” 点一定不要忘记

3.构建镜像时候的打印

[root@vvvv dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .Sending build context to Docker daemon  2.048kBStep 1/10 : FROM centoslatest: Pulling from library/centos7a0437f04f83: Pull complete Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1Status: Downloaded newer image for centos:latest ---> 300e315adb2fStep 2/10 : MAINTAINER vvvv<vurx@qq.com> ---> Running in 40a5b7bb22c9Removing intermediate container 40a5b7bb22c9 ---> b2c8ac4399b9Step 3/10 : ENV MYPATH /usr/local ---> Running in bdc5a61f1803Removing intermediate container bdc5a61f1803 ---> 78e356498edeStep 4/10 : WORKDIR $MYPATH ---> Running in 64cde09115f2Removing intermediate container 64cde09115f2 ---> dd92de8e574aStep 5/10 : RUN yum -y install vim ---> Running in c17e2fb1e8c5CentOS Linux 8 - AppStream 4.1 MB/s | 6.3 MB     00:01    CentOS Linux 8 - BaseOS    2.9 MB/s | 2.3 MB     00:00    CentOS Linux 8 - Extras     13 kB/s | 9.2 kB     00:00    Last metadata expiration check: 0:00:01 ago on Mon Mar  8 06:01:16 2021.Dependencies resolved.================================================================================ Package      Arch Version     Repository      Size================================================================================Installing: vim-enhanced x86_64      2:8.0.1763-15.el8  appstream      1.4 MInstalling dependencies: gpm-libs     x86_64      1.20.7-15.el8      appstream39 k vim-common   x86_64      2:8.0.1763-15.el8  appstream      6.3 M vim-filesystem      noarch      2:8.0.1763-15.el8  appstream48 k which x86_64      2.21-12.el8 baseos   49 kTransaction Summary================================================================================Install  5 PackagesTotal download size: 7.8 MInstalled size: 30 MDownloading Packages:(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm 146 kB/s |  39 kB     00:00    (2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 711 kB/s |  48 kB     00:00    (3/5): which-2.21-12.el8.x86_64.rpm      395 kB/s |  49 kB     00:00    (4/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm  2.4 MB/s | 1.4 MB     00:00    (5/5): vim-common-8.0.1763-15.el8.x86_64.rpm    4.5 MB/s | 6.3 MB     00:01    --------------------------------------------------------------------------------Total 3.3 MB/s | 7.8 MB     00:02     warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEYCentOS Linux 8 - AppStream 306 kB/s | 1.6 kB     00:00    Importing GPG key 0x8483C65D: Userid     : "CentOS (CentOS Official Signing Key) " Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D From: /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficialKey imported successfullyRunning transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction  Preparing :1/1   Installing: which-2.21-12.el8.x86_64   1/5   Installing: vim-filesystem-2:8.0.1763-15.el8.noarch  2/5   Installing: vim-common-2:8.0.1763-15.el8.x86_64      3/5   Installing: gpm-libs-1.20.7-15.el8.x86_64     4/5   Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64     4/5   Installing: vim-enhanced-2:8.0.1763-15.el8.x86_64    5/5   Running scriptlet: vim-enhanced-2:8.0.1763-15.el8.x86_64    5/5   Running scriptlet: vim-common-2:8.0.1763-15.el8.x86_64      5/5   Verifying : gpm-libs-1.20.7-15.el8.x86_64     1/5   Verifying : vim-common-2:8.0.1763-15.el8.x86_64      2/5   Verifying : vim-enhanced-2:8.0.1763-15.el8.x86_64    3/5   Verifying : vim-filesystem-2:8.0.1763-15.el8.noarch  4/5   Verifying : which-2.21-12.el8.x86_64   5/5 Installed:  gpm-libs-1.20.7-15.el8.x86_64  vim-common-2:8.0.1763-15.el8.x86_64      vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarch  which-2.21-12.el8.x86_64      Complete!Removing intermediate container c17e2fb1e8c5 ---> d753a853ed88Step 6/10 : RUN yum -y install net-tools ---> Running in 9cea2adb7017Last metadata expiration check: 0:00:11 ago on Mon Mar  8 06:01:16 2021.Dependencies resolved.================================================================================ Package  Architecture Version   Repository    Size================================================================================Installing: net-toolsx86_642.0-0.52.20160912git.el8baseos322 kTransaction Summary================================================================================Install  1 PackageTotal download size: 322 kInstalled size: 942 kDownloading Packages:net-tools-2.0-0.52.20160912git.el8.x86_64.rpm   1.5 MB/s | 322 kB     00:00    --------------------------------------------------------------------------------Total 212 kB/s | 322 kB     00:01     Running transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction  Preparing :1/1   Installing: net-tools-2.0-0.52.20160912git.el8.x86_641/1   Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_641/1   Verifying : net-tools-2.0-0.52.20160912git.el8.x86_641/1 Installed:  net-tools-2.0-0.52.20160912git.el8.x86_64  Complete!Removing intermediate container 9cea2adb7017 ---> ec81f0874bf4Step 7/10 : EXPOSE 80 ---> Running in de8a50ba9121Removing intermediate container de8a50ba9121 ---> ef4e1dda7932Step 8/10 : CMD echo $MYPATH ---> Running in 0a8209f16e92Removing intermediate container 0a8209f16e92 ---> d35f59696851Step 9/10 : CMD echo "------end------" ---> Running in 8f3f4d463844Removing intermediate container 8f3f4d463844 ---> 68a8371f4718Step 10/10 : CMD /bin/bash ---> Running in 9f5c311bcc9fRemoving intermediate container 9f5c311bcc9f ---> 5ed3b4ceae6eSuccessfully built 5ed3b4ceae6eSuccessfully tagged mycentos:0.1

4.启动测试
docker run -it 刚刚编写生成的镜像id /bin/bash

5.查看别人的镜像是怎么编写的 docker history 镜像id

docker history 5ed3b4ceae6e=================================================================================IMAGE   CREATED  CREATED BY   SIZE      COMMENT5ed3b4ceae6e   7 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B 68a8371f4718   7 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B d35f59696851   7 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B ef4e1dda7932   7 minutes ago   /bin/sh -c #(nop)  EXPOSE 80      0B ec81f0874bf4   7 minutes ago   /bin/sh -c yum -y install net-tools      14.3MB    d753a853ed88   7 minutes ago   /bin/sh -c yum -y install vim     58MB      dd92de8e574a   7 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/local     0B 78e356498ede   7 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local 0B b2c8ac4399b9   7 minutes ago   /bin/sh -c #(nop)  MAINTAINER vvvv<vurx@qq.c…   0B 300e315adb2f   3 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]     0B <missing>      3 months ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B <missing>      3 months ago    /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7…   209MB

CMD和 ENTRYPOINT 区别

测试cmd

#编写一个dockerfile 文件进行测试FROM centosCMD ["ls","-a"]#生成镜像#docker build -f dockerfiletest -t testcentos .Sending build context to Docker daemon  3.072kBStep 1/2 : FROM centos ---> 300e315adb2fStep 2/2 : CMD ["ls","-a"] ---> Running in 7f7afeca2628Removing intermediate container 7f7afeca2628 ---> f040f2ca4844Successfully built f040f2ca4844Successfully tagged testcentos:latest#运行测试#docker run -it f040f2ca4844.   .dockerenvdev  home  lib64media  opt   root  sbinsys  usr..  binetc  lib   lost+found  mnt    proc  run   srvtmp  var#追加一个命令时  -l  发现 报错[root@guchenstudy dockerfile]# docker run f040f2ca4844 -ldocker: 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.#cmd 的清理下 -l替换成了CMD ["ls","-a"] 命令 -l 不是命令所以报错

测试ENTRYPOINT

[root@guchenstudy dockerfile]# vim dockerfiletest01[root@guchenstudy dockerfile]# docker build -f dockerfiletest01 -t centostest .Sending build context to Docker daemon  4.096kBStep 1/2 : FROM centos ---> 300e315adb2fStep 2/2 : ENTRYPOINT ["ls","-a"] ---> Running in 75b78ff743d0Removing intermediate container 75b78ff743d0 ---> df374f6cbe6bSuccessfully built df374f6cbe6bSuccessfully tagged centostest:latest[root@guchenstudy dockerfile]# docker run df374f6cbe6b....dockerenvbindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvar#我们追加的命令 是直接拼接到我们的ENTRYPOINT 后面的[root@guchenstudy dockerfile]# docker run df374f6cbe6b -ltotal 56drwxr-xr-x   1 root root 4096 May 19 09:20 .drwxr-xr-x   1 root root 4096 May 19 09:20 ..-rwxr-xr-x   1 root root    0 May 19 09:20 .dockerenvlrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bindrwxr-xr-x   5 root root  340 May 19 09:20 devdrwxr-xr-x   1 root root 4096 May 19 09:20 etcdrwxr-xr-x   2 root root 4096 Nov  3  2020 homelrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/liblrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64drwx------   2 root root 4096 Dec  4 17:37 lost+founddrwxr-xr-x   2 root root 4096 Nov  3  2020 mediadrwxr-xr-x   2 root root 4096 Nov  3  2020 mntdrwxr-xr-x   2 root root 4096 Nov  3  2020 optdr-xr-xr-x 114 root root    0 May 19 09:20 procdr-xr-x---   2 root root 4096 Dec  4 17:37 rootdrwxr-xr-x  11 root root 4096 Dec  4 17:37 runlrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbindrwxr-xr-x   2 root root 4096 Nov  3  2020 srvdr-xr-xr-x  13 root root    0 May 19 09:20 sysdrwxrwxrwt   7 root root 4096 Dec  4 17:37 tmpdrwxr-xr-x  12 root root 4096 Dec  4 17:37 usrdrwxr-xr-x  20 root root 4096 Dec  4 17:37 var

dockerfile 很多命令都十分相似 我们需要了解它们的区别 我们最好的学习就是对比他们然后测试效果

实战tomcat与jdk镜像

博客实战:https://blog.csdn.net/miapecloud/article/details/97889026

发布自己的镜像

DockerHub

  1. 地址: https://hub.docker.com/ 注册自己的账号

  2. 确定这个账号可以登录

  3. 在我们服务器上提交自己的镜像

    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  #登录成功界面docker login -u guchenstudyPassword: WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded

    4.登录完毕后就可以提交镜像 就是一步 docker push

修改tag版本号

docker tag 镜像ID 名字:版本号

提交的镜像也是按层级来的

阿里云镜像

  1. 登录阿里云

    sudo docker login --username=顾晨努力学习 registry.cn-shanghai.aliyuncs.comPassword: WARNING! Your password will be stored unencrypted in /root/.docker/config.json.Configure a credential helper to remove this warning. Seehttps://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
  2. 找到容器镜像服务

  3. 创建命名空间

    Docker的学习笔记

  4. 创建容器镜像

    Docker的学习笔记

  5. 登录阿里云

    Docker的学习笔记

  6. docker push 镜像id:版本号

Docker小结

Docker的学习笔记

Docker 网络(重点)

理解docker0网络

Docker的学习笔记

外部宿主机能否拼通容器内部的机器

[root@guchenstudy ~]# 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.064 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.056 ms
^C
— 172.17.0.2 ping statistics —

veth-pair

博客:https://blog.csdn.net/z530234020/article/details/103304145

Docker的学习笔记

Docker的学习笔记

–link

通过容器名字来ping通网络

[root@guchenstudy ~]# docker exec -it tomcat02 ping tomcat01
PING tomcat01 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.098 ms
64 bytes from tomcat01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.091 ms
64 bytes from tomcat01 (172.17.0.2): icmp_seq=3 ttl=64 time=0.069 ms

可以ping通 但是反过来tomcat01pingtomcat02就ping不通啦[root@guchenstudy ~]# docker exec -it tomcat01 ping tomcat02
ping: tomcat02: Name or service not known

探究 可以通过inspect来看

命令是 docker network inspect 网络id

Docker的学习笔记

–link 其实就是当前容器绑定你要ping的容器名的ip地址 绑定在当前容器的/etc/hosts 目录下

不推荐使用–link啦

自定义网络

查看所有的docker网络

[root@guchenstudy ~]# docker network lsNETWORK ID     NAME      DRIVER    SCOPEb5ccae51de7d   bridge    bridge    local54c05fb66a41   host      host      local68ce43d6b9d3   none      null      local

网络模式

bridge 桥接docker(默认 自己自定义网络也是用bridge模式)

none 不配置网络

host 和宿主机共享网络

container 容器网络连通(用的少 局限很大)

**测试 **

# 我们直接启动的命令 --net bridge 而这个就是我们的docker0docker run -d -P --name tomcat01 tomcatdocker run -d -P --name tomcat01 --net bridge tomcat #不写--net 默认也是桥接模式#docker0特点 默认 域名不能访问 --link 可以打通连接#我们可以自定义一个网络#--driver 网络模式[root@guchenstudy ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet2927cbaa94335bd86644e303103d59b183d7199712d1407ee2efa730fb21c24b[root@guchenstudy ~]# docker network lsNETWORK ID     NAME      DRIVER    SCOPEb5ccae51de7d   bridge    bridge    local54c05fb66a41   host      host      local2927cbaa9433   mynet     bridge    local68ce43d6b9d3   none      null      local#查看自己配置的网络的数据[root@guchenstudy ~]# docker network inspect mynet[    { "Name": "mynet", "Id": "2927cbaa94335bd86644e303103d59b183d7199712d1407ee2efa730fb21c24b", "Created": "2021-05-20T17:00:45.289238648+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@guchenstudy ~]# docker run -d --name tomcatnet01 --net mynet tomcatbe78f37c466ab674dc5bac05660b865cfc15f4dd3ffe1b7cc23243a668c30005[root@guchenstudy ~]# docker run -d --name tomcatnet02 --net mynet tomcatd5f143478ffab9661f5c77d63e1468f3a001075449440ecefb4c90671919768f[root@guchenstudy ~]# docker network inspect mynet[    { "Name": "mynet", "Id": "2927cbaa94335bd86644e303103d59b183d7199712d1407ee2efa730fb21c24b", "Created": "2021-05-20T17:00:45.289238648+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": {     "be78f37c466ab674dc5bac05660b865cfc15f4dd3ffe1b7cc23243a668c30005": {  "Name": "tomcatnet01",  "EndpointID": "2fc67eebca86b17ec395c8f55e99c43302959c340a8ad38bd4ad79d4915e9081",  "MacAddress": "02:42:c0:a8:00:02",  "IPv4Address": "192.168.0.2/16",  "IPv6Address": ""     },     "d5f143478ffab9661f5c77d63e1468f3a001075449440ecefb4c90671919768f": {  "Name": "tomcatnet02",  "EndpointID": "3b86e01bdd2aba62f8247a00700acd4c1d360c6ae0bc968cad966c3e9b6ac99e",  "MacAddress": "02:42:c0:a8:00:03",  "IPv4Address": "192.168.0.3/16",  "IPv6Address": ""     } }, "Options": {}, "Labels": {}    }]#突然发现 可以通过容器名去ping网络啦[root@guchenstudy ~]# docker exec -it tomcatnet02 ping tomcatnet01PING tomcatnet01 (192.168.0.2) 56(84) bytes of data.64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.073 ms64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.069 ms[root@guchenstudy ~]# docker exec -it tomcatnet01 ping tomcatnet02PING tomcatnet02 (192.168.0.3) 56(84) bytes of data.64 bytes from tomcatnet02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.064 ms64 bytes from tomcatnet02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.093 ms64 bytes from tomcatnet02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.077 ms64 bytes from tomcatnet02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.071 ms推荐使用自定义网络来配置

好处是 不同的集群使用不同的网络 保证集群是安全和健康的

网络连通的操作

[root@guchenstudy ~]# docker run -d --name tomcat01 -P tomcat71a3e3f09c8e71c4defa922d38fb3a25a83d5f6739d7efb48de70330395fb399[root@guchenstudy ~]# docker network connect mynet tomcat01[root@guchenstudy ~]# docker exec -it tomcat01 ping tomcatnet01PING tomcatnet01 (192.168.0.2) 56(84) bytes of data.64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.070 ms64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.066 ms64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.068 ms64 bytes from tomcatnet01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.080 ms#查看连通后的信息[    { "Name": "mynet", "Id": "2927cbaa94335bd86644e303103d59b183d7199712d1407ee2efa730fb21c24b", "Created": "2021-05-20T17:00:45.289238648+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": {     "71a3e3f09c8e71c4defa922d38fb3a25a83d5f6739d7efb48de70330395fb399": {  "Name": "tomcat01",  "EndpointID": "986c51aef55136f3d196a58a8dd9d2b2762899035b5450fb8079adfcfcf69852",  "MacAddress": "02:42:c0:a8:00:04",  "IPv4Address": "192.168.0.4/16",  "IPv6Address": ""     },     "be78f37c466ab674dc5bac05660b865cfc15f4dd3ffe1b7cc23243a668c30005": {  "Name": "tomcatnet01",  "EndpointID": "2fc67eebca86b17ec395c8f55e99c43302959c340a8ad38bd4ad79d4915e9081",  "MacAddress": "02:42:c0:a8:00:02",  "IPv4Address": "192.168.0.2/16",  "IPv6Address": ""     },     "d5f143478ffab9661f5c77d63e1468f3a001075449440ecefb4c90671919768f": {  "Name": "tomcatnet02",  "EndpointID": "3b86e01bdd2aba62f8247a00700acd4c1d360c6ae0bc968cad966c3e9b6ac99e",  "MacAddress": "02:42:c0:a8:00:03",  "IPv4Address": "192.168.0.3/16",  "IPv6Address": ""     } }, "Options": {}, "Labels": {}    }]#原理 就是一个容器两个IP地址# 阿里云服务 公网ip 私网ip 类似

结论 假设要跨网络操作别人 就需要使用docker network connect 连通