docker认识

docker怎么学习

即使在小的帆也能远航

Docker概述

docker为什么出现

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

开发既运维!!!

java–apk–发布(应用商店) --张三要安装才能使用

java-jar(环境)—打包项目带上环境(镜像)—docker仓库–下载镜像 —即可使用

docker给以上问题提出了解决方案

docker思想来源于集装箱!

jre—运行多个应用 (端口冲突)原来都是交叉存在

隔离机制: docker核心思想! 打包装箱 每个箱子都是互相隔离的。

假如 水果 生化炸弹 要是在以前是不能共同存放 而现在有了docker箱子机制 就可以一起存放

docker通过隔离机制 可以将linux服务器应用到极致

总结 所有的技术都是因为出现了一些问题 需要我们去解决 所以才去学习

docker历史

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

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

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

docker刚诞生的时候,没有引起行业的注意 dotcloud 存活困难

开源

开放源代码!!!!!

2013 docker开源

docker被越来越多的人发现docker的优点!!火了 然后每个月都会更新

2014.4.9 docker 1.0发布 时代化的变革

docker为什么会火 ? 十分的轻巧

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

虚拟机:在window中装一个vm 通过软件虚拟一台或多台电脑 会很笨重

虚拟机也是属于虚拟化技术,docker容器技术,也是一种虚拟化技术!

vm: linux cetos原生镜像(一台电脑!)隔离 需要开启多个虚拟机 就很大 几个g 启动时间也就很慢
docker 隔离 镜像(最核心的部分+jdk+mysql) 十分小巧 运行镜像就可以 几m 甚至几k 秒级启动

到现在开发人员必须掌握

聊聊docker 基于go语言开发

比较docker和虚拟机的不同:

  • 传统虚拟机,虚拟出一条硬件 运行一个完整的操作系统,然后在这个系统上上安装和运行软件
  • 容器内的应用直接运行在 宿主机的内容,容器吗,没有自己的内核的,也没有虚拟机的硬件所以很轻便
  • 每个容器互相隔离 每个容器都有一个属于自己的文件系统,互不影响
DEVOPS开发 运维

应用更快速的交付与部署

传统 要一堆帮助技术文档 安装程序

docker技术: 打包镜像发布测试 一步运行

更便携的升级和扩缩容

使用了docker之后 我们部署就像搭积木一样!

项目打包为一个镜像,扩展 服务器A 服务器B

更加简单的系统运维

在容器化之后,我们的开发,测试环境都是高度一致的。

更高效的计算资源利用

docker 是内核级别 可以在一个虚拟机上运行很多的容器实例 将性能压缩到极致

Docker组成

docker组成部分

镜像(image)

docker镜像就好比一个模板 可以通过模板来创建服务,tomcat==>run==>tomcat01容器(提供服务器),通过这个镜像可以创建很多个容器(最终服务运行或者项目运行就是在容器中)

容器

docker利用容器技术,独立运行一个或一组应用,通过镜像创建

启动 停止 删除 基本命令!

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

仓库

仓库就是存放镜像的地方!

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

docker hup(默认是国外的)

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

docker安装

1.旧版本的 Docker 称为 docker 或者 docker-engine,使用以下命令卸载旧版本:

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

2.执行以下命令安装依赖包:

$ sudo yum install -y yum-utils

3.执行下面的命令添加 yum 软件源:

一般都是用阿里镜像

$ sudo yum-config-manager \    --add-repo \    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
# 官方源# $ sudo yum-config-manager \#     --add-repo \#     https://download.docker.com/linux/centos/docker-ce.repo

4.更新 yum 软件源缓存,并安装 docker-ce

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

5.启动 Docker

$ sudo systemctl enable docker
$ sudo systemctl start docker

6.测试 Docker 是否安装正确

$ docker run hello-world

出现这个表示安装成功

docker images 查看镜像

卸载docker

阿里云镜像加速

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

docker运行流程

docker 底层原理

docker是一个client-server 结构的系统 docker的守护进程运行在主机 通过sokect访问

docker server接收到docker client的指令 就会执行这个命令

容器与容器之间相互隔离

为什么容器比vm快

  • 因为容器不用像vm一样每次创建新的应用都要加载内核
  • docker有着比虚拟机更少的抽象层
  • docker利用的是宿主机的内核 vm需要guest os
  • 所以说 新建一个容器 docker利用了宿主机的系统 减少了复杂过程

Docker常用命令

docker version  查看版本信息
docker info  显示docker基本信息
docker --help 万能命令

镜像命令

[root@iZ2zeazdwo385o2jo0dp1bZ ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   13 months ago   13.3kB
#解释
REPOSITORY 镜像仓库
TAG 镜像标签
IMAGE ID  镜像的id
CREATED 镜像的创建时间
SIZE  镜像的大小
#可选项
-a --all #列出所有的镜像
-f --filter # 过滤
-q -quiet   #只显示id

docker search 搜索镜像

clear 清屏
docker search mysql  --f=STARS=8000 用法 过滤 8000以下的

docker pull 拉取镜像

#下载镜像 docker pull 镜像名[:tag]版本
[root@ ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql #如果不写tag 默认就是latest
a076a628af6f: 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:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c #签名
Status: Downloaded newer image for mysql:latest#等价于
docker.io/library/mysql:latest #真实地址
docker pull mysql

docker rmi 删除镜像

docker rmi -f $(docker images -aq) #删除全部镜像
docker rmi -f #删除指定镜像  或多个

容器命令

我们有了镜像才可以创建容器 linux 下载一个centos镜像

docker pull centos

新建容器并启动

docker run [可选参数] image
#参数说明
--name=“name”  #容器名称 tomcat01 tomcat02
-d             #后台方式运行
-it            #使用交互运行 进入容器查看内容
-p              #指定端口号 -p ip:主机端口:容器端口-p   主机端口:容器端口 最常用的方式-p    容器端口-p 随机指定端口#测试[root@iZ2zeazdwo385o2jo0dp1bZ ~]# docker run -it centos /bin/bash 进入容器
[root@442a2e21552e /]# ls 查看容器 实际是个不完整的
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
# exit 退出容器
# 列出所有运行的容器
[root@iZ2zeazdwo385o2jo0dp1bZ /]# docker ps 查看当前运行的容器
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZ2zeazdwo385o2jo0dp1bZ /]# docker ps -a 查看当前运行的及曾经运行的容器
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
442a2e21552e   centos         "/bin/bash"   4 minutes ago   Exited (0) 2 minutes ago             amazing_saha
a7b6c1657774   bf756fb1ae65   "/hello"      4 hours ago     Exited (0) 4 hours ago               fervent_jemison
-n=? #显示最近创建的容器
-q  #显示当前运行的容器编号

退出容器

exit 停止并退出
ctrl +p+q 退出但不停止运行

删除容器

docker rm 容器id #删除指定容器 不能删除在运行的
docker rm -f $(docker ps aq) #先查询在递归删除
docker ps -a -q| xargs docker rm #删除全部

启动和停止容器操作

docker start 容器id 启动
docker restart 容器id 重启
docker stop  容器id 停止
docker kill 容器id 删除
其他常用命令
#命令 docker run -d 镜像名
#然后发现自动停止了 因为容器后台运行就必须有个前台进程

查看日志

docker log -f -t --tail 容器 没有日志
#自己编写shell脚本
docker run -d centos /bin/sh -c "while true;do echo hy;sleep 1;done"
#显示日志
-tf
tail numble 显示条数
-tail
docker logs -tf --tail 10(条数) 容器id

查看容器中进程信息

docker top 容器id
[root@iZ2zeazdwo385o2jo0dp1bZ /]# docker top 93745a6a6899
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                22244               22224               0                   15:29               ?                   00:00:00            /bin/sh -c while true;do echo hy;sleep 1;done
root                22597               22244               0                   15:34               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

查看镜像的元信息

docker  inspect   容器id
[{"Id": "93745a6a68993fb60cf3128de474daed61e88cd11b33e3fa402f23467b6ece9d","Created": "2021-02-01T07:29:40.578322741Z","Path": "/bin/sh",  控制台"Args": ["-c","while true;do echo hy;sleep 1;done"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 22244,"ExitCode": 0,"Error": "","StartedAt": "2021-02-01T07:29:40.918737419Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55","ResolvConfPath": "/var/lib/docker/containers/93745a6a68993fb60cf3128de474daed61e88cd11b33e3fa402f23467b6ece9d/resolv.conf","HostnamePath": "/var/lib/docker/containers/93745a6a68993fb60cf3128de474daed61e88cd11b33e3fa402f23467b6ece9d/hostname","HostsPath": "/var/lib/docker/containers/93745a6a68993fb60cf3128de474daed61e88cd11b33e3fa402f23467b6ece9d/hosts","LogPath": "/var/lib/docker/containers/93745a6a68993fb60cf3128de474daed61e88cd11b33e3fa402f23467b6ece9d/93745a6a68993fb60cf3128de474daed61e88cd11b33e3fa402f23467b6ece9d-json.log","Name": "/quizzical_wu","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/cf050b4d2970e7af4d77fe359ed38b9f76e1a72d07a6cb295e87ad8074b43c2b-init/diff:/var/lib/docker/overlay2/62fd0e1cc83842d5289a44580d37ad590c64a9974982b63cc60421b77975f0e0/diff","MergedDir": "/var/lib/docker/overlay2/cf050b4d2970e7af4d77fe359ed38b9f76e1a72d07a6cb295e87ad8074b43c2b/merged","UpperDir": "/var/lib/docker/overlay2/cf050b4d2970e7af4d77fe359ed38b9f76e1a72d07a6cb295e87ad8074b43c2b/diff","WorkDir": "/var/lib/docker/overlay2/cf050b4d2970e7af4d77fe359ed38b9f76e1a72d07a6cb295e87ad8074b43c2b/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "93745a6a6899","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/sh","-c","while true;do echo hy;sleep 1;done"],"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": "63865d363ba64622b69f04544c992e6d88b0b293add3e727bd8bc81f0ee1d966","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/63865d363ba6","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "01225230ef472864c8765c69f038aedbdfa6f9c0ec8b567092f46532073c7021","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": "02f8fcfeac0a771c9d0dab0a7cd8d35096a2adc07bdaf60be7c783e2221bb05c","EndpointID": "01225230ef472864c8765c69f038aedbdfa6f9c0ec8b567092f46532073c7021","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@iZ2zeazdwo385o2jo0dp1bZ /]# docker exec -it 93745a6a6899 /bin/bash
[root@93745a6a6899 /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@93745a6a6899 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 07:29 ?        00:00:00 /bin/sh -c while true;do echo hy;sleep 1;done
root      1049     0  0 07:46 pts/0    00:00:00 /bin/bash
root      1088     1  0 07:47 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/
root      1089  1049  0 07:47 pts/0    00:00:00 ps -ef
[root@93745a6a6899 /]#
#第二中方式
docker attach 容器id   #区别
docker exec 会重新创建一个新的终端 *常用*
docker attach 会进入当前容器正常执行的操作 不会加载新终端

将容器里文件copy到主机

docker cp 容器id:容器路径/文件  /要拷贝的路径
[root@iZ2zeazdwo385o2jo0dp1bZ home]# docker cp d09a62572728:/home/test.java  /home
[root@iZ2zeazdwo385o2jo0dp1bZ home]# ls
test.java
#拷贝是一种手动的 未来我们使用 -v(卷技术) 将容器home与主机home连通 同步

安装tomcat

docker pull tomcat:tag  拉取镜像
docker images 查看镜像
-d 后台运行 -p 映射端口 --name 设置名字 tomcat01 run 创建容器 或 运行容器
docker run -d -p 3366:8080 --name tomcat01 tomcat
[root@iZ2zeazdwo385o2jo0dp1bZ /]# docker ps 查看容器
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                    NAMES
fdcf1e8b235a   tomcat    "catalina.sh run"        5 seconds ago   Up 4 seconds   0.0.0.0:3366->8080/tcp   tomcat01
b53afab62606   nginx     "/docker-entrypoint.…"   2 hours ago     Up 2 hours     0.0.0.0:3344->80/tcp     nginx01
docker exec -it tomcat01 /bin/bash #进入运行的容器 /bin/bash控制台
因为容器tomcat是压缩的所以里面webapps 没有东西 外网访问会404 里面有webapps.dist
root@fdcf1e8b235a:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager
把webapps.dist copy 到 webapps  就能正常运行
完结

安装elasticsearch和kibana

# 第一步 直接docker run 运行容器
--net somenetwork #配置网络
$ docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300  -e "discovery.type=single-node" elasticsearch:7.6.2
#会发现运行时很卡 非常占用内存
#占用高达 68%
CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET I/O   BLOCK I/O       PIDS
fcf9c4afff5f   elasticsearch   96.34%    1.226GiB / 1.795GiB   68.31%    0B / 0B   175MB / 246kB   20
#测试查看
[root@iZ2zeazdwo385o2jo0dp1bZ ~]# curl localhost:9200
{"name" : "fcf9c4afff5f","cluster_name" : "docker-cluster","cluster_uuid" : "d_qsD8B3R56srINhoP2H7Q","version" : {"number" : "7.6.2","build_flavor" : "default","build_type" : "docker","build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f","build_date" : "2020-03-26T06:34:37.794943Z","build_snapshot" : false,"lucene_version" : "8.4.0","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"},"tagline" : "You Know, for Search"
}
# 为了解决这一问题 我们可以看官方文档的减少内存配置 在配置文件约束
-e #进入环境配置
docker run -e ES_JAVA_OPTS="-Xms64m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name ES01 -e "discovery.type=single-node" elasticsearch:7.6.2
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" #配置环境 减少内存占用
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O       PIDS
24771a6eb1b1   ES01      0.69%     483.3MiB / 1.795GiB   26.30%    648B / 554B   184kB / 696kB   42
#测试 发现也可以进入
[root@iZ2zeazdwo385o2jo0dp1bZ ~]# curl localhost:9200
{"name" : "24771a6eb1b1","cluster_name" : "docker-cluster","cluster_uuid" : "P5RyHcwkTEm3YIMEh04Viw","version" : {"number" : "7.6.2","build_flavor" : "default","build_type" : "docker","build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f","build_date" : "2020-03-26T06:34:37.794943Z","build_snapshot" : false,"lucene_version" : "8.4.0","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"},"tagline" : "You Know, for Search"
}
#安装kibana
-e ELASTICSEARCH_URL=http://ip:9200 #配置环境变量 得到es得ip及端口
docker run --name kibana -e ELASTICSEARCH_URL=http://ip:9200 -p 5601:5601 -d daocloud.io/library/kibana:6.8.1
#然后外网访问 5601
# -p后面有两个端口,前一个为节点端口,就是外部访问时用的端口,后一个为容器端口使用默认的即可

可视化面板安装

portainer(目前先用这个工具)

docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

Docker镜像讲解

镜像是什么

镜像是一种轻量级 可执行得独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容包括代码运行时、库、环境变量和配置文件。

所有的应用,直接打包docker镜像 就可以运行

如何得到镜像:

  • 从远程下载
  • 朋友copy给你
  • 自己制造一个

docker镜像加载原理

uniofs 联合文件系统

我们下载的时候就是一层层就是这个

联合文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次次提交来一层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下 union文件系统是docker镜像的基础,镜像可以通过分层来继承,基于基础镜像(没有父镜像)可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看来,只看到一个文件系统联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有的底层的文件和目录

**docker里面的系统都是精简的 只有一些命令 **


因为它是容器用的都是主机的内核 所以容器内部只有一些命令

公用的底层 bootfs

分层原理

 "Type": "layers","Layers": ["sha256:cb42413394c4059335228c137fe884ff3ab8946a014014309676c25e3ac86864","sha256:8e14cb7841faede6e42ab797f915c329c22f3b39026f8338c4c75de26e5d4e82","sha256:1450b8f0019c829e638ab5c1f3c2674d117517669e41dd2d0409a668e0807e96","sha256:f927192cc30cb53065dc266f78ff12dc06651d6eb84088e82be2d98ac47d42a0","sha256:a24a292d018421783c491bc72f6601908cb844b17427bac92f0a22f5fd809665","sha256:3480f9cdd491225670e9899786128ffe47054b0a5d54c48f6b10623d2f340632"]
每一层都是一个文件
特点

docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!

这一层通常都是容器层,容器之下就是镜像层!!!

其实run 就是新加了一层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LOaRTfHP-1612255042848)(C:\Users\hp\Desktop\笔记\屏幕截图 2021-02-02 142620.png)]

commit镜像

docker commit 提交容器成为一个新的副本
#命令和git原理相似
docker commit -m="提交的描述信息"-a="作者" 容器id 目标镜像名:tag
[root@iZ2zeazdwo385o2jo0dp1bZ ~]# docker images
REPOSITORY                   TAG       IMAGE ID       CREATED          SIZE
tomcat00                     1.0       528577233a13   13 seconds ago   658MB
redis                        latest    621ceef7494a   2 weeks ago      104MB
tomcat                       latest    040bdb29ab37   2 weeks ago      649MB
# 比我们原始的镜像大一点
#如果想要保存容器当前状态的化就可以使用commit提交 获得一个新的镜像

容器数据卷

什么是容器数据卷

docker理念回顾

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

数据!如果数据放在容器里那么我们容器删除 数据就会丢失!需求:数据可持久化 mysql 容器删了 删库跑路 需求 mysql数据存储到本地

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

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

容器持久化其实就是同步操作

使用数据卷

方式一使用命令挂载
docker run it -v 主机目录:容器内目录、
#测试
docker run it -v /home/test:/home centos /bin/bash
touch #创建文件
cat :查看
vim:修改配置文件"Mounts": [{"Type": "bind","Source": "/home/test","Destination": "/home","Mode": "","RW": true,"Propagation": "rprivate"}
显示已挂载
[root@iZ2zeazdwo385o2jo0dp1bZ test]# ls
config.php  sss.java
文件已同步
关闭容器
docker stop 容器id
测试在主机修改内容 容器是否会显示
用vim 文件 写东西
[root@iZ2zeazdwo385o2jo0dp1bZ test]# vim config.php 修改内容
运行容器 docker start 容器id
docker attach  容器id 进入正在运行的容器
#查看修改的内容
[root@57bcc2406ee5 home]# cat config.php
hello myhost
#并显示

实战:安装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 暴露端口
-e 环境配置
-v 数据卷挂载
--name 名字
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456name mysql01 mysql:5.7
#本地测试 连接成功
#mysql的3310  3310和容器里的3306映射 就可以连接

假设容器被删除 发现我们本地的数据还在 这就是持久化技术

[root@iZ2zeazdwo385o2jo0dp1bZ data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem
[root@iZ2zeazdwo385o2jo0dp1bZ data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem  test
#本地创建test的 这里面会加载 所以彻底接管容器了

具名与匿名挂载

#匿名挂载
-v 容器内的路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看volume 情况
docker colume ls 查看所有情况
[root@iZ2zeazdwo385o2jo0dp1bZ ~]# docker volume ls
DRIVER    VOLUME NAME
local     0a853810a0ef56a42c4d148459b279f2d6593d85b014ef1d10290aced6f3f428
local     606b725ee2aa16571c7e672991c6c5f2b97aab52cf86cdd7a4c6a0acdbb4ec48
#此时我们发现 匿名挂载只写了容器内的路径 没有写容器外的路径#具名挂载 加/就是实际地址
docker run -d -P --name nginx03 -v  jumingnginx:/etc/nginx nginx
[root@iZ2zeazdwo385o2jo0dp1bZ ~]# docker volume ls
DRIVER    VOLUME NAME
local     0a853810a0ef56a42c4d148459b279f2d6593d85b014ef1d10290aced6f3f428
local     606b725ee2aa16571c7e672991c6c5f2b97aab52cf86cdd7a4c6a0acdbb4ec48
local     jumingnginx
#通过 -v 卷名:容器内路径
[root@iZ2zeazdwo385o2jo0dp1bZ ~]# docker volume inspect jumingnginx
[{"CreatedAt": "2021-02-02T16:29:40+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/jumingnginx/_data","Name": "jumingnginx","Options": null,"Scope": "local"}
]
#得到了它被存放的具体地址
[root@iZ2zeazdwo385o2jo0dp1bZ docker]# cd volumes
[root@iZ2zeazdwo385o2jo0dp1bZ volumes]# ls
0a853810a0ef56a42c4d148459b279f2d6593d85b014ef1d10290aced6f3f428  backingFsBlockDev  metadata.db
606b725ee2aa16571c7e672991c6c5f2b97aab52cf86cdd7a4c6a0acdbb4ec48  jumingnginx
#里面放了我们的jumingnginx
[root@iZ2zeazdwo385o2jo0dp1bZ _data]# ls
conf.d  fastcgi_params  koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params  uwsgi_params  win-utf
[root@iZ2zeazdwo385o2jo0dp1bZ _data]#
# 这样我们就可以直接外部修改nginx 也实现了nginx修改配置文件麻烦的问题
#如何确定 具名 匿名 指定路径挂载!!!
-v 容器内路径  #匿名挂载
-b 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径  #指定路径挂载

docker 入门优质文章相关推荐

  1. Docker入门学习教程

    Docker入门学习 文章目录 Docker入门学习 1.简介 2 基本概念 2.1 镜像(Image) 2.2 容器(Container) 2.3 仓库(Repository) 3.Windows ...

  2. 小白也能读懂的 Docker 入门教程

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 来自:马哥Linux运维 Docker 是 Golang 编写的, 自 2013 年推出以来,受到越来越多的开发者的关注.如果你关注最新的技 ...

  3. Docker入门六部曲——服务

    原文链接:http://www.dubby.cn/detail.html?id=8735 准备 已经安装好Docker 1.13或者以上的版本. 安装好Docker Compose.如果你是用的是Do ...

  4. Docker入门系列之二:使用dockerfile制作包含指定web应用的镜像

    2019独角兽企业重金招聘Python工程师标准>>> 在前一篇文章:Docker入门系列之一:在一个Docker容器里运行指定的web应用 里, 我们已经成功地将我们在本地开发的一 ...

  5. Docker入门系列之三:如何将dockerfile制作好的镜像发布到Docker hub上

    这个系列的前两篇文章,我们已经把我们的应用成功地在Docker里通过nginx运行了起来,并且用dockerfile里制作好了一个镜像. Docker入门系列之一:在一个Docker容器里运行指定的w ...

  6. docker desktop ubuntu镜像_原创 | Docker入门,看了不理解,假一赔命

    写在前面 这篇博客适合谁? 对于Docker并不了解,只是有一点模糊的感觉,觉得Docker可以当成虚拟机用之类的 只是下载了Docker软件,对于怎么配置,怎么玩,第一步干什么,完全一无所知 其二, ...

  7. Docker入门,看了不理解,假一赔命

    写在前面 这篇博客适合谁? 对于Docker并不了解,只是有一点模糊的感觉,觉得Docker可以当成虚拟机用之类的 只是下载了Docker软件,对于怎么配置,怎么玩,第一步干什么,完全一无所知 其二, ...

  8. 大白话Docker入门(二)

    2019独角兽企业重金招聘Python工程师标准>>> 上篇的大白话Docker入门(一)让我们认识了docker,知道docker大概是怎么玩的.初步的印象可能会让你觉得和现在的V ...

  9. Docker入门实战看这篇就够了(最新详细以及踩过的坑)

    Docker入门实战看这篇就够了 前言 初识 是什么 容器与虚拟机 能干什么 去哪玩 安装 先决条件 查看自己的内核 安装所需的软件包(支持devicemapper存储类型) 设置镜像的仓库 设置yu ...

  10. 容器化技术最佳实践1--容器化技术简介与Docker入门

    容器化技术最佳实践1–容器化技术简介与Docker入门 文章目录 容器化技术最佳实践1--容器化技术简介与Docker入门 容器化简介 通过虚拟化了解容器化 对开发和运维的好处 容器化部署特点 什么情 ...

最新文章

  1. 【Qt】qt打印文件名、函数名、行号
  2. 对象的比较与排序(五):C#运算符重载
  3. Hyperledger Fabric 排序服务核心原理和工作过程
  4. kettle对字符串去除空格_整理|ABAP基础知识二:常用字符串处理
  5. C#LeetCode刷题之#389-找不同(Find the Difference)
  6. 华为中国生态大会2021举行在即,GaussDB将重磅发布5大解决方案
  7. ios input框无法输入问题
  8. matlab连续投影算法SPA使用示例
  9. java socket第三方库_Java基于Socket实现HTTP下载客户端
  10. 华泰证券首席培训张继强 债市分析框架PPT
  11. 低代码平台集成方案,打通企业内部业务管理系统
  12. Powershell————2、Powershell交互式
  13. 006 管理Ceph的RBD块设备
  14. 商汤的AI伴游小精灵(2019 计蒜之道 初赛 第一场)
  15. hdu 2121 最小树形图 +虚根
  16. 卸载 nginx 彻底删除
  17. 每日一题 | 计算松鼠的数量
  18. Arduino与Proteus仿真实例-NTC热敏电阻驱动仿真
  19. Docker Swarm-Docker
  20. BS EN ISO 4589塑料-用氧指数法测定燃烧行为-第2部分:室温测试

热门文章

  1. 未明学院数据分析报告:谁才是淘宝沙发界最受瞩目的明星店铺?大数据分析助你做“星探”!
  2. FCW前车碰撞预警的两个重要指标——THW、TTC
  3. C# WPF 低仿网易云音乐(PC)歌词控件
  4. 71 Climbing staring C++
  5. 一文了解Markdown语法
  6. 免费比对工具DiffMerge
  7. 股票价格中后取复权的计算
  8. DNW的详细配置及使用过程
  9. 前端部署的灵魂拷问,你能回答出几个?【部署必看篇】
  10. esp8266基本使用 - WebServer