什么是容器?

容器提供了在计算机上的隔离环境中安装和运行应用程序的方法。在容器内运行的应用程序仅可使用于为该容器分配的资源,例如: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 虚拟机,然后在虚拟机内运行容器。

容器

  1. 启动 sudo systemctl start docker
  2. 守护进程重启 sudo systemctl daemon-reload
  3. 重启docker服务 sudo systemctl restart docker
  4. 重启docker服务 sudo service docker restart
  5. 关闭docker sudo service docker stop
  6. 关闭docker sudo systemctl stop docker

systemctl使用

centos 使用 service 命令替代systemctl

  1. docker ps // 查看所有正在运行容器
  2. docker stop containerId // containerId 是容器的ID
  3. docker ps -a // 查看所有容器
  4. docker ps -a -q // 查看所有容器ID
  5. docker start $(docker ps -a -q) // start启动所有停止的容器
  6. docker stop $(docker ps -a -q) // stop停止所有容器
  7. docker rm $(docker ps -a -q) // remove删除所有容器
  1. 列出所有容器ID
  2. docker ps -aq
  3. 查看所有运行或者不运行容器
  4. docker ps -a
  5. 停止所有的container(容器),这样才能够删除其中的images
  6. docker stop $(docker ps -a -q) 或者 docker stop $(docker ps -aq)
  7. 如果想要删除所有container(容器)的话再加一个指令:
  8. docker rm $(docker ps -a -q) 或者 docker rm $(docker ps -aq)
  9. 查看当前有些什么images
  10. docker images
  11. 删除images(镜像),通过imageid来指定删除谁
  12. docker rmi <image id>
  13. 想要删除untagged images,也就是那些id为的image的话可以用
  14. docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
  15. 要删除全部image(镜像)的话
  16. docker rmi $(docker images -q)
  17. 强制删除全部image的话
  18. docker rmi -f $(docker images -q)
  19. 从容器到宿主机复制
  20. docker cp tomcat:/webapps/js/text.js /home/admin
  21. docker cp 容器名: 容器路径 宿主机路径
  22. 从宿主机到容器复制
  23. docker cp /home/admin/text.js tomcat:/webapps/js
  24. docker cp 宿主路径中文件 容器名 容器路径
  25. 删除所有停止的容器
  26. docker container prune
  27. 删除所有不使用的镜像
  28. docker image prune --force --all或者docker image prune -f -a
  29. 停止、启动、杀死、重启一个容器
  30. docker stop Name或者ID
  31. docker start Name或者ID
  32. docker kill Name或者ID
  33. docker restart name或者ID
  34. docker进入容器,查看配置文件
  35. docker exec :在运行的容器中执行命令
  36. -d :分离模式: 在后台运行
  37. -i :即使没有附加也保持STDIN(标准输入) 打开,以交互模式运行容器,通常与 -t 同时使用;
  38. -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  39. docker exec -it f94d2c317477 /bin/bash
  40. 出现root@f94d2c317477:/usr/share/elasticsearch/config# vi elasticsearch.yml
  41. bash: vi: command not found
  42. apt-get update && apt-get install vim -y
  43. 修改配置、退出容器
  44. 1、如果要正常退出不关闭容器,请按Ctrl+P+Q进行退出容器
  45. 2、如果使用exit退出,那么在退出之后会关闭容器,可以使用下面的流程进行恢复
  46. 使用docker restart命令重启容器
  47. 使用docker attach命令进入容器