赞
踩
前言
在软件开发和部署环境中,使用 Docker 等容器技术可以帮助团队实现快速、一致、可靠的应用程序部署,提高开发效率和应用程序的可移植性。
目录
基础设施即服务。提供基础的计算机资源,如虚拟机、存储和网络等,用户可以通过云服务提供商的平台管理这些基础设施。
平台即服务。提供完整的开发环境,包括开发工具、数据库、中间件等,使开发人员可以快速构建、部署和管理应用程序,减少了对基础设施的管理负担。
软件即服务。提供基于互联网的软件应用程序,用户可以通过 Web 浏览器访问和使用这些应用程序,而无需安装和维护软件。SaaS 提供商通常负责应用程序的运行、维护和安全性,用户只需按照订阅模式付费即可使用。
数据即服务。用户可以通过云服务提供商的平台访问和处理数据。DaaS可以帮助组织更好地管理和利用数据资源,支持数据的存储、备份、分析和共享等功能。
① 寄居架构
本机(真实的操作系统)——> 虚拟化产品 ——> 虚拟化操作系统或软件
② 源生架构
拿一台服务器(裸金属服务器),直接装虚拟化产品
① 仿真虚拟化:对系统硬件没有要求,性能最低
VMware 客户端
② 半虚拟化:虚拟机,可以使用真机(物理机)
RHEL 5 作为操作系统可以在这些虚拟化平台上运行,自带 xen 虚拟机监视器,并通过半虚拟化驱动优化性能。
微软 Microsoft Hyper-V:
VirtualBox:
Citrix Hypervisor:
③ 全虚拟化:直接使用物理硬件,性能高
KVM、openstack
KVM是一种虚拟化技术,而OpenStack是一个云计算平台,二者可以结合使用,通过KVM提供虚拟化基础设施,然后在OpenStack上部署和管理虚拟化资源。
VMware 服务器,ESXI 企业级虚拟化产品,全称 VMware vsphere 裸金属服务器;全虚拟化,直接使用物理硬件,性能高。
KVM 是一个开源的虚拟化解决方案,集成在内核中,性能受宿主操作系统影响。调用 Linux 内核来完成的功能和性能,运行在 Linux 环境中。
KVM 基于内核,通过控制器统筹管理调用软件层 hypervisor 虚拟机,软件层类似于一个抽象层,再调用 QEMU 组件(可以理解为 I/O 控制模块,调用硬件设备,来完成CPU、内存、硬盘的逻辑划分)生成一个 VM 虚拟机,完成 KVM 的逻辑分割。
ESXI 是由 VMware 开发的一种虚拟化平台,是 VMware vSphere 产品套件的一部分,通过 VMware vSphere 客户端或者网页端连接。VMware vSphere 提供了管理功能和可视化界面,虚拟机直接访问硬件资源,性能更换,运行在企业级环境。
ESXI 是裸金属之上安装的虚拟化产品,首先需要在服务器上安装 ESXI 操作系统,然后使用客户端或网页端连接登录该 ESXI 操作系统,系统层会调用硬件服务器中的配置来创建虚拟机。一旦虚拟机创建完成,ESXI 负责将物理服务器的资源(CPU、内存、存储、网络)划分和分配给虚拟机。
总之:
KVM 和 ESXI 都是虚拟化技术,用于创建和管理虚拟机;提供虚拟环境,允许单个物理服务器上运行多个虚拟机示例。KVM 是一个开源的虚拟化解决方案,集成在 Linux 内核中,适合需要灵活性和定制化的场景;而 ESXi 是 VMware 的专有虚拟化产品,适合企业级应用和虚拟化环境。
Docker 是一个开源的应用容器引擎,是在 Linux 容器里运行应用的开源工具,是一种轻量级的“虚拟机”。Docker 是一种容器化技术,将应用及其依赖项打包成一个镜像包打包到一个容器中,在任何环境中运行应用程序;与虚拟机不同:容器共享主机操作系统的内核,更加轻量和灵活。
Docker 容器可以被看做运行在宿主机上的一个进程,容器共享宿主机内核。通过 namespace(命名空间、名称)资源隔离,通过 cgroup (资源配额)去限制资源。
① 灵活:即使是最复杂的应用也可以集装箱化。
② 轻量级:容器利用并共享主机内核。
③ 可互换:可以即时部署更新和升级。
④ 便携式:可以在本地构建,部署到云,并在任何地方运行。
⑤ 可扩展:可以增加并自动分发容器副本。
⑥ 可堆叠:可以垂直和即时堆叠服务。
特性 | Docker容器 | 虚拟机 |
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗 50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源隔离/限制 | 完全隔离 |
① Docker
Docker 是一种流行的容器化平台,允许开发人员打包应用程序及其依赖项到轻量级容器中,实现跨平台部署和运行。
② Podman
Podman 是一个与 Docker 兼容的容器引擎,由Red Hat开发,旨在提供更安全、更轻量级的容器解决方案;Podman 不需要守护进程,使用普通用户权限即可运行容器。
③ Kubernetes(K8s)
Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。
④ LXC
LXC 是一种基于Linux内核的容器化技术,允许在单个Linux系统上运行多个隔离的用户空间环境。
⑤ CRI-O
CRI-O 是一个轻量级的容器运行时,专门为 Kubernetes 设计。
⑥ Apache Mesos
Apache Mesos 是一个开源的分布式系统内核,用于实现资源管理和任务调度,支持容器化应用程序的部署和扩展。是一个容器编排平台。
命名空间是 Linux 内核提供的一种机制,用于隔离系统资源,使得每个容器拥有自己独立的命名空间。通过命名空间,容器可以拥有自己的进程树、网络、文件系统等资源,实现资源的隔离和独立性。
控制组是 Linux 内核提供的另一种机制,用于限制和管理系统资源的使用。通过控制组,可以对容器的资源使用进行限制,如 CPU、内存、磁盘等,确保容器在共享主机资源的情况下能够按需分配和管理资源。
Docker 本质就是宿主机的一个进程,docker 是通过 namespace 实现资源隔离,通过 cgroup 实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作。
这些命名空间的隔离机制使得容器可以在共享主机资源的情况下实现隔离和独立性,确保容器之间互不干扰,提高系统的安全性和稳定性。
namespace | 系统调用参数 | 隔离内容 |
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWWIPC | 信号量、消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
NETWORK | CLONE_NEWNET | 网络设备、网络栈、端口等 |
MOUNT | CLONE_NEWNS | 挂载点(文件系统) |
USER | CLONE_NEWUSER | 用户和用户组(3.8以后的内核才支持) |
Docker 的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。Docker 镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。
Docker 的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。可以把容器看做是一个简易版的 linux 环境(包括 root 用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker。
官方地址下载 rpm 包
Index of linux/centos/7/x86_64/stable/Packages/ (docker.com)
阿里云地址下载
docker-ce-linux-centos-7-x86_64-stable-Packages安装包下载_开源镜像站-阿里云 (aliyun.com)
- [root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
- # yum-utils: 是一组用于增强和扩展Yum功能的实用程序集合,包含了一些高级的包管理工具,如下载镜像、创建repo文件等
- # device-mapper-persistent-data: 是Device Mapper持久化数据存储支持包,常用于LVM(Logical Volume Manager)和DM(Device Mapper)相关的存储管理
- # lvm2: 是第二代逻辑卷管理器(Logical Volume Manager version 2)的软件包,用于提供灵活的磁盘存储管理,可以在多个物理硬盘之间动态创建、调整和删除逻辑卷
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- [root@localhost ~]# yum install -y docker-ce docker-ce-cli containerd.io
- # docker-ce:这是Docker的核心组件,包含Docker引擎,用于运行容器
- # docker-ce-cli:这是Docker命令行工具,用于与Docker守护进程交互,进行容器的管理操作
- # containerd.io:这是一个更底层的容器运行时,是Docker的重要依赖,负责容器的生命周期管理,如容器的启动、停止、资源隔离等
- [root@localhost ~]# systemctl start docker.service
- [root@localhost ~]# systemctl enable docker.service
- [root@localhost ~]# docker version # 查看docker版本信息
- Client: Docker Engine - Community
- Version: 26.0.2
- ……
- [root@localhost ~]# docker info # docker信息查看
- wget https://download.docker.com/linux/static/stable/x86_64/docker-26.0.2.tgz
- tar xzvf docker-26.0.2.tgz # 解压安装包
- cp docker/* /usr/bin/ # 将二进制文件移动到可执行路径上的目录
- dockerd & # 启动
- vim /usr/lib/systemd/system/docker.service
- [Unit]
- Description=Docker Application Container Engine
- Documentation=https://docs.docker.com
- After=network-online.target firewalld.service
- Wants=network-online.target
-
- [Service]
- Type=notify
- ExecStart=/usr/bin/dockerd
- ExecReload=/bin/kill -s HUP $MAINPID
- LimitNOFILE=infinity
- LimitNPROC=infinity
- TimeoutStartSec=0
- Delegate=yes
- KillMode=process
- Restart=on-failure
- StartLimitBurst=3
- StartLimitInterval=60s
-
- [Install]
- WantedBy=multi-user.target
-
- systemctl daemon-reload
- systemctl start docker.service
- sudo mkdir -p /etc/docker
- sudo tee /etc/docker/daemon.json <<-'EOF'
- {
- "registry-mirrors": ["https://xxxxxxxx.aliyuncs.com"]
- }
- EOF
- sudo systemctl daemon-reload
- sudo systemctl restart docker
- 格式:
- docker search 关键字
- 示例:
- [root@localhost ~]# docker search nginx
- 格式:
- docker pull 仓库名称/镜像名称[:标签]
- 示例:
- [root@localhost ~]# docker pull nginx
- Using default tag: latest # 不指定标签,即为 latest
- 浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 登录获取镜像加速器配置
- [root@localhost ~]# mkdir -p /etc/docker
- 使用指定的镜像仓库地址作为Docker Registry的镜像加速器:
- tee /etc/docker/daemon.json <<-'EOF'
- # /etc/docker/daemon.json是Docker的守护进程(daemon)的配置文件。在Docker中,守护进程负责管理 Docker服务,并接受来自Docker客户端的请求,执行相应的操作
- {
- "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
- # 指定了一个阿里云的镜像加速地址
- }
- EOF
- [root@localhost ~]# systemctl daemon-reload # 重新加载Systemd守护进程的配置文件
- [root@localhost ~]# systemctl restart docker
- Docker 相关的本地资源存放在 /var/lib/docker/ 目录下,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件:
- [root@localhost ~]# cd /var/lib/docker/
- [root@localhost docker]# ls
- buildkit containers engine-id image network overlay2 plugins runtimes swarm tmp volumes
- # buildkit:存储与 Docker BuildKit 构建工具相关的数据和配置信息,用于支持 Docker 镜像的构建过程
- # containers:存储 Docker 容器的相关信息,包括容器的元数据、配置信息等
- # engine-id:存储 Docker 引擎的唯一标识符,用于标识不同的 Docker 引擎实例
- # image:存储 Docker 镜像的相关信息,包括已下载的镜像、镜像层等
- # network:存储 Docker 网络的相关信息,包括网络配置、网络状态等
- # overlay2:存储 Docker 存储驱动 Overlay2 的数据,用于存储容器的文件系统层
- # plugins:存储 Docker 插件的相关信息,用于扩展 Docker 功能的插件
- # runtimes:存储 Docker 容器运行时的相关信息,包括容器运行时的配置、状态等
- # swarm:存储 Docker Swarm 的相关信息,用于支持 Docker 集群管理功能
- # tmp:临时目录,用于存储临时文件和数据
- # volumes:存储 Docker 卷的相关信息,包括卷的配置、数据等
-
- [root@localhost ~]# cat /var/lib/docker/image/overlay2/repositories.json
- # 查看下载的镜像文件信息
- {"Repositories":{"nginx":{"nginx:latest":"sha256:2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580","nginx@sha256:0463a96ac74b84a8a1b27f3d1f4ae5d1a70ea823219394e131f5bf3536674419":"sha256:2ac752d7aeb1d9281f708e7c51501c41baf90de15ffc9bca7c5d38b8da41b580"}}}
-
- [root@localhost ~]# docker images # 查看下载到本地的所有镜像
- REPOSITORY TAG IMAGE ID CREATED SIZE
- nginx latest 2ac752d7aeb1 5 days ago 188MB
- # REPOSITORY:镜像属于的仓库;
- # TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
- # IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像;
- # CREATED:镜像创建时间;
- # VIRTUAL SIZE:镜像大小;
- 格式:
- docker inspect 镜像ID号
- 示例:
- [root@localhost ~]# docker inspect 2ac752d7aeb1
- # 如果跟容器ID可以查看到容器的ip等信息
- 格式:
- docker tag 源仓库名/源镜像名:[标签] 新仓库名/新镜像名:[新标签]
- 示例:
- [root@localhost ~]# docker tag nginx:latest nginx:web
- [root@localhost ~]# docker images | grep nginx
- REPOSITORY TAG IMAGE ID CREATED SIZE
- nginx latest 2ac752d7aeb1 5 days ago 188MB
- nginx web 2ac752d7aeb1 5 days ago 188MB
- # 在Docker中,docker tag 命令不是用来修改镜像的实际内容,而是给现有的镜像创建一个新的标签(tag)。
- 格式:
- docker rmi 仓库名称/镜像名称:标签 # 当一个镜像有多个标签时,只是删除其中指定的标签
- 或者
- docker rmi 镜像ID号 # 会彻底删除该镜像
- # 注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像
- 示例:
- [root@localhost ~]# docker rmi nginx:web
- Untagged: nginx:web
- [root@localhost ~]# docker images | grep nginx
- nginx latest 2ac752d7aeb1 5 days ago 188MB
① 存出镜像
- 将镜像保存成为本地文件:
- 格式:
- docker save -o 存储文件名(也可以写成xxx.tar) 仓库名/镜像名:标签
- 示例:
- [root@localhost ~]# docker save -o nginx nginx:latest
- [root@localhost ~]# ll -h | grep nginx
- -rw-------. 1 root root 183M 4月 22 23:41 nginx
② 载入镜像
- 将镜像文件导入到镜像库中:
- 格式:
- docker load < 存出的文件 或者:docker load -i 存出的文件
- 示例:
- docker load < nginx 或者:docker load -i nginx
- 默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
- 可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
- 在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。
-
- [root@localhost ~]# docker tag nginx:latest fangqianling/nginx:web
- # 添加新的标签时必须在前面加上自己的dockerhub的username
- docker login # 登录公共仓库
- Username:用户名
- password:密码
- 或者:
- login {-u 仓库用户名 -p 密码}
- [root@localhost ~]# docker push fangqianling/nginx:web # 上传镜像
- 访问https://hub.docker.com/查看Tags # 需要科学上网
就是将镜像加载到容器的过程。新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
- 格式:docker create [选项] 镜像
- 常用选项:
- -i:让容器开启标准输入
- -t:让 Docker 分配一个伪终端 tty
- -it :合起来实现和容器交互的作用,运行一个交互式会话 shell # 一般直接合起来用
-
- [root@localhost ~]# docker create -it nginx:latest /bin/bash
- # /bin/bash: 这是容器启动后执行的命令。这里指定的是启动一个Bash shell,这意味着当你启动这个容器时,你会进入一个Bash Shell环境,而不是直接启动Nginx服务
- [root@localhost ~]# docker ps -a # -a 选项可以显示所有的容器
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 1867e92522e6 nginx:latest "/docker-entrypoint.…" About a minute ago Created admiring_sammet
- 容器的ID号 加载的镜像 运行的程序 创建时间 当前的状态 端口映射 名称
- 格式:
- docker start 容器的ID/名称
- [root@localhost ~]# docker start 1867e92522e6
- 1867e92522e6
- [root@localhost ~]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 1867e92522e6 nginx:latest "/docker-entrypoint.…" 4 minutes ago Up 22 seconds 80/tcp admiring_sammet
可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。
注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。
在 Docker 中,容器中的第一个进程(PID=1)通常被视为容器的主进程。如果这个主进程退出,Docker 容器会认为其主进程已经停止运行,从而导致容器退出。这也意味着在 Docker 容器中应该运行一个守护进程或者类似的长期运行的进程,以确保容器保持运行状态。
举例说明:
- [root@localhost ~]# docker run -d --name t1 nginx:latest /bin/bash
- d15f2192a21e812c7cad0f255ef98ae902477eae7bf09c14ca01467f2dd52521
- [root@localhost ~]# docker run -d --name t2 -p 10000:80 nginx
- 149613f7406b12de516c5a81a5c5cb5564501ffc71d5a1a5d4648f745747ec4b
- [root@localhost ~]# docker run -itd --name t3 centos:7 /bin/bash
- 76bdc79e0e95272859174cfe68edcea2b24675ed549b43a901a20852c868dd86
- [root@localhost ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 76bdc79e0e95 centos:7 "/bin/bash" 8 seconds ago Up 7 seconds t3
- 149613f7406b nginx "/docker-entrypoint.…" 30 seconds ago Up 30 seconds 0.0.0.0:10000->80/tcp, :::10000->80/tcp t2
- d15f2192a21e nginx:latest "/docker-entrypoint.…" 38 seconds ago Exited (0) 38 seconds ago t1
- # 容器t1在启动时执行了/bin/bash命令,当这个命令执行完毕后,容器就会自动退出,因为在Docker中,容器的主进程(PID=1,守护进程)结束后,容器就会停止
当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:
- [root@localhost ~]# docker run centos:7 /usr/bin/bash -c ls /
- # docker run:在docker中运行一个容器
- # centos:7 名称:标签,是一个镜像
- # /usr/bin/bash:启动的shell
- # -c:后面的字符串作为命令
-
- [root@localhost ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 8a226e89f007 centos:7 "/usr/bin/bash -c ls…" 2 minutes ago Exited (0) 2 minutes ago quirky_pare
- 1867e92522e6 nginx:latest "/docker-entrypoint.…" 12 minutes ago Up 8 minutes 80/tcp admiring_sammet
- # 此时会发现创建了一个新容器并启动执行一条shell命令,之后就停止了
-
- 在后台持续运行 docker run 创建的容器:
- [root@localhost ~]# docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 49656 root 20 0 11692 1112 932 R 97.7 0.1 0:52.62 bash
- # 写了死循环可以看到cpu升高
- [root@localhost ~]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 4c25551aaf88 centos:7 "/usr/bin/bash -c 'w…" About a minute ago Up About a minute wonderful_elbakyan
-
- 创建容器并持续运行容器:
- [root@localhost ~]# docker run -itd --name test1 centos:7 /bin/bash
- # --name test1:给容器指定一个名称为 test1
- d226e95966f3e3f8e429c049efa8385f08109ce735e64b105d0508522b74f40c
- [root@localhost ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- d226e95966f3 centos:7 "/bin/bash" 5 seconds ago Up 4 seconds test1
- 8a226e89f007 centos:7 "/usr/bin/bash -c ls…" 7 minutes ago Exited (0) 7 minutes ago quirky_pare
- 1867e92522e6 nginx:latest "/docker-entrypoint.…" 17 minutes ago Up 13 minutes 80/tcp admiring_sammet
-
- 终止容器运行:
- 格式:docker stop 容器的ID/名称
- [root@localhost ~]# docker stop 4c25551aaf88
需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。进入容器前,确保容器正在运行。
- 格式:
- docker exec -it 容器ID/名称 /bin/bash
- [root@localhost ~]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- d226e95966f3 centos:7 "/bin/bash" 11 minutes ago Up 11 minutes test1
- 1867e92522e6 nginx:latest "/docker-entrypoint.…" 28 minutes ago Up 25 minutes 80/tcp admiring_sammet
- [root@localhost ~]# docker exec -it test1 /bin/bash
- [root@d226e95966f3 /]# ls
- anaconda-post.log dev home lib64 mnt proc run srv tmp var
- bin etc lib media opt root sbin sys usr
- [root@d226e95966f3 /]# exit
- exit
① created:已创建,还未运行的容器
② running:正在运行的容器
③ restarting:容器正在重启中
④ removeing:容器正在迁移中
⑤ paused:已暂停状态的容器,挂起
⑥ exited:停止状态的容器
⑦ dead:死亡,主要是操作系统出现异常或断电关机等有可能引发dead状态,不常见
① 宿主机复制到容器中
- echo abc123 > ~/test.txt
- [root@localhost ~]# docker cp ~/test.txt d226e95966f3:/opt/
- Successfully copied 2.05kB to d226e95966f3:/opt/
- [root@localhost ~]# docker exec -it test1 /bin/bash
- [root@d226e95966f3 /]# cat /opt/test.txt
- abc123
② 从容器复制文件到主机
- [root@localhost ~]# docker cp d226e95966f3:/opt/test.txt ~/newtest.txt
- Successfully copied 2.05kB to /root/newtest.txt
- [root@localhost ~]# cat newtest.txt
- abc123
导出与导入操作是对整个容器文件系统的打包和解压,不包含容器的元数据,适合用于简单的文件系统导出和导入。导出相当于迁移,容器内的数据可以保存到镜像中。
用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
① 导出
- 导出格式:
- docker export 容器ID/名称 > 文件名
- [root@localhost ~]# docker export d226e95966f3 > centos7.tar
- [root@localhost ~]# scp centos7.tar 192.168.190.108:/opt
② 导入
- 导入格式:
- cat 文件名 | docker import – 镜像名称:标签
- [root@localhost ~]# cd /opt
- [root@localhost opt]# cat centos7.tar | docker import - centos7:test
- sha256:7d96c1a4df3aa8393fc6a6be522bc594d7d92d6997af1aa39b2095710ee72e63
- [root@localhost opt]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- centos7 test 7d96c1a4df3a 22 seconds ago 204MB
- # 导入后会生成镜像,但不会创建容器
-
- 创建并启动容器,进入容器查看是否存在迁移的数据:
- [root@localhost opt]# docker run -itd centos7:test /bin/bash
- 3ddbcad05908a18d4e46e143db7b488d2670af35706cd29db282db37ae6cc5e6
- [root@localhost opt]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 3ddbcad05908 centos7:test "/bin/bash" 2 seconds ago Up 1 second naughty_williamson
- [root@localhost opt]# docker exec -it 3ddbcad05908 /bin/bash
- [root@3ddbcad05908 /]# cat /opt/test.txt
- abc123
- 格式:
- docker rm [-f] 容器ID/名称
- docker stop 容器ID/名称
- docker rm 容器ID/名称 #删除已经终止状态的容器
- docker rm -f 容器ID/名称 #强制删除正在运行的容器
- 示例:
- [root@localhost ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 4c25551aaf88 centos:7 "/usr/bin/bash -c 'w…" 51 minutes ago Exited (137) 49 minutes ago wonderful_elbakyan
- d226e95966f3 centos:7 "/bin/bash" 53 minutes ago Up 53 minutes test1
- 8a226e89f007 centos:7 "/usr/bin/bash -c ls…" About an hour ago Exited (0) About an hour ago quirky_pare
- 1867e92522e6 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp admiring_sammet
- [root@localhost ~]# docker rm 4c25551aaf88
- 4c25551aaf88
- [root@localhost ~]# docker rm 8a226e89f007
- 8a226e89f007
- [root@localhost ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- d226e95966f3 centos:7 "/bin/bash" 59 minutes ago Up 59 minutes test1
- 1867e92522e6 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp admiring_sammet
① 批量停止容器
- docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
- # docker stop后面加空格是为了确保在拼接命令时,docker stop和容器的ID之间有一个空格
- docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop
- 示例:
- [root@localhost ~]# docker run -itd --name test2 centos:7 /bin/bash
- f7bcc1a52b45c0f35da8f15645d099ccd1d9bcbfe15515784bb4b189a144cb0e
- [root@localhost ~]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- f7bcc1a52b45 centos:7 "/bin/bash" 3 seconds ago Up 2 seconds test2
- d226e95966f3 centos:7 "/bin/bash" About an hour ago Up About an hour test1
- 1867e92522e6 nginx:latest "/docker-entrypoint.…" About an hour ago Up About an hour 80/tcp admiring_sammet
- [root@localhost ~]# docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
- f7bcc1a52b45
- d226e95966f3
- 1867e92522e6
- # NR>=2 表示从第二行开始处理
- [root@localhost ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- f7bcc1a52b45 centos:7 "/bin/bash" 3 minutes ago Exited (137) About a minute ago test2
- d226e95966f3 centos:7 "/bin/bash" About an hour ago Exited (137) About a minute ago test1
- 1867e92522e6 nginx:latest "/docker-entrypoint.…" About an hour ago Exited (137) About a minute ago admiring_sammet
② 批量删除所有容器
- docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
- # docker rm后面加空格是为了确保在拼接命令时,docker rm和容器的ID之间有一个空格
- docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm
- 示例:
- [root@localhost ~]# docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
- f7bcc1a52b45
- d226e95966f3
- 1867e92522e6
- [root@localhost ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
③ 批量清理后台停止的容器
- docker rm [-f] $(docker ps -a -q)
- docker rm [-f] `docker ps -a -q`
- # -q:仅显示容器的 ID。
- # $(docker ps -a -q):通过子命令获取所有容器的 ID
类似的镜像也可以批量删除:
- docker images | awk 'NR>=2{print "docker rmi "$3}'| bash #批量删除镜像
- docker images | grep none | awk '{print $3}' | xargs docker rmi #删除none镜像
- 示例:比如从第三行开始批量删除
- 先下载一个apache的镜像
- [root@localhost ~]# docker search apache # 搜索关键字
- [root@localhost ~]# docker pull httpd # 获取镜像
- [root@localhost ~]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- nginx latest 2ac752d7aeb1 7 days ago 188MB
- httpd latest dabbfbe0c57b 2 years ago 144MB
- centos 7 eeb6ee3f44bd 2 years ago 204MB
- [root@localhost ~]# docker images | awk 'NR>=2{print "docker rmi "$3}'| bash
- [root@localhost ~]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- nginx latest 605c77e624dd 2 years ago 141MB
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。