[Docker 2] 容器核心知识概述

  • 第二章 容器核心知识概述
  • 2.1 什么是容器?
  • 2.2 容器的优势
  • 2.3 容器的工作原理
  • 2.3.1 Docker 的架构和核心组件
  • 2.3.2 Docker 客户端
  • 2.3.3 Docker 服务器
  • 2.3.4 Docker 服务器允许远程访问
  • 2.3.5 Docker 镜像
  • 2.3.6 Docker 容器
  • 2.3.7 Docker 镜像仓 - Registry
  • 2.3.8 一个完整的例子


第二章 容器核心知识概述

2.1 什么是容器?

Docker 容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。Docker 将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统。开发人员在自己笔记本上创建并测试好的容器,无须任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。

容器由两部分组成:(1)应用程序本身;(2)依赖:比如应用程序需要的库或其他软件容器在 Host 操作系统(产系统的虚拟机、物理服务器或公有云主机)的用户空间中运行,与操作系统的其他进程隔离

2.2 容器的优势

  • 轻量级,快速启动和迁移
  • 可以打包任何软件及其依赖
  • 容器无须修改便可运行在几乎所有的平台上
  • 资源、网络、库都是隔离的,不会出现依赖问题
  • 提供 run、start、stop 等标准化操作,非常适合自动化
  1. 对于开发人员:Build Once、Run Anywhere
    容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可以在其他机器上运行。另外,容器环境与所在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。
  2. 对于运维人员:Configure Once、Run Anything
    只需要配置好标准的 runtime 环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效、一致和可重复。容器消除了开发、测试、生存环境的不一致性。

2.3 容器的工作原理

2.3.1 Docker 的架构和核心组件

  • Docker 客户端:Client
  • Docker 服务器:Docker daemon
  • Docker 镜像:Image
  • Docker 镜像仓:Registry
  • Docker 容器:Container

Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。Docker 架构如下图:

docker容器内解压tar docker容器理解_linux

2.3.2 Docker 客户端

Host 上输入docker 可以方便查看 docker 的命令。

[root@CentOS7 ~]# docker

Usage:	docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default "/root/.docker")
...

Management Commands:
  builder     Manage builds
...

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
...

Run 'docker COMMAND --help' for more information on a command.

2.3.3 Docker 服务器

Docker daemon 是服务器组件,以 Linux 后台服务的方式运行,负责创建、运行、监控容器,构建、存储镜像。说白了,就是一个后台服务进程。

systemctl status docker
or
systemctl status docker.service

[root@CentOS7 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: `active (running)` since Sat 2020-07-18 19:19:18 CST; 1min 25s ago
     Docs: https://docs.docker.com
 Main PID: 5245 (dockerd)
   Memory: 125.1M
   CGroup: /system.slice/docker.service
           └─5245 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

2.3.4 Docker 服务器允许远程访问

Docker daemon 默认只能 响应本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听,步骤如下:

(1)修改配置文件:

**Ubuntu:**vim /etc/systemd/system/multi-user.target.wants/docker.service

**CentOS:**vim /lib/systemd/system/docker.service

在环境变量 ExecStart 后面添加 -H tcp://0.0.0.0[:port],允许来自任意 IP 客户端连接。

[Service]
# ExecStart=/usr/bin/dockerd -H fd:// --		
# 修改为:
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0
# 指定端口:
# ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2222

(2)重启 Docker daemon

systemctl daemon-reload
systemctl restart docker.service
# ss -lt | grep 2222	# 查看监听端口

(3)客户端远程连接服务器

# 服务器IP为 192.168.2.144,info 用于查看 Docker 服务器的信息
docker -H 192.168.2.144 info

2.3.5 Docker 镜像

Docker 镜像看成只读模版,通过它可以创建 Docker 容器。

例如某个镜像可能包含一个 Ubuntu 操作系统、一个 Apache HTTP Server 以及用户开发的 Web 应用。

2.3.6 Docker 容器

Docker 容器就是 Docker 镜像的运行实例。

用户可以通过 CLI (Docker)或是 API 启动、停止、移动或删除容器。可以这么认为,对于应用软件,镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶段。

2.3.7 Docker 镜像仓 - Registry

Registry 是存放 Docker 镜像的仓库,Registry 分私有和公有两种。

Docker Hub (https://hub.docker.com/)是默认的Registry,由 Docker 公司维护,上面有数以万计的镜像,用户可以自由下载和使用。

出于对速度或安全的考虑,用户也可以创建自己的私有 Registry。后面我们会学习如何搭建私有 Registry。

docker pull 命令可以从 Registry 下载镜像。

docker run 命令则是先下载镜像(如果本地没有),然后再启动容器。

2.3.8 一个完整的例子

# 后台运行一个 httpd 容器。-d 指定后台运行 -p 指定端口映射
[root@CentOS7 ~]# docker run -d -p 8888:8888 httpd
Unable to find image 'httpd:latest' locally			# 本地未发现 httpd 镜像
latest: Pulling from library/httpd					# 从 library/httpd 拉取 最新的 httpd 镜像
8559a31e96f4: Already exists
bd517d441028: Pull complete 		# 拉取
f67007e59c3c: Pull complete 
83c578481926: Pull complete 
f3cbcb88690d: Pull complete 
Digest: sha256:387f896f9b6867c7fa543f7d1a686b0ebe777ed13f6f11efc8b94bec743a1e51
Status: Downloaded newer image for httpd:latest		# 下载完成,镜像 httpd 被保存到本地,latest 代表最新版
9ccf7d1be502e06bef0cf0cba65dab00abf6ff35c1fc57d27bd47180c4404678	# ID:镜像的 "长ID",前12个字符代表镜像的 "短ID"

# 查看下载的所有镜像
[root@CentOS7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               latest              ccbcea8a6757        5 weeks ago         166MB

# 查看运行中的容器
[root@CentOS7 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                            NAMES
9ccf7d1be502        httpd               "httpd-foreground"   5 minutes ago       Up 5 minutes        80/tcp, 0.0.0.0:8888->8888/tcp   happy_fermi

声明:该篇博文,仅记录个人学习笔记,详细内容参考《每天5分钟玩转Docker容器技术.CloudMan》。如有侵权,请告知删除。