什么是容器?
容器提供了在计算机上的隔离环境中安装和运行应用程序的方法。在容器内运行的应用程序仅可使用于为该容器分配的资源,例如:CPU,内存,磁盘,进程空间,用户,网络,卷等。在使用有限的容器资源的同时,并不与其他容器冲突。您可以将容器视为简易计算机上运行应用程序的隔离沙箱。
这个概念听起来很熟悉,有些类似于虚拟机。但它们有一个关键的区别:容器使用的一种非常不同的,轻量的技术来实现资源隔离。容器利用了底层 Linux 内核的功能,而不是虚拟机采用的 hypervisor 的方法。换句话说,容器调用 Linux 命令来分配和隔离出一组资源,然后在此空间中运行您的应用程序。我们快速来看下两个这样的功能:
Namespaces(命名空间)
简单的讲就是,Linux namespace 允许用户在独立进程之间隔离 CPU 等资源。进程的访问权限及可见性仅限于其所在的 Namespaces 。因此,用户无需担心在一个 Namespace 内运行的进程与在另一个 Namespace 内运行的进程冲突。甚至可以同一台机器上的不同容器中运行具有相同 PID 的进程。同样的,两个不同容器中的应用程序可以使用相同的端口。
Cgroups(Control Groups 控制组)
Cgroups 允许对可用资源设置限制和约束。例如,您可以在一台拥有 16 G 内存的计算机上创建一个 Namespace ,限制其内部进程可用内存为 1 GB。
到这,您可能已经猜到 Docker 的工作原理了。当您请求 Docker 运行容器时,Docker 会在您的计算机上设置一个资源隔离的环境。然后 Docker 会将打包的应用程序和关联的文件复制到 Namespace 内的文件系统中,此时环境的配置就完成了。之后 Docker 会执行您指定的命令运行应用程序。
简而言之,Docker 通过使用 Linux namespace 和 cgroup(以及其他一些命令)来协调配置容器,将应用程序文件复制到为容器分配的磁盘,然后运行启动命令。Docker 还附带了许多其他用于管理容器的工具,例如:列出正在运行的容器,停止容器,发布容器镜像等许多其他工具。
与虚拟机相比,容器更轻量且速度更快,因为它利用了 Linux 底层操作系统在隔离的环境中运行。虚拟机的 hypervisor 创建了一个非常牢固的边界,以防止应用程序突破它,而容器的边界不那么强大。另一个区别是,由于 Namespace 和 Cgroups 功能仅在 Linux 上可用,因此容器无法在其他操作系统上运行。此时您可能想知道 Docker 如何在 macOS 或 Windows 上运行? Docker 实际上使用了一个技巧,并在非 Linux 操作系统上安装 Linux 虚拟机,然后在虚拟机内运行容器。
容器
启动 sudo systemctl start docker
守护进程重启 sudo systemctl daemon-reload
重启docker服务 sudo systemctl restart docker
重启docker服务 sudo service docker restart
关闭docker sudo service docker stop
关闭docker sudo systemctl stop docker
systemctl使用
centos 使用 service 命令替代systemctl
docker ps // 查看所有正在运行容器
docker stop containerId // containerId 是容器的ID
docker ps -a // 查看所有容器
docker ps -a -q // 查看所有容器ID
docker start $(docker ps -a -q) // start启动所有停止的容器
docker stop $(docker ps -a -q) // stop停止所有容器
docker rm $(docker ps -a -q) // remove删除所有容器
列出所有容器ID
docker ps -aq
查看所有运行或者不运行容器
docker ps -a
停止所有的container(容器),这样才能够删除其中的images:
docker stop $(docker ps -a -q) 或者 docker stop $(docker ps -aq)
如果想要删除所有container(容器)的话再加一个指令:
docker rm $(docker ps -a -q) 或者 docker rm $(docker ps -aq)
查看当前有些什么images
docker images
删除images(镜像),通过image的id来指定删除谁
docker rmi <image id>
想要删除untagged images,也就是那些id为的image的话可以用
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
要删除全部image(镜像)的话
docker rmi $(docker images -q)
强制删除全部image的话
docker rmi -f $(docker images -q)
从容器到宿主机复制
docker cp tomcat:/webapps/js/text.js /home/admin
docker cp 容器名: 容器路径 宿主机路径
从宿主机到容器复制
docker cp /home/admin/text.js tomcat:/webapps/js
docker cp 宿主路径中文件 容器名 容器路径
删除所有停止的容器
docker container prune
删除所有不使用的镜像
docker image prune --force --all或者docker image prune -f -a
停止、启动、杀死、重启一个容器
docker stop Name或者ID
docker start Name或者ID
docker kill Name或者ID
docker restart name或者ID
docker进入容器,查看配置文件
docker exec :在运行的容器中执行命令
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN(标准输入) 打开,以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
docker exec -it f94d2c317477 /bin/bash
出现root@f94d2c317477:/usr/share/elasticsearch/config# vi elasticsearch.yml
bash: vi: command not found
apt-get update && apt-get install vim -y
修改配置、退出容器
1、如果要正常退出不关闭容器,请按Ctrl+P+Q进行退出容器
2、如果使用exit退出,那么在退出之后会关闭容器,可以使用下面的流程进行恢复
使用docker restart命令重启容器
使用docker attach命令进入容器