Skip to content

Commit 974537f

Browse files
committed
update docker docs
1 parent 1ff84bf commit 974537f

File tree

1 file changed

+206
-7
lines changed

1 file changed

+206
-7
lines changed

docker/1、docker系列之docker容器入门.md

Lines changed: 206 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,75 @@ bin dev etc home lib media mnt opt proc root run sbin srv sys tmp
677677

678678

679679

680+
## 操作容器
681+
682+
容器的启动方式有两种:
683+
684+
- 基于镜像新建一个容器并启动
685+
- 将在终止状态(`stopped`)的容器重新启动。
686+
687+
688+
689+
```shell
690+
# docker run
691+
692+
# Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
693+
694+
# docker run [启动参数] 镜像 [镜像中的命令] [命令参数]
695+
696+
# 启动参数
697+
698+
-a, --attach
699+
# 把指定的数据流(STDOUT,STDERR)连接到终端。若未指定,则默认链接stdout和stderr。若数据流未指定,而容器以交互模式(-i)启动,则stdin也会被连接至终端。
700+
# 此选项与-d不兼容。
701+
702+
703+
-d, --detach
704+
# 使容器在“分离”模式下运行。容器会在后台运行,而命令的返回值是容器的ID。
705+
706+
707+
-i,--interactive
708+
# 保持stdin打开(即使它没有被连接至终端)。一般与-t同时使用。用作启动交互式会话的容器。例如: docker run -it debian /bin/bash
709+
-t,--tty
710+
# 分配一个伪终端,通常与-i使用,用来启动交互式容器
711+
712+
--rm
713+
# 容器退出时自动删除容器,不能与选项-d同时使用。
714+
715+
-h,--hostname NAME
716+
# 设置容器的主机名为NAME。例如:docker run -h "myhost" debian
717+
718+
--name NAME
719+
# 设置容器的名称。以后其他docker命令可以使用这个名称来标识这个容器。
720+
721+
722+
-v hostdir:containerdir
723+
724+
725+
```
726+
727+
728+
729+
730+
731+
732+
733+
734+
735+
容器重新启动
736+
737+
738+
739+
740+
741+
### 容器启动策略
742+
743+
docker run 有容器自动启动策略,当容器退出时可以自动再启动容器。
744+
745+
容器重启策略,可以让一组关联的容器按照相关顺序启动,docker 推荐给容器配上重启策略。
746+
747+
重启是通过 docker start
748+
680749

681750

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

9811050

9821051

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

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

10011068
#### volume 方式
10021069

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

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

10071074
- volume 可以通过 `docker volume` 进行管理,如创建、删除等操作。
1008-
10091075
- docker 默认会在主机上(`/var/lib/docker/volumes/` )存放 volume。
1010-
- 非 docker 进程不应该去修改该区域
1076+
- 非 docker 进程不应该去修改该区域的文件
10111077
- 当 volumes 被 mount 进 容器时,有点像 bind network 一样。一个 volume 可以同时被多个 container mount
1012-
1078+
- 有点像 Linux 文件系统里面的 mount
10131079
- volume 在生成的时候如果不指定名称,会随机生成名称。
1080+
- 在容器停止或删除时,volume 会继续存在,如需删除需要显示声明。
10141081

10151082
```shell
10161083
$ ls /var/lib/docker/volumes
10171084
ff664768bfe64e1a8cae4369dd4a2e1929362e29580735480290684e38c8f140
10181085
ffa4846b581c1a50a01e7a12a6342ad2aaa442701a35ae56ef2f0e5d7888b22c
10191086
```
10201087

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

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

18591926

18601927

1928+
## docker 日志最佳实践
1929+
1930+
1931+
1932+
Docker 日志分为两类:
1933+
1934+
- docker engine 的日志
1935+
- dockerd 守护进程一般是交由 systemd 来管理,所以 docker engine 的日志可以通过 journalctl -u docker 来查看
1936+
1937+
- 容器内的日志
1938+
- 容器我们理解为一个普通的进程,进程就会有标准输入输出。
1939+
1940+
1941+
1942+
1943+
1944+
docker logs container 可以查看一个容器的日志,准确来说,这个命令是将容器进程的标准输出和标准错误重定向到标准输出(即当前终端)
1945+
1946+
1947+
1948+
在生产环境,如果应用的标准输出重定向到日志文件里,所以我们在使用 docker logs 一般收集不到太多重要的日志信息。
1949+
1950+
当日志量比较大的时候,我们使用 docker logs 来查看日志,会对 docker daemon 造成比较大的压力,容器导致容器创建慢等一系列问题。
1951+
1952+
1953+
1954+
### docker日志驱动
1955+
1956+
1957+
1958+
```shell
1959+
# docker daemon 一般会配置一个默认的日志驱动
1960+
1961+
# 查看当前daemon的默认驱动
1962+
docker info | grep "Logging Driver"
1963+
1964+
1965+
docker inspect -f '{{.HostConfig.LogConfig.Type}}' containerID
1966+
1967+
1968+
1969+
1970+
1971+
1972+
1973+
```
1974+
1975+
1976+
1977+
#### local日志驱动
1978+
1979+
`local` 日志驱动 记录从容器的 `STOUT/STDERR` 的输出,并写到宿主机的磁盘。
1980+
1981+
默认情况下,local 日志驱动为每个容器保留 100MB 的日志信息,并启用自动压缩来保存。(经过测试,保留100MB 的日志是指没有经过压缩的日志)
1982+
1983+
local 日志驱动的储存位置 `/var/lib/docker/containers/容器id/local-logs/container.log`
1984+
1985+
```json
1986+
// /etc/docker/daemon.json
1987+
1988+
{
1989+
"log-driver": "local",
1990+
"log-opts": {
1991+
"max-size": "10m", // 切割之前日志的最大大小,可取值为(k,m,g), 默认为20m
1992+
"max-file": "5", // 可以存在的最大日志文件数。如果超过最大值,则会删除最旧的文件。**仅在max-size设置时有效。默认为5。
1993+
"compress": "enable", // 是否压缩,默认开启
1994+
}
1995+
}
1996+
```
1997+
1998+
1999+
2000+
```shell
2001+
# 运行一个后台容器 ,并设定日志驱动为local ,并运行命令 ping www.baidu.com
2002+
2003+
docker run -itd --log-driver local --name ping_test alpine ping www.baidu.com
2004+
2005+
# 查看容器日志驱动
2006+
docker inspect -f '{{.HostConfig.LogConfig.Type}}' ping_test
2007+
2008+
# 查看日志文件
2009+
ls -al /var/lib/docker/containers/ping_test_container_id/local-logs/
2010+
2011+
2012+
2013+
```
2014+
2015+
2016+
2017+
#### json-file 驱动
2018+
2019+
`json-file` 日志驱动 记录从容器的 `STOUT/STDERR` 的输出 ,用 JSON 的格式写到文件中,日志中不仅包含着 输出日志,还有时间戳和 输出格式。
2020+
2021+
下面是一行 `ping www.baidu.com` 对应的 JSON 日志:
2022+
2023+
```json
2024+
{
2025+
"log":"64 bytes from 104.193.88.123: seq=678 ttl=55 time=10.308 ms\r\n",
2026+
"stream":"stdout",
2027+
"time":"2020-11-26T03:50:39.104632506Z"
2028+
}
2029+
```
2030+
2031+
`json-file` 的 日志驱动支持以下选项:
2032+
2033+
| 选项 | 描述 | 示例值 |
2034+
| :---------- | :----------------------------------------------------------- | :--------------------------------------- |
2035+
| `max-size` | 切割之前日志的最大大小。可取值单位为(k,m,g), 默认为-1(表示无限制)。 | `--log-opt max-size=10m` |
2036+
| `max-file` | 可以存在的最大日志文件数。如果切割日志会创建超过阈值的文件数,则会删除最旧的文件。**仅在max-size设置时有效。**正整数。默认为1。 | `--log-opt max-file=3` |
2037+
| `labels` | 适用于启动Docker守护程序时。此守护程序接受的以逗号分隔的与日志记录相关的标签列表。 | `--log-opt labels=production_status,geo` |
2038+
| `env` | 适用于启动Docker守护程序时。此守护程序接受的以逗号分隔的与日志记录相关的环境变量列表。 | `--log-opt env=os,customer` |
2039+
| `env-regex` | 类似于并兼容`env`。用于匹配与日志记录相关的环境变量的正则表达式。 | `--log-opt env-regex=^(os|customer).` |
2040+
| `compress` | 切割的日志是否进行压缩。默认是`disabled`| `--log-opt compress=true` |
2041+
2042+
2043+
2044+
json-file 日志的路径位于 `/var/lib/docker/containers/container_id/container_id-json.log`
2045+
2046+
2047+
2048+
2049+
2050+
2051+
2052+
### 生产环境如何存储容器中的日志
2053+
2054+
2055+
2056+
2057+
2058+
2059+
18612060
# kubernetes
18622061

18632062

0 commit comments

Comments
 (0)