@@ -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-
9851052docker 镜像是以 layer 概念存在的,一层一层的叠加,最终成为我们需要的镜像。
9861053
9871054但该镜像的每一层都是 ` ReadOnly ` 只读的。只有在我们运行容器的时候才会创建读写层。文件系统的隔离使得:
@@ -1000,25 +1067,25 @@ docker 为我们提供了三种不同的方式将数据挂载到容器中:volu
10001067
10011068#### volume 方式
10021069
1003- volume 是数据卷
1070+ volume 是数据卷,一个可供一个或多个容器使用的特殊目录,
10041071
10051072volume 方式是 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
10171084ff664768bfe64e1a8cae4369dd4a2e1929362e29580735480290684e38c8f140
10181085ffa4846b581c1a50a01e7a12a6342ad2aaa442701a35ae56ef2f0e5d7888b22c
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