docker基础

This commit is contained in:
罗祥 2019-08-26 10:57:26 +08:00
parent 28142334b9
commit e3f196fb66

View File

@ -14,19 +14,17 @@ Docker 是一个构建发布和运行应用程序的开放平台。Docker 以
Docker 使用 Go 语言进行开发,基于 Linux 内核的 cgroupnamespace以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。最初实现是基于 LXC从 0.7 版本以后开始去除 LXC转而使用自行开发的 libcontainer从 1.11 开始,则进一步演进为使用 runC 和 containerd。
- runc :是一个 Linux 命令行工具,用于根据 [OCI容器运行时规范](https://github.com/opencontainers/runtime-spec) 创建和运行容器。
- containerd :是一个守护程序,它管理容器生命周期,提供了在一个节点上执行容器和管理镜像的最小功能集。
- **runc** :是一个 Linux 命令行工具,用于根据 [OCI容器运行时规范](https://github.com/opencontainers/runtime-spec) 创建和运行容器。
- **containerd** :是一个守护程序,它管理容器生命周期,提供了在一个节点上执行容器和管理镜像的最小功能集。
下图体现了 Docker 和传统虚拟化方式的不同之处:传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,再在该系统上运行所需应用进程;而 Docker 容器内的应用进程则是直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟,因此要比传统虚拟机更为轻便。
<div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/docker与虚拟机.png"/> </div>
## 二、Docker 架构与核心概念
Docker 使用 client-server 架构, Docker 客户端将命令发送给 Docker 守护进程,后者负责构建,运行和分发 Docker 容器。 Docker客户端和守护程序使用 REST API通过 UNIX 套接字或网络接口进行通信。核心概念如下:
<div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/docker架构.png"/> </div>
### 2.1 镜像
Docker 镜像Image是一个特殊的文件系统包含了程序运行时候所需要的资源和环境。镜像不包含任何动态数据其内容在构建之后也不会被改变。
@ -62,7 +60,6 @@ Docker 客户端docker是用户与 Docker 交互的主要方式。当你
Docker 提供了大量命令用于管理镜像、容器和服务,命令的统一使用格式为:` docker [OPTIONS] COMMAND` ,其中 OPTIONS 代表可选参数。需要注意的是 Docker 命令的执行一般都需要获取 root 权限,这是因为 Docker 的命令行工具 docker 与 docker daemon 是同一个二进制文件docker daemon 负责接收并执行来自 docker 的命令,它的运行需要 root 权限。所有常用命令及其使用场景如下:
<div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/docker常用命令.jpg"/> </div>
### 3.1 基础命令
- **docker version**:用于查看 docker 的版本信息
@ -79,10 +76,10 @@ Docker 提供了大量命令用于管理镜像、容器和服务,命令的统
列出所有顶层镜像的相关信息。常用参数如下:
- -a :显示所有镜像,包括中间隐藏的镜像
- -q :只显示镜像 ID
- --digests :显示摘要信息
- --no-trunc :显示完整镜像信息
- **-a** :显示所有镜像,包括中间隐藏的镜像
- **-q** :只显示镜像 ID
- **--digests** :显示摘要信息
- **--no-trunc** :显示完整镜像信息
#### 3. docker pull 镜像名 [:TAG]
@ -98,23 +95,23 @@ Docker 提供了大量命令用于管理镜像、容器和服务,命令的统
run 是 docker 中最为核心的一个命令,用于新建并启动容器,其拥有众多可用参数,可以使用`docker run --help`查看所有可用参数。常用参数如下:
+ -i :表示使用交互模式,始终保持输入流开放;
+ -t :表示分配一个伪终端,通常和`-i`结合使用,表示使用伪终端与容器进行交互;
+ -d :以后台方式运行容器;
+ --name :指定容器启动容器的名字,如果不指定,则由 docker 随机分配;
+ -c :用于给运行在容器中的所有进程分配 CPU 的 shares 值,这是一个相对权重,实际的处理速度与宿主机的 CPU 相关;
+ -m 用于限制为容器中所有进程分配的内存总量以B、K、M、G为单位
+ -v :用于挂载数据卷 volume可以用多个`-v`参数同时挂载多个 volume。volume 的格式为:`[host-dir]:[container-dir]:[rw:ro]``[rw:ro]`用于指定数据卷的模式,`rw`代表读写模式,`ro`代表只读模式。
+ -p :用于将容器的端口暴露给宿主机的端口,格式为:`hostPort:containerPort`,通过端口的暴露,可以让外部主机能够访问容器内的应用。
+ **-i** :表示使用交互模式,始终保持输入流开放;
+ **-t** :表示分配一个伪终端,通常和`-i`结合使用,表示使用伪终端与容器进行交互;
+ **-d** :以后台方式运行容器;
+ **--name** :指定容器启动容器的名字,如果不指定,则由 docker 随机分配;
+ **-c** :用于给运行在容器中的所有进程分配 CPU 的 shares 值,这是一个相对权重,实际的处理速度与宿主机的 CPU 相关;
+ **-m** 用于限制为容器中所有进程分配的内存总量以B、K、M、G为单位
+ **-v** :用于挂载数据卷 volume可以用多个`-v`参数同时挂载多个 volume。volume 的格式为:`[host-dir]:[container-dir]:[rw:ro]``[rw:ro]`用于指定数据卷的模式,`rw`代表读写模式,`ro`代表只读模式。
+ **-p** :用于将容器的端口暴露给宿主机的端口,格式为:`hostPort:containerPort`,通过端口的暴露,可以让外部主机能够访问容器内的应用。
#### 2. docker ps [OPTIONS]
列出当前所有正在运行的容器。常用参数如下:
- -a :列出所有容器,包括运行的和已经停止的所有容器
- -n :显示最近创建的 n 个容器
- -q :只显示容器编号
- --no-trunc :不要截断输出信息
- **-a** :列出所有容器,包括运行的和已经停止的所有容器
- **-n** :显示最近创建的 n 个容器
- **-q** :只显示容器编号
- **--no-trunc** :不要截断输出信息
#### 3. 启动\重启\停止\强制停止容器
@ -131,8 +128,8 @@ run 是 docker 中最为核心的一个命令,用于新建并启动容器,
想要退出正在运行的容器,有以下两种常用方法:
+ exit :退出并停止容器;
+ ctrl+P+Q :退出。
+ **exit** :退出并停止容器;
+ **ctrl+P+Q** :退出。
#### 6. docker rm 容器名或ID
@ -150,12 +147,12 @@ docker inspect --format='{{.NetworkSettings}}' 32cb3ace3279
可以使用`docker logs [OPTIONS] CONTAINER`查看容器中进程的运行日志,常用参数如下:
- --details :显示日志详情
- -f :跟随日志输出显示
- --tail :从末尾开始显示指定行的数据
- -t :显示时间戳
- --since :开始时间
- --until 结束时间
- **--details** :显示日志详情
- **-f** :跟随日志输出显示
- **--tail** :从末尾开始显示指定行的数据
- **-t** :显示时间戳
- **--since** :开始时间
- **--until** 结束时间
## 四、DockerFile
@ -278,7 +275,6 @@ docker run -it -p 8080:8080 spring-boot-base-java
这里为了观察到启动效果,所以使用交互的方式启动,实际部署时可以使用`-d`参数来后台启动,输出如下:
<div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/dockerfile01.png"/> </div>
### 5.2 基于 JDK 镜像部署 Spring Boot 项目
上面的项目我们是基于最基础的 Centos 镜像开始构建,但由于 Docker Hub 上已经提供了 JDK 的镜像,我们也可以选择从 JDK 镜像开始构建,此时构建过程更加简单。构建步骤和上面的完全一致,只是 Dockerfile 的内容有所不同,如下: