Skip to content

Commit

Permalink
update docker docs
Browse files Browse the repository at this point in the history
  • Loading branch information
fengzhao committed Nov 26, 2020
1 parent 1ff84bf commit 974537f
Showing 1 changed file with 206 additions and 7 deletions.
213 changes: 206 additions & 7 deletions docker/1、docker系列之docker容器入门.md
Original file line number Diff line number Diff line change
Expand Up @@ -677,6 +677,75 @@ bin dev etc home lib media mnt opt proc root run sbin srv sys tmp



## 操作容器

容器的启动方式有两种:

- 基于镜像新建一个容器并启动
- 将在终止状态(`stopped`)的容器重新启动。



```shell
# docker run
# Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# docker run [启动参数] 镜像 [镜像中的命令] [命令参数]
# 启动参数
-a, --attach
# 把指定的数据流(STDOUT,STDERR)连接到终端。若未指定,则默认链接stdout和stderr。若数据流未指定,而容器以交互模式(-i)启动,则stdin也会被连接至终端。
# 此选项与-d不兼容。
-d, --detach
# 使容器在“分离”模式下运行。容器会在后台运行,而命令的返回值是容器的ID。
-i,--interactive
# 保持stdin打开(即使它没有被连接至终端)。一般与-t同时使用。用作启动交互式会话的容器。例如: docker run -it debian /bin/bash
-t,--tty
# 分配一个伪终端,通常与-i使用,用来启动交互式容器
--rm
# 容器退出时自动删除容器,不能与选项-d同时使用。
-h,--hostname NAME
# 设置容器的主机名为NAME。例如:docker run -h "myhost" debian
--name NAME
# 设置容器的名称。以后其他docker命令可以使用这个名称来标识这个容器。
-v hostdir:containerdir
```









容器重新启动





### 容器启动策略

docker run 有容器自动启动策略,当容器退出时可以自动再启动容器。

容器重启策略,可以让一组关联的容器按照相关顺序启动,docker 推荐给容器配上重启策略。

重启是通过 docker start



## 网络概述
Expand Down Expand Up @@ -980,8 +1049,6 @@ docker-compose up -d --scale redis=2





docker 镜像是以 layer 概念存在的,一层一层的叠加,最终成为我们需要的镜像。

但该镜像的每一层都是 `ReadOnly` 只读的。只有在我们运行容器的时候才会创建读写层。文件系统的隔离使得:
Expand All @@ -1000,25 +1067,25 @@ docker 为我们提供了三种不同的方式将数据挂载到容器中:volu

#### volume 方式

volume 是数据卷
volume 是数据卷,一个可供一个或多个容器使用的特殊目录,

volume 方式是 docker 中数据持久化的最佳方式。

- volume 可以通过 `docker volume` 进行管理,如创建、删除等操作。

- docker 默认会在主机上(`/var/lib/docker/volumes/` )存放 volume。
- 非 docker 进程不应该去修改该区域
- 非 docker 进程不应该去修改该区域的文件
- 当 volumes 被 mount 进 容器时,有点像 bind network 一样。一个 volume 可以同时被多个 container mount

- 有点像 Linux 文件系统里面的 mount
- volume 在生成的时候如果不指定名称,会随机生成名称。
- 在容器停止或删除时,volume 会继续存在,如需删除需要显示声明。

```shell
$ ls /var/lib/docker/volumes
ff664768bfe64e1a8cae4369dd4a2e1929362e29580735480290684e38c8f140
ffa4846b581c1a50a01e7a12a6342ad2aaa442701a35ae56ef2f0e5d7888b22c
```

- volume 在容器停止或删除的时候会继续存在,如需删除需要显示声明。
-

```shell
$ docker rm -v <container_id>
Expand Down Expand Up @@ -1858,6 +1925,138 @@ docker push registry.cn-hangzhou.aliyuncs.com/fengzhao/etcd:3.4.9-1



## docker 日志最佳实践



Docker 日志分为两类:

- docker engine 的日志
- dockerd 守护进程一般是交由 systemd 来管理,所以 docker engine 的日志可以通过 journalctl -u docker 来查看

- 容器内的日志
- 容器我们理解为一个普通的进程,进程就会有标准输入输出。





docker logs container 可以查看一个容器的日志,准确来说,这个命令是将容器进程的标准输出和标准错误重定向到标准输出(即当前终端)



在生产环境,如果应用的标准输出重定向到日志文件里,所以我们在使用 docker logs 一般收集不到太多重要的日志信息。

当日志量比较大的时候,我们使用 docker logs 来查看日志,会对 docker daemon 造成比较大的压力,容器导致容器创建慢等一系列问题。



### docker日志驱动



```shell
# docker daemon 一般会配置一个默认的日志驱动

# 查看当前daemon的默认驱动
docker info | grep "Logging Driver"


docker inspect -f '{{.HostConfig.LogConfig.Type}}' containerID







```



#### local日志驱动

`local` 日志驱动 记录从容器的 `STOUT/STDERR` 的输出,并写到宿主机的磁盘。

默认情况下,local 日志驱动为每个容器保留 100MB 的日志信息,并启用自动压缩来保存。(经过测试,保留100MB 的日志是指没有经过压缩的日志)

local 日志驱动的储存位置 `/var/lib/docker/containers/容器id/local-logs/container.log`

```json
// /etc/docker/daemon.json

{
"log-driver": "local",
"log-opts": {
"max-size": "10m", // 切割之前日志的最大大小,可取值为(k,m,g), 默认为20m
"max-file": "5", // 可以存在的最大日志文件数。如果超过最大值,则会删除最旧的文件。**仅在max-size设置时有效。默认为5。
"compress": "enable", // 是否压缩,默认开启
}
}
```



```shell
# 运行一个后台容器 ,并设定日志驱动为local ,并运行命令 ping www.baidu.com

docker run -itd --log-driver local --name ping_test alpine ping www.baidu.com

# 查看容器日志驱动
docker inspect -f '{{.HostConfig.LogConfig.Type}}' ping_test

# 查看日志文件
ls -al /var/lib/docker/containers/ping_test_container_id/local-logs/



```



#### json-file 驱动

`json-file` 日志驱动 记录从容器的 `STOUT/STDERR` 的输出 ,用 JSON 的格式写到文件中,日志中不仅包含着 输出日志,还有时间戳和 输出格式。

下面是一行 `ping www.baidu.com` 对应的 JSON 日志:

```json
{
"log":"64 bytes from 104.193.88.123: seq=678 ttl=55 time=10.308 ms\r\n",
"stream":"stdout",
"time":"2020-11-26T03:50:39.104632506Z"
}
```

`json-file` 的 日志驱动支持以下选项:

| 选项 | 描述 | 示例值 |
| :---------- | :----------------------------------------------------------- | :--------------------------------------- |
| `max-size` | 切割之前日志的最大大小。可取值单位为(k,m,g), 默认为-1(表示无限制)。 | `--log-opt max-size=10m` |
| `max-file` | 可以存在的最大日志文件数。如果切割日志会创建超过阈值的文件数,则会删除最旧的文件。**仅在max-size设置时有效。**正整数。默认为1。 | `--log-opt max-file=3` |
| `labels` | 适用于启动Docker守护程序时。此守护程序接受的以逗号分隔的与日志记录相关的标签列表。 | `--log-opt labels=production_status,geo` |
| `env` | 适用于启动Docker守护程序时。此守护程序接受的以逗号分隔的与日志记录相关的环境变量列表。 | `--log-opt env=os,customer` |
| `env-regex` | 类似于并兼容`env`。用于匹配与日志记录相关的环境变量的正则表达式。 | `--log-opt env-regex=^(os|customer).` |
| `compress` | 切割的日志是否进行压缩。默认是`disabled`| `--log-opt compress=true` |



json-file 日志的路径位于 `/var/lib/docker/containers/container_id/container_id-json.log`







### 生产环境如何存储容器中的日志







# kubernetes


Expand Down

0 comments on commit 974537f

Please sign in to comment.