docker 入门


1. dcoker 环境安装

在本机玩docker,到官网,使用的环境是mac

2.docker 容器和镜像

docker镜像在我的理解中就是一个小型的linux系统的压缩包,而容器就是根据这个压缩包启动一个Linux环境,在制作镜像的时候你可以给这个Linux系统安装好多的工具和环境,比如GCC,vim,node……
当制作好一个镜像后然后启动这个镜像就形成了一个docker容器,ok 现在你可以进入这个容器了,里面有根据你的镜像形成的环境。

2.1. docker镜像的制作

大多数的时候我们可以去dokerhub上寻找需要的,然后pull。根据基础镜像搭建自己的镜像那就需要书写Dockerfile了,其实这个文件和Makefile有点像,书写好之后docker build 一下就好啦

2.1.1 Dockerfile

Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# VERSION    1.0.0 

FROM daocloud.io/node:5 #基于哪个镜像

# 指定端口
ENV HTTP_PORT 8000

# 复制当前文件夹中的所有文件到镜像中的 /genee-wechat 中,指定启动容器时的工作目录也就是cd命令
COPY . /genee-wechat
WORKDIR /genee-wechat

# 安装软件用
RUN npm --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/dist install \
&& npm install gulp -g

EXPOSE 8000

# container启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.
CMD ["npm", "start"]
  • 创建镜像docker build -t <镜像名> <Dockerfile路径> 比如:

如Dockerfile在当前路径: docker build -t xx/gitlab .

以下是常用的的和镜像有关的几个命令
  • 拉取镜像
1
2
docker pull <镜像名:tag>
docker pull node:0.12.5
  • 查看已经拉取得镜像
1
docker images
  • 删除镜像
1
docker rmi xxx:tag

docker 容器

  • 根据镜像创建自己的docker容器并启动
1
docker run --name jimscx.node -i -t -p 9003:9000 -p 9013:9010 -d -v /User/home:/home node

–name 指定容器的名字 -p端口映射(容器外的端口:容器里的端口)可以有多个端口映射只是不要和别的容器的冲突就好 -i表示同步container的stdin,-t表示同步container的输出,-d表示deamon,以后台启动这个container -v:目录映射 (容器外的目录:容器里边的目录) 最后是镜像的名字

  • 进入自己创建的容器

docker exec -it xxx bash

xxx便是容器的名字

  • 查看正在运行的容器
1
2
docker ps
docker ps -a为查看所有的容器,包括已经停止的。
  • 查看容器详情
1
docker inspect 镜像 ID(镜像名)/ 容器 ID(容器名) 
  • 查看容log
1
docker logs --tail 50 -f xxxx 
  • 删除单个容器
1
docker rm <容器名orID>
  • 停止、启动、杀死一个容器
1
2
3
docker stop <容器名orID>
docker start <容器名orID>
docker kill <容器名orID>

docker日志收集

日志驱动设置

要将docker 配置为默认的日志驱动程序,请使用--log-driver=<VALUE>选项。如果驱动程序有可配置的选项,则可以使用一个或多个--log-opt<NAME>=<VALUE>来进行设置。 如果你没有指定日志驱动,那么默认是json-file, 日志存放的地址是:
/var/lib/docker/containers/容器id/容器id-json.log

Driver Description
Driver Description
none 无日志
json-file 将日志写入json-file,默认值
syslog 将日志写入syslog,syslog必须在机器上启动
journald 将日志写入journald,journald必须在机器上启动
gelf 将日志写入GELF端点,如Graylog或Logstash
fluentd 将日志吸入fluentd,fluentd必须在机器上启动。
awslogs 将日志写入亚马逊Cloudwatch
splunk 使用HTTP事件收集器将日志写入splunk
etwlogs 将日志消息作为windows时间跟踪。仅在windows平台可用
gcplogs 将日志写入Google云平台
nats 将日志发布到NATS服务器

更详细的配置config

需要注意的几点
  • docker logs命令不能用于json-filejournald之外的日志驱动

  • 给容器打tag

1
--log-opt tag=xxxx
  • log-drive的几个选项,特别是异步的选项,因为如果没有设置为异步,fluentd挂了,容器就挂了。

  • 日志轮换,避免磁盘溢出。

1
--log-driver=json-file --log-opt max-size=10m --log-opt max-file=5。(文件超过10M将被轮换,最多保留5个文件)

收集方案

  1. 容器外收集。将主机磁盘挂在为容器中的日志目录和文件。主机上做日志收集。
  2. 日志容器收集。运行一个日志收集容器,连接到应用容器,共享日志卷,日志容器中收集日志。
  3. 容器内收集。在应用容器内运行一个后台日志收集服务,收集日志。
  4. 网络收集。容器内应用将日志通过网络直接发送给日志中心。
  5. 网络收集。将容器的--log-driver 设置为syslog, splunk, fluentd等网络收集服务,日志将直接通过网络发送。

第三种方式违反一个容器只运行一个应用的方式,不推荐采取。相比之下推荐第一种。

使用logstash收集日志方案

启动logstash 容器

1
2
3
4
5
6
7
8
docker run \
--name log_collect \
-v /var/log/journal:/var/log/journal:ro \
-v /var/lib/docker/containers/:/var/lib/docker/containers/ \
-v /usr/local/logstash/logstash_to_kafka.conf:/opt/log.conf \
-v /usr/local/logstash/hosts:/etc/hosts \
thingswise/logstash-journald:1.5.2 logstash -f /opt/log.conf

logstash 测试配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
input {
file {
path => "/mnt/sda1/var/lib/docker/containers/cfaac78077d3286e9c533272ed643da3eb006a389e3e94e3b9ded8b2ac5625be/cfaac78077d3286e9c533272ed643da3eb006a389e3e94e3b9ded8b2ac5625be-json.log"
type => "jym-log"
delimiter => "}"
}
}

filter {

grok {
match => {
"message" => "{\"log\": \"%{GREEDYDATA:syslog_log}\",\"stream\":\"%{GREEDYDATA:syslog_stream}\",\"time\":\"%{TIMESTAMP_ISO8601:syslog_time}\"}"

}

}

syslog_pri { }

date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}

output {
file {
path => '/root/test_log.log'
}
}

查看到日志被写到/root/test_log.log 文件中

elk 收集日志

参考地址


文章作者: Callable
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Callable !
评论
  目录