格式调整

This commit is contained in:
heibaiying 2019-07-10 09:42:03 +08:00
parent 1a4cb35ee8
commit 11b76bb208

View File

@ -8,7 +8,7 @@
<a href="#五案例">五、案例</a><br/>
</nav>
# 一、Docker 简介
## 一、Docker 简介
Docker 是一个构建发布和运行应用程序的开放平台。Docker 以容器为资源分隔和调度的基本单位,容器封装了整个项目运行时所需要的所有环境,通过 Docker 你可以将应用程序与基础架构分离,像管理应用程序一样管理基础架构,以便快速完成项目的部署与交付。
@ -20,12 +20,12 @@ Docker 使用 Go 语言进行开发,基于 Linux 内核的 cgroupnamespace
下图体现了 Docker 和传统虚拟化方式的不同之处:传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,再在该系统上运行所需应用进程;而 Docker 容器内的应用进程则是直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟,因此要比传统虚拟机更为轻便。
<div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/docker与虚拟机.png"/> </div>
# 二、Docker 架构与核心概念
## 二、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 镜像
### 2.1 镜像
Docker 镜像Image是一个特殊的文件系统包含了程序运行时候所需要的资源和环境。镜像不包含任何动态数据其内容在构建之后也不会被改变。
@ -33,7 +33,7 @@ Docker 镜像Image是一个特殊的文件系统包含了程序运行
分层存储的特征使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
## 2.2 容器
### 2.2 容器
镜像Image和容器Container的关系就像是面向对象程序设计中的 `类``实例` 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
@ -43,36 +43,36 @@ Docker 镜像Image是一个特殊的文件系统包含了程序运行
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷Volume、或者绑定宿主目录在这些位置的读写会跳过容器存储层直接对宿主或网络存储发生读写其性能和稳定性更高。数据卷的生存周期独立于容器容器消亡数据卷不会消亡。因此使用数据卷后容器删除或者重新运行之后数据却不会丢失。
## 2.3 仓库
### 2.3 仓库
镜像构建完成后可以很容易的在当前宿主机上运行但如果需要在其它服务器上使用这个镜像就需要一个集中的存储、分发镜像的服务这就是镜像仓库Registry。[Docker Hub](https://hub.docker.com/) 是 Docker 官方提供的镜像公有仓库,提供了大量常用软件的镜像,当然出于安全和保密的需要,你也可以构建自己的私有仓库。
## 2.4 Docker daemon
### 2.4 Docker daemon
Docker daemondockerd负责监听 Docker API 请求并管理 Docker 对象,如镜像,容器,网络和卷,守护程序彼此之间也可以进行通讯。
## 2.5 Docker Client
### 2.5 Docker Client
Docker 客户端docker是用户与 Docker 交互的主要方式。当你使用 docker run 等命令时,客户端会将这些命令发送到 dockerddockerd 负责将其执行。一个 Docker客户端可以与多个 dockerd 进行通讯。
# 三、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>
## 2.1 基础命令
### 2.1 基础命令
- **docker version**:用于查看 docker 的版本信息
- **docker info**:用于查看 docker 的配置信息
- **docker help**:用于查看帮助信息
## 2.2 镜像相关命令
### 2.2 镜像相关命令
### 1. docker search 镜像名
#### 1. docker search 镜像名
从官方镜像仓库 Docker Hub 查找指定名称的镜像。常用参数为`--no-trunc`,代表显示完整的镜像信息。
### 2. docker images
#### 2. docker images
列出所有顶层镜像的相关信息。常用参数如下:
@ -81,17 +81,17 @@ Docker 提供了大量命令用于管理镜像、容器和服务,命令的统
- --digests :显示摘要信息
- --no-trunc :显示完整镜像信息
### 3. docker pull 镜像名 [:TAG]
#### 3. docker pull 镜像名 [:TAG]
从官方仓库下载镜像,`:TAG`为镜像版本,不加则默认下载最新版本。
### 4. docker rmi 镜像名或ID [:TAG]
#### 4. docker rmi 镜像名或ID [:TAG]
删除指定版本的镜像,不加`:TAG`则默认删除镜像的最新版本。如果有基于该镜像的容器存在,则该镜像无法直接删除,此时可以使用参数`-f`代表强制删除。rmi 命令支持批量删除,多个镜像名之间使用空格分隔。如果想要删除所有镜像,则可以使用命令`docker rmi -f $(docker images -qa)`
## 2.3 容器相关命令
### 1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
#### 1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
run 是 docker 中最为核心的一个命令,用于新建并启动容器,其拥有众多可用参数,可以使用`docker run --help`查看所有可用参数。常用参数如下:
@ -104,7 +104,7 @@ run 是 docker 中最为核心的一个命令,用于新建并启动容器,
+ -v :用于挂载数据卷 volume可以用多个`-v`参数同时挂载多个 volume。volume 的格式为:`[host-dir]:[container-dir]:[rw:ro]``[rw:ro]`用于指定数据卷的模式,`rw`代表读写模式,`ro`代表只读模式。
+ -p :用于将容器的端口暴露给宿主机的端口,格式为:`hostPort:containerPort`,通过端口的暴露,可以让外部主机能够访问容器内的应用。
### 2. docker ps [OPTIONS]
#### 2. docker ps [OPTIONS]
列出当前所有正在运行的容器。常用参数如下:
@ -113,29 +113,29 @@ run 是 docker 中最为核心的一个命令,用于新建并启动容器,
- -q :只显示容器编号
- --no-trunc :不要截断输出信息
### 3. 启动\重启\停止\强制停止容器
#### 3. 启动\重启\停止\强制停止容器
与容器启动、停止相关的命令为:`docker start|restart|stop|kill 容器名或ID`start 命令用于启动已有的容器restart 用于重启正在运行的容器stop 用于停止正在运行的容器kill 用于强制停止容器。
### 4. 进入正在运行的容器
#### 4. 进入正在运行的容器
想要进入正在运行的容器,与容器主进程交互,有以下两种常用方法:
+ docker attach 容器名或ID
+ docker exec -it 容器名或ID /bin/bash
### 5. 退出容器
#### 5. 退出容器
想要退出正在运行的容器,有以下两种常用方法:
+ exit :退出并停止容器;
+ ctrl+P+Q :退出。
### 6. docker rm 容器名或ID
#### 6. docker rm 容器名或ID
删除已停止的容器,常用参数为`-f`,表示强制删除容器,即便容器还在运行。想要删除所有容器,可以使用`docker rm -f $(docker ps -aq)`命令。
### 7. 查看容器信息
#### 7. 查看容器信息
可以使用`docker inspect [OPTIONS] NAME|ID [NAME|ID...]`查看容器或者镜像的详细信息,想要查看指定的信息,可以使用 `-- format`参数来指定输出的模板格式,示例如下:
@ -143,7 +143,7 @@ run 是 docker 中最为核心的一个命令,用于新建并启动容器,
docker inspect --format='{{.NetworkSettings}}' 32cb3ace3279
```
### 8. 查看容器运行日志
#### 8. 查看容器运行日志
可以使用`docker logs [OPTIONS] CONTAINER`查看容器中进程的运行日志,常用参数如下:
@ -154,36 +154,36 @@ docker inspect --format='{{.NetworkSettings}}' 32cb3ace3279
- --since :开始时间
- --until 结束时间
# 四、DockerFile
## 四、DockerFile
dockerfile 是 Docker 用来构建镜像的文本文件,包含自定义的指令和格式,可以通过 build 命令从 dockerfile 中构建镜像,命令格式为:`docker build [OPTIONS] PATH | URL | -`
dockerfile 描述了组装镜像的步骤,其中每条指令都是单独执行的。除了 FROM 指令,其他的每一条指令都会在上一条指令所生成镜像的基础上执行,执行完后会生成一个新的镜像层,新镜像层覆盖在原来的镜像之上从而形成新的镜像。为了提高镜像构建的速度, Docker Daemon 会缓存构建过程中的中间镜像。在构建镜像时,它会将 dockerfile 中下一条指令和基础镜像的所有子镜像做比较,如果有一个子镜像是由相同的指令生成的,则命中缓存,直接使用该镜像,而不用再生成一个新的镜像。常用指令如下:
## 1. FROM
### 1. FROM
FROM 指令用于指定基础镜像,因此所有的 dockerfile 都必须使用 FROM 指令开头。FROM 指令可以出现多次这样会构建多个镜像每个镜像创建完成后Docker 命令行界面会输出该镜像的 ID。常用指令格式为`FROM <image>[:<tag>] [AS <name>]`
## 2. MAINTAINER
### 2. MAINTAINER
MAINTAINER 指令可以用来设置作者名称和邮箱,目前 MAINTAINER 指令被标识为废弃,官方推荐使用 LABEL 代替。
## 3. LABEL
### 3. LABEL
LABEL 指令可以用于指定镜像相关的元数据信息。格式为:`LABEL <key>=<value> <key>=<value> <key>=<value> ...`
## 4. ENV
### 4. ENV
ENV 指令用于声明环境变量,声明好的环境变量可以在后面的指令中引用,引用格式为`$variable_name``${variable_name}`。常用格式有以下两种:
+ `ENV <key> <value>` :用于设置单个环境变量;
+ `ENV <key>=<value> ...` :用于一次设置多个环境变量。
## 5. EXPOSE
### 5. EXPOSE
EXPOSE 用于指明容器对外暴露的端口号,格式为:`EXPOSE <port> [<port>/<protocol>...]`,您可以指定端口是侦听 TCP 还是 UDP如果未指定协议则默认为 TCP。
## 6. WORKDIR
### 6. WORKDIR
WORKDIR 用于指明工作目录它可以多次使用。如果指明的是相对路径则它将相对于上一个WORKDIR指令的路径。示例如下
@ -194,15 +194,15 @@ WORKDIR c
RUN pwd # 此时pwd为/a/b/c
```
## 7. COPY
### 7. COPY
COPY 指令的常用格式为:`COPY <src>... <dest>`,用于将指定路径中的文件添加到新的镜像中,拷贝的目标路径可以不存在,程序会自动创建。
## 8. ADD
### 8. ADD
ADD 指令的常用格式为:`COPY <src>... <dest>`,作用与 COPY 指令类似,但功能更为强大,例如`Src`支持文件的网络地址,且如果`Src`指向的是压缩文件ADD 在复制完成后还会自动进行解压。
## 9. RUN
### 9. RUN
RUN 指令会在前一条命令创建出的镜像基础上再创建一个容器,并在容器中运行命令,在命令结束后提交该容器为新的镜像。它支持以下两种格式:
@ -211,7 +211,7 @@ RUN 指令会在前一条命令创建出的镜像基础上再创建一个容器
使用 shell 格式时候,命令通过`/bin/sh -c`运行,而当使用 exec 格式时,命令是直接运行的,容器不调用 shell 程序,这意味着不会发生正常的 shell 处理。例如,`RUN ["echo","$HOME"]`不会对`$HOME`执行变量替换,此时正确的格式应为:`RUN ["sh","-c","echo $HOME"]`。下面的 CMD 指令也存在同样的问题。
## 10. CMD
### 10. CMD
- `CMD ["executable","param1","param2"]` (*exec* 格式, 首选)
- `CMD ["param1","param2"]` (作为 *ENTRYPOINT* 的默认参数)
@ -219,7 +219,7 @@ RUN 指令会在前一条命令创建出的镜像基础上再创建一个容器
CMD 指令提供容器运行时的默认值,这些默认值可以是一条指令,也可以是一些参数。一个 dockerfile 中可以有多条 CMD 指令,但只有最后一条 CMD 指令有效。CMD 指令与 RUN 指令的命令格式相同但作用不同RUN 指令是在镜像的构建阶段用于产生新的镜像;而 CMD 指令则是在容器的启动阶段默认将 CMD 指令作为第一条执行的命令,如果用户在 docker run 时指定了新的命令参数,则会覆盖 CMD 指令中的命令。
## 11. ENTRYPOINT
### 11. ENTRYPOINT
ENTRYPOINT 指令 支持以下两种格式:
@ -235,9 +235,9 @@ CMD ["world"]
当执行`docker run -it image`后,此时输出为`hello world`,而当你执行`docker run -it image spring`,此时 CMD 中的参数会被覆盖,此时输出为`hello spring`
# 五、案例
## 五、案例
## 4.1 基于 Centos 镜像部署 Spring Boot 项目
### 4.1 基于 Centos 镜像部署 Spring Boot 项目
生产环境中的大多数项目通常都部署在 Linux 服务器上,这里我们从基础的 Linux 镜像开始,并将我们的项目(这里以 Spring Boot 项目为例)一起打包构建成为一个完整的可执行的镜像。首先需要创建**Dockerfile**文件,其内容如下:
@ -275,7 +275,7 @@ 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>
## 4.2 基于 JDK 镜像部署 Spring Boot 项目
### 4.2 基于 JDK 镜像部署 Spring Boot 项目
上面的项目我们是基于最基础的 Centos 镜像开始构建,但由于 Docker Hub 上已经提供了 JDK 的镜像,我们也可以选择从 JDK 镜像开始构建,此时构建过程更加简单。构建步骤和上面的完全一致,只是 Dockerfile 的内容有所不同,如下: