什么是Docker:
Docker是一种开源的容器化平台,用于开发、部署和运行应用程序。它利用容器技术,将应用程序及其所有依赖项打包到一个标准化单元中,称为容器。这使得应用程序可以在几乎任何环境中轻松部署和运行,而无需担心环境差异或依赖问题。
Docker的作用:
- 应用程序隔离:Docker容器提供了应用程序级别的隔离,使得不同应用程序可以在同一主机上独立运行,互不干扰。
- 跨平台部署:Docker容器可以在任何支持Docker的平台上运行,无论是开发、测试还是生产环境。
- 快速部署:由于容器化的特性,Docker可以快速部署应用程序,减少部署时间和复杂性。
- 资源利用率:Docker容器共享主机的操作系统内核,因此比传统虚拟化方式更轻量级,资源利用率更高。
Docker的优势:
- 轻量级:Docker容器与虚拟机相比更轻量级,启动更快,占用更少资源。
- 便携性:Docker容器可以在不同环境中以相同的方式运行,提高了应用程序的便携性。
- 灵活性:Docker提供了丰富的工具和功能,使得容器的管理、部署和扩展更加灵活和便捷。
- 高效性:Docker的镜像和容器机制使得应用程序的构建、发布和更新更加高效。
Docker的历史:
- Docker最初由Docker公司(前身为Dotcloud)的创始人Solomon Hykes在2013年发布。它基于Linux容器技术(LXC)和AUFS文件系统,并提供了易用的工具和接口,使得容器的使用变得更加简单和便捷。
- Docker很快获得了广泛的关注和采用,成为当时最流行的容器化解决方案之一。
- 后来,Docker开源了其核心技术,形成了Docker开源项目,并成立了Docker社区,吸引了众多开发者和公司的参与和贡献。
- Docker技术的发展推动了容器化技术的普及和发展,也催生了一系列相关的生态系统和工具,如Docker Compose、Docker Swarm等。
-
Docker镜像(Docker Images):
- Docker镜像是用于创建Docker容器的模板。它包含应用程序及其所有运行时环境所需的文件、库和依赖项。镜像可以通过Dockerfile定义,也可以从Docker Hub等镜像仓库中获取。
-
Docker容器(Docker Containers):
- Docker容器是由Docker镜像创建的运行实例。每个容器都是一个独立的、轻量级的运行环境,具有自己的文件系统、网络和进程空间。容器可以快速启动、停止、删除和迁移。
-
Docker仓库(Docker Registry):
- Docker仓库是用于存储和分享Docker镜像的地方。最常见的是Docker Hub,其中包含了大量的公共镜像供开发者使用。除了Docker Hub,还可以搭建私有的Docker仓库来管理自己的镜像。
-
Docker网络(Docker Networking):
- Docker提供了各种网络模式,使得容器之间可以进行通信,也可以连接到外部网络。通过Docker网络,可以实现容器之间的隔离、通信和联网。
-
Docker数据管理(Docker Volumes):
- Docker Volumes用于持久化容器中的数据,使得数据在容器销毁后仍然存在。通过挂载数据卷,可以实现数据的持久化存储和共享。
-
Docker Compose:
- Docker Compose是用于定义和运行多个Docker容器的工具。通过一个单独的YAML文件,可以定义多个服务、网络和数据卷,并一键启动整个应用程序。
-
Docker Swarm:
- Docker Swarm是Docker官方提供的集群管理工具,用于管理多个Docker主机上的容器。它可以实现容器的自动部署、扩展和负载均衡,提高了容器化应用程序的可靠性和可扩展性。
-
Docker安全性(Docker Security):
- Docker提供了一系列安全功能,如命名空间隔离、控制组隔离、容器加密等,以确保容器的安全性。此外,还可以使用Docker安全扫描工具来检查镜像中的漏洞和安全性问题。
-
Docker日志管理(Docker Logging):
- Docker提供了日志驱动程序,可以将容器的日志输出到标准输出、文件、syslog等位置。通过良好的日志管理,可以更好地监控和分析容器的运行状态。
-
Docker插件(Docker Plugins):
- Docker支持插件机制,允许用户扩展Docker功能。可以使用各种插件来增强Docker的能力,如存储插件、网络插件、日志插件等。
-
Docker容器编排(Container Orchestration):
- 除了Docker Swarm外,还有其他容器编排工具如Kubernetes、Docker Compose等,用于管理和调度大规模容器集群。这些工具可以实现自动化部署、伸缩、负载均衡等功能。
-
Docker监控(Docker Monitoring):
- 通过监控Docker容器的资源利用率、性能指标、日志等信息,可以及时发现和解决问题,确保容器化应用程序的稳定性和可靠性。
-
Docker与持续集成/持续部署(CI/CD):
- Docker与CI/CD工具的集成可以实现自动化构建、测试和部署,加速软件开发和交付过程。通过Docker容器,可以实现环境一致性和快速部署。
-
Docker与微服务架构(Microservices):
- Docker容器与微服务架构相互结合,可以实现应用程序的模块化、弹性扩展和快速部署,促进软件开发的敏捷性和灵活性。
这些方面涉及了Docker在安全性、日志管理、插件扩展、容器编排、监控、持续集成部署以及与微服务架构的结合等
PRD/PROD production 产品、生产、
企业运行环境
1.Dev环境:开发环境,外部人员无法访问,开发人员使用,版本变动很大。
2.Test环境:测试环境,外部用户无法访问,专门给测试人员使用的,版本相对稳定。
3.Pre环境:灰度环境,外部用户可以访问,但是服务器配置相对低,其他和生产一样。
4.Pro环境:生产环境,面向外部用户的环境,连接上互联网即可访问的正式版本
云原生(CNCF)四要素:微服务+DevOps+持续交付+容器化
云计算:
公有云:阿里云、腾讯云
私有云:openstack+KVM
混合云:共+私
云计算三种产品:基础设施即服务(laas)、平台即服务(paas)、软件即服务(saas)
docker容器与传统虚拟机对比区别:
容器 | 虚拟机 | |
启动时间 | 秒级别 | 分钟级 |
资源损耗 | 几乎无损 | 至少损耗50%左右(系统占用) |
硬盘空间 | MB级别 | GB级别 |
系统支持 | 上千个 | 几十个 |
隔离性 | 有资源限制 | 完全隔离 |
性能 | 接近原生 | 弱于原生 |
Docker特点:
快速交互和部署
更高效的虚拟化
更轻松的迁移和扩展
简单的管理
秒级启动
进程级别的隔离
可以启动成百上千个
docker三大核心
镜像 image
基础 只读 方便迁移
容器 continer
从镜像创建 运行的 可写的
仓库 repository
registry 注册地:ducker hub
repository 仓库 :nginx举例,多个镜像:官方的、个人的;版本靠标签区分
存放镜像
分类:
共有仓库 docker hub(默认)
私有仓库 自己搭建
docker基本命令
镜像操作
🦐info 查看详细信息(不常用) 🦐veresion 查看版本 🦐search 镜像名 查看仓库中的镜像 🦐pull 镜像名[:标签] 拉取镜像 若不写标签,表示最新latest(尽量指定版本) 所有参数:docker pull 域名或IP:端口号/账号名或项目名/镜像名:标签 域名或IP 省略 默认hub.docker.com 端口 省略 默认80 账号名或项目名省略 表示官方 标签 省略 表示latest 🦐images 查看镜像 🦐inspect 获取详细信息 docker inspect 镜像或容器名或id号(id号可以加前边几位就行) 🦐tag 为镜像添加新的标签(只是改了个名,镜像id号不变) docker tag 镜像名[:标签] 新镜像名[:新标签] 🦐rmi 删除镜像(若此镜像已经运行了容器,则无法删除,可以加-f强制删除) docker rmi 镜像名[:标签] docker rmi 镜像id -f 强制删除 🦐save 导出镜像 docker save 镜像名 >本地文件名 🦐load 载入镜像 docker load < 路径/本地文件名 🦐push 上传镜像 docker push 域名或IP:端口号/账号名或项目名/镜像名:标签 docker push 镜像名:标签 域名或IP 省略 默认hub.docker.com 端口 省略 默认80 账号名或项目名省略 表示官方 标签 省略 表示latest 🦐login 登录 docker login [地址] 登录 默认登录到hub.docker.com 🦐history 查看镜像层级 docker history 镜像名或id
🦐pull 拉取镜像
docker pull 镜像名
所有参数:docker pull 域名或IP:端口号/名称/镜像名:标签
【域名或IP:端口号 如果省略,表示hub.docker.com】
【名称省略,表示官方】
【标签省略,表示最新】
拉取busybox镜像
busybox镜像 称为linux的瑞士军刀,封装了linux常用命令
[root@client ~] # docker pull busybox Using default tag: latest latest: Pulling from library/busybox 50783e0dfb64: Pull complete ##只有一层 Digest: sha256:ef320ff10026a50cf5f0213d35537ce0041ac1d96e9b7800bafd8bc9eff6c693 Status: Downloaded newer image for busybox:latest docker.io/library/busybox:latest 查看镜像 [root@client ~] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 7a80323521cc 2 weeks ago 1.24MB REPOSITORY:镜像名 TAG:标签名 IMAGE ID:镜像id CREATED:镜像构建时间 SIZE:大小
🦐images 查看镜像
[root@client ~] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 7a80323521cc 2 weeks ago 1.24MB REPOSITORY:镜像名 TAG:标签名 IMAGE ID:镜像id CREATED:构建时间 SIZE:大小
🦐inspect 详细信息
docker inspect 镜像名或id号(id号可以加前边几位就行)
查看busybox镜像详细信息 [root@client ~] # docker inspect busybox [ { "Id": "sha256:7a80323521ccd4c2b4b423fa6e38e5cea156600f40cd855e464cc52a321a24dd", "RepoTags": [ "busybox:latest" ], "RepoDigests": [ "busybox@sha256:ef320ff10026a50cf5f0213d35537ce0041ac1d96e9b7800bafd8bc9eff6c693" ], "Parent": "", "Comment": "", "Created": "2022-07-29T20:26:22.673054623Z", "Container": "fdc0fb1ac5a15ce9a0984262d3f42e8789b70424e508ccc63c7fbee3038b9ad6", "ContainerConfig": { "Hostname": "fdc0fb1ac5a1", "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", "#(nop) ", "CMD [\"sh\"]" ], "Image": "sha256:5e05bdcc415663af6650ce9dbb471a0063048e6c40a5e018f33c8b4a248775d3", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "20.10.12", "Author": "", "Config": { "Hostname": "", "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": [ "sh" ], "Image": "sha256:5e05bdcc415663af6650ce9dbb471a0063048e6c40a5e018f33c8b4a248775d3", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": null }, "Architecture": "amd64", "Os": "linux", "Size": 1243868, "VirtualSize": 1243868, "GraphDriver": { "Data": { "MergedDir": "/var/lib/docker/overlay2/a503ccf949eedfcc6674e390c46c36a0308d5f49a9db2b7eed0fb44d5cb25e5b/merged", "UpperDir": "/var/lib/docker/overlay2/a503ccf949eedfcc6674e390c46c36a0308d5f49a9db2b7eed0fb44d5cb25e5b/diff", "WorkDir": "/var/lib/docker/overlay2/a503ccf949eedfcc6674e390c46c36a0308d5f49a9db2b7eed0fb44d5cb25e5b/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:084326605ab6715ca698453e530e4d0319d4e402b468894a06affef944b4ef04" ] }, "Metadata": { "LastTagTime": "0001-01-01T00:00:00Z" } } ]
🦐tag 为镜像添加新的标签
(只是改了个名,镜像id号不变)
docker tag 镜像名[:标签] 新镜像名[:新标签]
注意!!!若要往docker hub上传镜像,那么标签应该这样写:在docker hub上建立了一个叫做busybox的库,我的用户名叫876456882,那么打标签的时候的全名就应该是876456882/busybox:标签 否则就会上传失败
###将busybox镜像改个名字和标签 [root@client ~] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 7a80323521cc 2 weeks ago 1.24MB [root@client ~] # docker tag busybox:latest busybox_tag:lyf [root@client ~] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 7a80323521cc 2 weeks ago 1.24MB ###注意看image id号 busybox_tag lyf 7a80323521cc 2 weeks ago 1.24MB
🦐rmi 删除镜像
(若此镜像已经运行了容器,则无法删除,可以加-f强制删除)
docker rmi 镜像名[:标签]
docker rmi 镜像id
-f 强制删除
将busybox_tag:lyf删除,由于两个镜像的id相同,所以不能删id,如果删了id,那么两个镜像都会消失
将busybox_tag:lyf删除,由于两个镜像的id相同,所以不能删id,如果删了id,那么两个镜像都会消失 [root@client ~] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 7a80323521cc 2 weeks ago 1.24MB busybox_tag lyf 7a80323521cc 2 weeks ago 1.24MB [root@client ~] # docker rmi busybox_tag:lyf Untagged: busybox_tag:lyf [root@client ~] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 7a80323521cc 2 weeks ago 1.24MB
🦐save 导出镜像
docker save 镜像名 > 路径/本地文件名
[root@client ~] # docker save nginx:latest > nginx.tgz
🦐load 载入镜像
docker load < 路径/本地文件名
[root@client ~] # docker load < nginx.tgz 92a4e8a3140f: Loading layer 83.87MB/83.87MB e3257a399753: Loading layer 62.04MB/62.04MB 3a89c8160a43: Loading layer 3.072kB/3.072kB f91d0987b144: Loading layer 4.096kB/4.096kB bdc7a32279cc: Loading layer 3.584kB/3.584kB b539cf60d7bb: Loading layer 7.168kB/7.168kB Loaded image: nginx:latest
🦐push 上传镜像
docker push 域名或IP:端口号/名称/镜像名:标签
注意,打标签时候需要在标签前加上自己docker hub用户名
例如,在docker hub上建立了一个叫做busybox的库,我的用户名叫876456882,那么打标签的时候的全名就应该是876456882/busybox:标签 否则就会上传失败
上传一个镜像(bsybox)到docker hub 先给busybox打一个标签 [root@client ~] # docker tag busybox:latest 876456882/yunbusybox:v8.16 [root@client ~] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest b692a91e4e15 2 weeks ago 142MB busybox latest 7a80323521cc 2 weeks ago 1.24MB yunbusybox v8.16 7a80323521cc 2 weeks ago 1.24MB 登录docker hub [root@client ~] # docker login 上传
🦐login 登录
docker login [地址] 登录 默认登录到hub.docker.com
logout登出
[root@client ~] # docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: 876456882 Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded 这样是登录成功
容器操作
运行容器的命令执行后容器就停止
命令持续执行容器就不停止
系统启动流程
开机自检
MRB引导
GRUB菜单
加载内核
init初始化
查看运行级别
系统初始化
并行运行各个服务
登录界面
主机名即是容器id(前12位)
/etc/hosts文件中有 容器本地IP地址和主机名的映射关系
hostname -I 查看ip地址(大i)
🦐create 创建容器 【创建容器,但不启动】 docker create [选项] 镜像名[:标签] 命令 参数 创建 docker start 镜像名或id 启动容器 选项: -i input 输入保持打开 -t tty 伪终端 -d deamo 守护进程 后台 🦐run 创建并启动容器 运行过程: 检查是否有镜像 有 直接使用 无 自动从docker hub下载 创建并启动一个容器 分配文件系统给容器 数据目录:/var/lib/docker 只读的镜像层上面加上一个可读写层(容器层) 宿主机网桥接一个接口到容器 分配IP地址 执行用户指定的程序 执行完毕后容器会终止 docker run [选项] 镜像名[:标签] 命令 参数 docker run -d centos /bin/bash -c "命令" 选项:-i 输入 -t 伪终端 -d 守护进程(后台运行) --rm 停止容器就自动删除 --name 给容器起一个名字 -p 端口映射,前面为宿主机的端口,后面为容器服务进程端口,访问宿主机的80,最终会转发给容器的80端口 -p 宿主机端口:容器端口 -P 随机给端口 -v 指定卷 -v 宿主机目录:容器目录 --restart=always 相当于开机启动,只要关闭就重启,以后要默认加上 docker container update --restart=always 容器名或id -e 环境变量 --network 🦐ps 查看正在运行的容器 docker ps -a 查看所有容器 -q 只列出镜像id(静默输出) -s 查看容器真正用到的文件大小 🦐start 启动容器 docker start 镜像名或id 【id可以写id 的前几位】 stop restart kill pause 挂起 unpause 取消挂起 🦐stop 停止容器 docker stop 镜像名或id 🦐restart 重启容器 docker restart 镜像名或id 🦐kill 杀死容器 docker kill 镜像名或id 🦐logs 查看容器日志 docker logs 容器名或id 查看容器日志 🦐exec 进入容器 docker exec -it 容器名或id /bin/bash 若使用/bin/bash不成功,则使用/bin/sh(例如busybox) 通过ctrl +pq退出 🦐$() -q 静默输出 只显示ID docker 子命令 $(docker 子命令 -q) 批量操作 🦐export 将容器打包成文件 docker export 容器名或id > 本地包名 🦐import ##将本地包名上传为镜像 cat 本地包名 | docker import - 镜像名:标签 ##将本地包名上传为镜像 🦐rm 删除容器 docker rm 容器名或id 删除已经停止的容器 -f 强制删除 docker rm $(docker ps -aq) 删除所有停止的容器 🦐cp 复制 docker cp 路径/文件 容器id:路径 docker cp [选项] 路径/文件或目录 容器名:路径 ##宿主机——容器 docker cp [选项] 容器名:路径 主机路径/文件或目录 ##容器——宿主机 🦐docker stop $(docker ps -aq) ##批量停止容器 -q 静默输出 🦐stats 查看容器资源使用率 docker stats 🦐top 查看容器状态 docker top 容器id 🦐update 更新容器配置 docker update --restart=always 容器名
🦐create 创建容器
创建一个centos的容器 [root@client ~] # docker create -it centos:latest /bin/bash 这时可能会警告,此容器无法上网,容器若是想上网,需要与本机做一个桥接
🦐使centos容器上网
centos无法上网,容器若是想上网,需要与本机做一个桥接,开启路由转发功能
[root@client ~] # vim /etc/sysctl.conf 末尾添加 net.ipv4.ip_forward=1 [root@client ~] # sysctl -p ##加载配置 net.ipv4.ip_forward = 1 再之后就不会提示了
🦐start 启动容器
三种方式 [root@client ~] # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 07322966c459 centos:latest "/bin/bash" 7 minutes ago Created intelligent_lumiere [root@client ~] # docker start intelligent_lumiere ##镜像名启动 [root@client ~] # docker start 07322966c459 ##镜像id启动 [root@client ~] # docker start 07 ##id前几位启动 07 [root@client ~] # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 07322966c459 centos:latest "/bin/bash" 9 minutes ago Up 51 seconds intelligent_lumiere
🦐export 将容器打包成文件
docker export 容器名或id > 文件名
将centos容器打包成镜像 [root@client ~] # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 07322966c459 centos:latest "/bin/bash" About an hour ago Up 58 minutes intelligent_lumiere [root@client ~] # docker export 073 > centos.test [root@client ~] # ls centos.test
🦐import 将文件上传为镜像
cat 文件名 | docker import - 镜像名:标签 ##将文件上传为镜像
将刚刚打包的文件上传为镜像 [root@client ~] # cat centos.test | docker import - centos:test sha256:afc13f2bc94d4197decf4616e2999ece4960e9ced3279268ba16f61d59c0fe0c [root@client ~] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos test afc13f2bc94d 53 seconds ago 231MB
🦐cp 复制
docker cp 路径/文件 容器id:路径
docker cp [选项] 路径/文件或目录 容器名:路径 ##宿主机——容器
docker cp [选项] 容器名:路径 主机路径/文件或目录 ##容器——宿主机
宿主机——容器 [root@client ~] # docker cp 1.txt 073:/root/ [root@client ~] # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 07322966c459 centos:latest "/bin/bash" 2 hours ago Up 2 hours intelligent_lumiere [root@client ~] # docker cp 1.txt 073:/root/ [root@client ~] # docker exec -it 073 /bin/bash [root@07322966c459 /]# ls /root/ 1.txt anaconda-ks.cfg anaconda-post.log original-ks.cfg 容器——宿主机 容器内部操作:[root@07322966c459 /]# touch 2.txt 退出 宿主机 [root@client ~] # docker cp 073:/2.txt . [root@client ~] # ls 2.txt