zabbix可用微信报警脚本(基于微信企业版)

我隐去了一些认证信息,其余自行修改使用:

#!/usr/bin/python
# -*- coding: utf-8 -*-

#Author:fencatn
#Alert for wechat

import requests
import json
import sys

def Get_Token(Corpid,Secret):
url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
values = {
"corpid":隐藏, #企业Id,对应'CorpID'
"corpsecret":隐藏 #新建应用对应'Secret'
}
req = requests.post(url, params=values)
data = json.loads(req.text)
Token = data["access_token"]
return Token


def Send_Message(Token,Toparty,Agentid,Content):
url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
data = {
#"touser": Touser, #成员ID列表,指定为@all,则向关注该企业应用的全部成员发送,对应通讯录'账号'字段
"toparty": 1, #部门ID列表,对应部门的'部门ID'字段
"msgtype": "text", #消息类型,该字段非空
"agentid": 1000002, #企业应用的id,整型,非空,对应新建应用的'AgentId'
"text": {
"content":Content #消息内容,非空
},
"safe":"0" #表示是否是保密消息,0表示否,1表示是,默认0
}
res = requests.post(url,json=data)
return res.text

if __name__ == '__main__':
#Touser = sys.argv[1]
Toparty = sys.argv[1] #web前端传过来的部门id
Content = sys.argv[2] #web前端传过来的告警内容
Corpid = "wwcd48c5c121b31438"
Secret = "填写secret"
Agentid = "你的部门号是多少就写多少"

Token = Get_Token(Corpid,Secret)
print Get_Token(Corpid,Secret)
print Send_Message(Token,Toparty,Agentid,Content)
发表在 zabbix | 标签为 | 留下评论

jenkins脚本-jar包脚本

脚本1:(包名我隐去了)

#! /bin.bash
# by fencatn
echo "Stopping SpringBoot Application"
jarfile=file.jar
#指定启动的配置文件是dev/test/pro
export SPRING_PROFILES_ACTIVE=test
pid=`ps -ef | grep $jarfile | grep -v grep | awk '{print $2}'`
echo $pid
echo "--------kill start--------------"
if [ -n "$pid" ]
then
echo "kill -9 的pid:" $pid
kill -9 $pid
fi
echo "--------kill finish-----------------"
echo "--------replace start--------------"
DATE=$(date +%Y%m%d%H%M%S)
mv /root/xxx/$jarfile /usr/local/project/xxx/$jarfile.$DATE.bak
mv /usr/local/project/xxx/$jarfile /root/xxx
echo "--------replace finish-----------------"
echo "Execute shell Finish"
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.3.7-0.el7_6.x86_64
echo "Executing program....."
nohup ${JAVA_HOME}/bin/java -jar /root/xxx/$jarfile &>/root/xxx/$DATE.nohup.log &

脚本2:(先占个座先)

发表在 jenkins | 标签为 | 留下评论

jenkins脚本-war包脚本

脚本1:(这个脚本路径被我处理了一下,用的时候自己修改下;start.sh 无非就是个启动tomcat的脚本)

#!/bin/bash
#deploy war to tomcat
#by fencatn
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.3.7-0.el7_6.x86_64
TOMCAT_PID=`/usr/sbin/lsof -n -P -t -i :8081`
TOMCAT_DIR="/usr/share/tomcat/webapps/"
FILES="files.war"
DES_DIR="/des_dir/"
DES_URL="des_url"
BAK_DIR="/data/backup/`date +%Y%m%d-%H%M`"
[ -n "$TOMCAT_PID" ] && kill -9 $TOMCAT_PID
cd $DES_DIR
rm -rf $FILES
mkdir -p $BAK_DIR;\cp -a $DES_DIR/* $BAK_DIR/
rm -rf $DES_DIR/*
wget $DES_URL/$FILES
${JAVA_HOME}/bin/java  -xvf  $FILES
####################
cd $TOMCAT_DIR;rm -rf work
/bin/sh $TOMCAT_DIR/bin/start.sh
sleep 10
tail -n 50 $TOMCAT_DIR/logs/nohup.out

 

脚本2:(定义newwarfil是为了把传上来的包重新命名成一个统一的名字,方便管理,你自己看着办)

#!/bin/bash
#deploy war to tomcat
#by fencatn
warfile=files.war
newwarfile=root.war
pidlist=`ps -ef|grep tomcat|grep -v "grep"|awk '{print $2}'`
DATE=$(date +%Y%m%d%H%M%S)
function stop(){
if [ "$pidlist" == "" ]
then
echo "----tomcat已经关闭----" 
else
echo "旧的tomcat 进程号 :$pidlist"
kill -9 $pidlist
echo "KILL $pidlist:"
fi
}
stop

#确认一下pid是否成功杀掉
pidlist2=`ps -ef|grep tomcat|grep -v "grep"|awk '{print $2}'`
if [ "$pidlist2" == "" ]
then 
echo "----关闭旧的tomcat成功----"
else
echo "----关闭旧的tomcat失败----"
fi

mv /usr/share/tomcat/webapps/$warfile /usr/local/project/$DATE.$warfile.bak
rm -r -f /usr/share/tomcat/webapps/*
sleep 3s
cp -r /usr/local/project/$warfile /usr/share/tomcat/webapps/
mv /usr/share/tomcat/webapps/$warfile /usr/share/tomcat/webapps/$newwarfile
/usr/sbin/tomcat start

#最后确认一下新的pid
pidlist3=`ps -ef|grep tomcat|grep -v "grep"|awk '{print $2}'`
if [ "$pidlist3" == "" ]
then 
echo "----启动新的tomcat失败----"
else
echo "----新的tomcat的进程号是:$pidlist3----"
fi

 

脚本3:(先占个座)

 

发表在 jenkins | 标签为 | 留下评论

感受docker build过程

这篇日志只是让你感受下制作镜像的过程,并不是详细介绍,后面有专门的文档来介绍制作镜像的各种办法。

docker build 命令用于使用 Dockerfile 创建镜像。

语法

docker build [OPTIONS] PATH | URL | -

OPTIONS说明:

  • –build-arg=[] :设置镜像创建时的变量;
  • –cpu-shares :设置 cpu 使用权重;
  • –cpu-period :限制 CPU CFS周期;
  • –cpu-quota :限制 CPU CFS配额;
  • –cpuset-cpus :指定使用的CPU id;
  • –cpuset-mems :指定使用的内存 id;
  • –disable-content-trust :忽略校验,默认开启;
  • -f :指定要使用的Dockerfile路径;
  • –force-rm :设置镜像过程中删除中间容器;
  • –isolation :使用容器隔离技术;
  • –label=[] :设置镜像使用的元数据;
  • -m :设置内存最大值;
  • –memory-swap :设置Swap的最大值为内存+swap,”-1″表示不限swap;
  • –no-cache :创建镜像的过程不使用缓存;
  • –pull :尝试去更新镜像的新版本;
  • –quiet, -q :安静模式,成功后只输出镜像 ID;
  • –rm :设置镜像成功后删除中间容器;
  • –shm-size :设置/dev/shm的大小,默认值是64M;
  • –ulimit :Ulimit配置。
  • –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
  • –network: 默认 default。在构建期间设置RUN指令的网络模式

示例:做个简单的mysql-client,你可以理解成把mysql-client封装到docker里面的方法

先写个Dockerfile

[root@localhost dockerfile]# vim Dockerfile 
[root@localhost dockerfile]# cat Dockerfile 
FROM alpine:3.1
RUN apk add --update mysql-client && rm -rf /var/cache/apk/*
ENTRYPOINT ["mysql"]

然后执行创建命令

[root@localhost dockerfile]# docker build -t mysql-client .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM alpine:3.1
---> a1038a41fe2b
Step 2/3 : RUN apk add --update mysql-client && rm -rf /var/cache/apk/*
---> Running in 858db1c410a7
fetch http://dl-cdn.alpinelinux.org/alpine/v3.1/main/x86_64/APKINDEX.tar.gz
(1/4) Installing mysql-common (5.5.44-r0)
(2/4) Installing ncurses-terminfo-base (5.9-r3)
(3/4) Installing ncurses-libs (5.9-r3)
(4/4) Installing mysql-client (5.5.44-r0)
Executing busybox-1.22.1-r15.trigger
OK: 30 MiB in 19 packages
Removing intermediate container 858db1c410a7
---> 9db8c24f2c24
Step 3/3 : ENTRYPOINT ["mysql"]
---> Running in 870c91336bf1
Removing intermediate container 870c91336bf1
---> 93d76ebc1d92
Successfully built 93d76ebc1d92
Successfully tagged mysql-client:latest
[root@localhost dockerfile]# 
Message from syslogd@localhost at Jul 5 09:19:29 ...
kernel:unregister_netdevice: waiting for lo to become free. Usage count = 1

查看一下刚才创建的镜像,可以看到,封装出来才30M左右

[root@localhost dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql-client latest 93d76ebc1d92 7 minutes ago 30.3MB
alpine latest 4d90542f0623 2 weeks ago 5.58MB
ubuntu 14.04 2c5e00d77a67 7 weeks ago 188MB
registry 2 f32a97de94e1 3 months ago 25.8MB
alpine 3.1 a1038a41fe2b 5 months ago 5.05MB
hello-world latest fce289e99eb9 6 months ago 1.84kB

注意观察日志输出:

2019-07-05T09:15:35.581089641+08:00 container create 858db1c410a73253059bdef7faaa0bf5827ab98e5b3a68030de5ab3086e9c679 (image=sha256:a1038a41fe2b75d8c53d0a4d22207e4e7f72e95a11da4d20424f0062b239b67f, name=condescending_feistel)
2019-07-05T09:15:35.581221519+08:00 container attach 858db1c410a73253059bdef7faaa0bf5827ab98e5b3a68030de5ab3086e9c679 (image=sha256:a1038a41fe2b75d8c53d0a4d22207e4e7f72e95a11da4d20424f0062b239b67f, name=condescending_feistel)
2019-07-05T09:15:35.623012360+08:00 network connect 05475ea368337254dea611bfff0a86005befb5ea3da6e3bb6b7b3d40bbe4e33e (container=858db1c410a73253059bdef7faaa0bf5827ab98e5b3a68030de5ab3086e9c679, name=bridge, type=bridge)
2019-07-05T09:15:36.453502785+08:00 container start 858db1c410a73253059bdef7faaa0bf5827ab98e5b3a68030de5ab3086e9c679 (image=sha256:a1038a41fe2b75d8c53d0a4d22207e4e7f72e95a11da4d20424f0062b239b67f, name=condescending_feistel)
2019-07-05T09:16:45.084592028+08:00 container die 858db1c410a73253059bdef7faaa0bf5827ab98e5b3a68030de5ab3086e9c679 (exitCode=0, image=sha256:a1038a41fe2b75d8c53d0a4d22207e4e7f72e95a11da4d20424f0062b239b67f, name=condescending_feistel)
2019-07-05T09:16:45.148975295+08:00 network disconnect 05475ea368337254dea611bfff0a86005befb5ea3da6e3bb6b7b3d40bbe4e33e (container=858db1c410a73253059bdef7faaa0bf5827ab98e5b3a68030de5ab3086e9c679, name=bridge, type=bridge)
2019-07-05T09:16:45.480769746+08:00 container destroy 858db1c410a73253059bdef7faaa0bf5827ab98e5b3a68030de5ab3086e9c679 (image=sha256:a1038a41fe2b75d8c53d0a4d22207e4e7f72e95a11da4d20424f0062b239b67f, name=condescending_feistel)
2019-07-05T09:16:45.533218805+08:00 container create 870c91336bf1c010b9094015c73a48f13622736f534e0190cc1aaa30bde36fc9 (image=sha256:9db8c24f2c243ca6b454750f14842893cc76ef259ee121f50f4e6c2f1e72e250, name=priceless_keldysh)
2019-07-05T09:16:45.622090501+08:00 container destroy 870c91336bf1c010b9094015c73a48f13622736f534e0190cc1aaa30bde36fc9 (image=sha256:9db8c24f2c243ca6b454750f14842893cc76ef259ee121f50f4e6c2f1e72e250, name=priceless_keldysh)
2019-07-05T09:16:45.626378980+08:00 image tag sha256:93d76ebc1d92b961dad408a98df49bb20e70dffe311676763beb9f7dffc08eeb (name=mysql-client:latest)

Message from syslogd@localhost at Jul 5 09:19:29 ...
kernel:unregister_netdevice: waiting for lo to become free. Usage count = 1
发表在 Docker | 标签为 | 留下评论

ntp授时服务器列表(可用)

找到个好用的网站,自己去看

http://www.ntp.org.cn/index.php

国内节点可用cn.ntp.org.cn

阿里的自带有6个

ntp1.aliyun.com
ntp2.aliyun.com
ntp3.aliyun.com
ntp4.aliyun.com
ntp5.aliyun.com
ntp6.aliyun.com
ntp7.aliyun.com

发表在 NTP | 标签为 | 留下评论

docker基础镜像alpine

alpine是面向安全应用的轻量级linux发行版本,拖下来看一下

[root@localhost ~]# docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
921b31ab772b: Pull complete
Digest: sha256:ca1c944a4f8486a153024d9965aafbe24f5723c1d5c02f4964c045a16d19dc54
Status: Downloaded newer image for alpine:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 4d90542f0623 2 weeks ago 5.58MB
ubuntu 14.04 2c5e00d77a67 7 weeks ago 188MB
registry 2 f32a97de94e1 3 months ago 25.8MB
hello-world latest fce289e99eb9 6 months ago 1.84kB

这个镜像很小,只有几M

运行这个镜像,进去看看有哪些命令

[root@localhost ~]# docker run --rm -it alpine sh
/ # ls
bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
/ # cd bin/
/bin # ls
arch date fdflush kbd_mode mknod ping6 setpriv umount
ash dd fgrep kill mktemp pipe_progress setserial uname
base64 df fsync link more printenv sh usleep
bbconfig dmesg getopt linux32 mount ps sleep watch
busybox dnsdomainname grep linux64 mountpoint pwd stat zcat
cat dumpkmap gunzip ln mpstat reformime stty
chgrp echo gzip login mv rev su
chmod ed hostname ls netstat rm sync
chown egrep ionice lzop nice rmdir tar
conspy false iostat makemime pidof run-parts touch
cp fatattr ipcalc mkdir ping sed true
/bin # [root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ddca7736b585 alpine "sh" About a minute ago Up About a minute romantic_wiles
e37529b58640 registry:2 "/entrypoint.sh /etc…" About an hour ago Up About an hour 0.0.0.0:5000->5000/tcp registry
5fb08267227e ubuntu:14.04 "/bin/bash" 2 hours ago Up 2 hours ubuntu_4
be9d5c6f2a25 ubuntu:14.04 "/bin/bash" 3 hours ago Up 3 hours ubuntu_3
dca3d42e5e3e ubuntu:14.04 "/bin/bash" 3 hours ago Exited (0) 3 hours ago ubuntu_2
7103a04f97d3 ubuntu:14.04 "/bin/bash" 5 hours ago Up 5 hours ubuntu
[root@localhost ~]# 
删除容器试一下,报错没有退出,然后使用stop退出
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ddca7736b585 alpine "sh" About a minute ago Up About a minute romantic_wiles
e37529b58640 registry:2 "/entrypoint.sh /etc…" About an hour ago Up About an hour 0.0.0.0:5000->5000/tcp registry
5fb08267227e ubuntu:14.04 "/bin/bash" 3 hours ago Up 3 hours ubuntu_4
be9d5c6f2a25 ubuntu:14.04 "/bin/bash" 3 hours ago Up 3 hours ubuntu_3
dca3d42e5e3e ubuntu:14.04 "/bin/bash" 3 hours ago Exited (0) 3 hours ago ubuntu_2
7103a04f97d3 ubuntu:14.04 "/bin/bash" 5 hours ago Up 5 hours ubuntu
[root@localhost ~]# docker rm ddca
Error response from daemon: You cannot remove a running container ddca7736b58589d96d2af216edf9488be1baab2ab5a3d7a122f871f128a14446. Stop the container before attempting removal or force remove
[root@localhost ~]# docker stop ddca
ddca

可以发现,停止容器后,容器就被删除了,这是因为我们创建的时候指定了-rm选项,所以退出就删除了,这个过程,可以结合events来观察

2019-07-05T00:48:43.917483851+08:00 image pull alpine:latest (name=alpine)
2019-07-05T00:49:33.746443011+08:00 container create ddca7736b58589d96d2af216edf9488be1baab2ab5a3d7a122f871f128a14 name=romantic_wiles)
2019-07-05T00:49:33.748899933+08:00 container attach ddca7736b58589d96d2af216edf9488be1baab2ab5a3d7a122f871f128a14 name=romantic_wiles)
2019-07-05T00:49:33.789490362+08:00 network connect 05475ea368337254dea611bfff0a86005befb5ea3da6e3bb6b7b3d40bbe4e37736b58589d96d2af216edf9488be1baab2ab5a3d7a122f871f128a14446, name=bridge, type=bridge)
2019-07-05T00:49:34.479785409+08:00 container start ddca7736b58589d96d2af216edf9488be1baab2ab5a3d7a122f871f128a144name=romantic_wiles)
2019-07-05T00:49:34.485932045+08:00 container resize ddca7736b58589d96d2af216edf9488be1baab2ab5a3d7a122f871f128a14age=alpine, name=romantic_wiles, width=132)
##新建容器,并启动
2019-07-05T00:51:25.794561487+08:00 container kill ddca7736b58589d96d2af216edf9488be1baab2ab5a3d7a122f871f128a14446 (image=alpine, name=romantic_wiles, signal=15)
2019-07-05T00:51:35.841292955+08:00 container kill ddca7736b58589d96d2af216edf9488be1baab2ab5a3d7a122f871f128a14446 (image=alpine, name=romantic_wiles, signal=9)
2019-07-05T00:51:36.322103770+08:00 container die ddca7736b58589d96d2af216edf9488be1baab2ab5a3d7a122f871f128a14446 (exitCode=137, image=alpine, name=romantic_wiles)
2019-07-05T00:51:36.408362193+08:00 network disconnect 05475ea368337254dea611bfff0a86005befb5ea3da6e3bb6b7b3d40bbe4e33e (container=ddca7736b58589d96d2af216edf9488be1baab2ab5a3d7a122f871f128a14446, name=bridge, type=bridge)
2019-07-05T00:51:36.436651884+08:00 container stop ddca7736b58589d96d2af216edf9488be1baab2ab5a3d7a122f871f128a14446 (image=alpine, name=romantic_wiles)
2019-07-05T00:51:36.438911920+08:00 container destroy ddca7736b58589d96d2af216edf9488be1baab2ab5a3d7a122f871f128a14446 (image=alpine, name=romantic_wiles)
##停止容器,可以看到使用的是kill,因为加了-rm选项,所以退出就删除了这个容器
发表在 Docker | 标签为 | 留下评论

docker查看镜像信息

这里我们用inspect来查看镜像的详细信息:

[root@localhost ~]# docker inspect ubuntu:14.04
[
{
"Id": "sha256:2c5e00d77a67934d5e39493477f262b878f127b9c01b491f06d8f06f78819578",
"RepoTags": [
"ubuntu:14.04"
],
"RepoDigests": [
"ubuntu@sha256:2f7c79927b346e436cc14c92bd4e5bd778c3bd7037f35bc639ac1589a7acfa90"
],
"Parent": "",
"Comment": "",
"Created": "2019-05-15T21:21:13.96007615Z",
"Container": "0da171ebca7c967d1bc6e8bb0bc12658c5b2c8cc242c9c86f503dae0684a5cc7",
"ContainerConfig": {
"Hostname": "0da171ebca7c",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"/bin/bash\"]"
],
"ArgsEscaped": true,
"Image": "sha256:a0e29d6506d3d6bde4f245645bfce94e023175da5b3a7148e7a1e5b1cdf2ab42",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "18.06.1-ce",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"ArgsEscaped": true,
"Image": "sha256:a0e29d6506d3d6bde4f245645bfce94e023175da5b3a7148e7a1e5b1cdf2ab42",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 188195735,
"VirtualSize": 188195735,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/f1ce38d27bf85c64a91d2610e41abe786102add90f473e78d67e6484ba16dcc2/diff:/var/lib/docker/overlay2/1b08fc557849915df74ab00bb5713f1a60acc1840a64761b00f0bbf120a8764f/diff:/var/lib/docker/overlay2/110c2f7213e0c2dfcf85bba64cf55013d025b67989b7ba462bfb4fe965be2f5a/diff",
"MergedDir": "/var/lib/docker/overlay2/df358c4c61da87acfd356cc080f55378fe1d0810d6bcc876181f5b96f3c56743/merged",
"UpperDir": "/var/lib/docker/overlay2/df358c4c61da87acfd356cc080f55378fe1d0810d6bcc876181f5b96f3c56743/diff",
"WorkDir": "/var/lib/docker/overlay2/df358c4c61da87acfd356cc080f55378fe1d0810d6bcc876181f5b96f3c56743/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:b057ab380990c219581e3b074919413ebe31079cbd0d615f63872c471b4dc633",
"sha256:46c1a22ffea5a01eaa8ee679a13536a88e11a85921d83e141abd495be842740b",
"sha256:48334332ed8d6feb5dbd618924c4f02fce7e2b571d96dc93e1f2ba6961881202",
"sha256:66285ac4bf2430aeab0c55a77e630fe10018a8318df59b6e8734f8820b95b0c6"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]

这样看太累了,也不需要这么详细的信息,可以只用-f来查看,也方便用第三方工具来获取信息

[root@localhost ~]# docker inspect -f '{{.Created}}' ubuntu:14.04
2019-05-15T21:21:13.96007615Z

也可以加点内容

[root@localhost ~]# docker inspect -f '这个镜像的创建时间: {{.Created}}' ubuntu:14.04
这个镜像的创建时间: 2019-05-15T21:21:13.96007615Z

也可以把格式输出为json,方便三方程序读取

[root@localhost ~]# docker inspect --format='{{json .Config}}' ubuntu:14.04
{"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/bash"],"ArgsEscaped":true,"Image":"sha256:a0e29d6506d3d6bde4f245645bfce94e023175da5b3a7148e7a1e5b1cdf2ab42","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null}
[root@localhost ~]# docker inspect --format='{{json .GraphDriver}}' ubuntu:14.04
{"Data":{"LowerDir":"/var/lib/docker/overlay2/f1ce38d27bf85c64a91d2610e41abe786102add90f473e78d67e6484ba16dcc2/diff:/var/lib/docker/overlay2/1b08fc557849915df74ab00bb5713f1a60acc1840a64761b00f0bbf120a8764f/diff:/var/lib/docker/overlay2/110c2f7213e0c2dfcf85bba64cf55013d025b67989b7ba462bfb4fe965be2f5a/diff","MergedDir":"/var/lib/docker/overlay2/df358c4c61da87acfd356cc080f55378fe1d0810d6bcc876181f5b96f3c56743/merged","UpperDir":"/var/lib/docker/overlay2/df358c4c61da87acfd356cc080f55378fe1d0810d6bcc876181f5b96f3c56743/diff","WorkDir":"/var/lib/docker/overlay2/df358c4c61da87acfd356cc080f55378fe1d0810d6bcc876181f5b96f3c56743/work"},"Name":"overlay2"}

 

 

 

发表在 Docker | 标签为 | 留下评论

docker启动示范”hello world”

这个镜像很好说明了docker启动的完整过程,注意看对应的输出日志

[root@localhost ~]# docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5fb08267227e ubuntu:14.04 "/bin/bash" 13 minutes ago Up 13 minutes ubuntu_4
be9d5c6f2a25 ubuntu:14.04 "/bin/bash" 21 minutes ago Up 21 minutes ubuntu_3
dca3d42e5e3e ubuntu:14.04 "/bin/bash" 30 minutes ago Exited (0) 18 minutes ago ubuntu_2
7103a04f97d3 ubuntu:14.04 "/bin/bash" 3 hours ago Up 3 hours ubuntu
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 2c5e00d77a67 7 weeks ago 188MB
hello-world latest fce289e99eb9 6 months ago 1.84kB

我稍微翻译一下:

1、客户端联系守护进程

2、守护进程拉取hello world镜像

3、守护进程创建一个容器用来运行这个hello world镜像

4、守护进程以流的方式把运行结果输出到屏幕

然后对照events看看是不是这个过程

2019-07-04T22:33:40.618342042+08:00 image pull hello-world:latest (name=hello-world)
2019-07-04T22:33:40.659685188+08:00 container create 2c90659a7339842a569defd05ff5a7dee65d7a4d46383045b284a33fff1e8c3a (image=hello-world, name=hungry_heyrovsky)
2019-07-04T22:33:40.665818350+08:00 container attach 2c90659a7339842a569defd05ff5a7dee65d7a4d46383045b284a33fff1e8c3a (image=hello-world, name=hungry_heyrovsky)
2019-07-04T22:33:40.693804970+08:00 network connect 05475ea368337254dea611bfff0a86005befb5ea3da6e3bb6b7b3d40bbe4e33e (container=2c90659a7339842a569defd05ff5a7dee65d7a4d46383045b284a33fff1e8c3a, name=bridge, type=bridge)
2019-07-04T22:33:41.041510163+08:00 container start 2c90659a7339842a569defd05ff5a7dee65d7a4d46383045b284a33fff1e8c3a (image=hello-world, name=hungry_heyrovsky)
2019-07-04T22:33:41.141978025+08:00 container die 2c90659a7339842a569defd05ff5a7dee65d7a4d46383045b284a33fff1e8c3a (exitCode=0, image=hello-world, name=hungry_heyrovsky)
2019-07-04T22:33:41.193071966+08:00 network disconnect 05475ea368337254dea611bfff0a86005befb5ea3da6e3bb6b7b3d40bbe4e33e (container=2c90659a7339842a569defd05ff5a7dee65d7a4d46383045b284a33fff1e8c3a, name=bridge, type=bridge)
2019-07-04T22:33:41.218441072+08:00 container destroy 2c90659a7339842a569defd05ff5a7dee65d7a4d46383045b284a33fff1e8c3a (image=hello-world, name=hungry_heyrovsky)
发表在 Docker | 标签为 | 留下评论

docker diff/events命令

diff是用来比较容器和原镜像有什么区别,类似于git diff和status,这个直接用就行了,没太多好说的,比如刚才我们用docker cp复制了几份文件进入了ubuntu这个容器,看看有没有什么不同

[root@localhost ~]# docker diff ubuntu
C /home
A /home/rtest.txt
A /home/rtest2.txt
A /home/test.txt

events是用来实时查看输出的,类似于tail -f ,所以你得重新打开个终端。比如,我们先start ubuntu_2,看看发生什么

[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
be9d5c6f2a25 ubuntu:14.04 "/bin/bash" 4 seconds ago Up 3 seconds ubuntu
dca3d42e5e3e ubuntu:14.04 "/bin/bash" 8 minutes ago Exited (0) 2 minutes ago ubuntu
7103a04f97d3 ubuntu:14.04 "/bin/bash" 3 hours ago Up 3 hours ubuntu
[root@localhost ~]# docker start ubuntu_2 
ubuntu_2

同时看下另一个窗口

[root@localhost ~]# 
[root@localhost ~]# docker events 
2019-07-04T22:15:40.528401428+08:00 network connect 05475ea368337254dea611bfff0a86005befb5ea3da6e3bb6b7b3d40bbe4e33e (container=dca3d42e5e3ef9feaf0b0a1fb2a54700e8fe026b757845ffe36e3ca30e846f5a, name=bridge, type=bridge)
2019-07-04T22:15:40.957176678+08:00 container start dca3d42e5e3ef9feaf0b0a1fb2a54700e8fe026b757845ffe36e3ca30e846f5a (image=ubuntu:14.04, name=ubuntu_2)
2019-07-04T22:15:41.056997438+08:00 container die dca3d42e5e3ef9feaf0b0a1fb2a54700e8fe026b757845ffe36e3ca30e846f5a (exitCode=0, image=ubuntu:14.04, name=ubuntu_2)
2019-07-04T22:15:41.110200252+08:00 network disconnect 05475ea368337254dea611bfff0a86005befb5ea3da6e3bb6b7b3d40bbe4e33e (container=dca3d42e5e3ef9feaf0b0a1fb2a54700e8fe026b757845ffe36e3ca30e846f5a, name=bridge, type=bridge)

重新启动容器ubuntu_4,看看发生了什么

[root@localhost ~]# docker run -itd --name ubuntu_4 ubuntu:14.04
5fb08267227e4a81d3cde7e9e0ffddcca18bba30f341af01ba420e3b18d8df47

开另一个终端

[root@localhost ~]# docker events 
2019-07-04T22:20:45.807362786+08:00 container create 5fb08267227e4a81d3cde7e9e0ffddcca18bba30f341af01ba420e3b18d8df47 (image=ubuntu:14.04, name=ubuntu_4)
2019-07-04T22:20:45.839129624+08:00 network connect 05475ea368337254dea611bfff0a86005befb5ea3da6e3bb6b7b3d40bbe4e33e (container=5fb08267227e4a81d3cde7e9e0ffddcca18bba30f341af01ba420e3b18d8df47, name=bridge, type=bridge)
2019-07-04T22:20:46.165168069+08:00 container start 5fb08267227e4a81d3cde7e9e0ffddcca18bba30f341af01ba420e3b18d8df47 (image=ubuntu:14.04, name=ubuntu_4)

总结一下,就是docker events输出的是docker 服务端的日志,而不是容器本身的日志,不要和容器日志混为一谈。

发表在 Docker | 标签为 | 留下评论

docker create/start 命令

docker 容器状态有一种是create,他的意思是创建了容器,但是还没启动,创建完成后,需要使用start来启动容器

我们可以试一下

先创建容器

[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7103a04f97d3 ubuntu:14.04 "/bin/bash" 3 hours ago Up 3 hours ubuntu
[root@localhost ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 2c5e00d77a67 7 weeks ago 188MB
[root@localhost ~]# docker create --name ubuntu_2 ubuntu:14.04
dca3d42e5e3ef9feaf0b0a1fb2a54700e8fe026b757845ffe36e3ca30e846f5a
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dca3d42e5e3e ubuntu:14.04 "/bin/bash" 4 seconds ago Created ubuntu_2
7103a04f97d3 ubuntu:14.04 "/bin/bash" 3 hours ago Up 3 hours ubuntu

注意观察上面ubuntu_2的状态是Created,而不是时间

然后才是start容器

[root@localhost ~]# docker start ubuntu_2 
ubuntu_2
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dca3d42e5e3e ubuntu:14.04 "/bin/bash" 6 minutes ago Exited (0) 2 seconds ago ubuntu_2
7103a04f97d3 ubuntu:14.04 "/bin/bash" 3 hours ago Up 3 hours ubuntu

可以看到,这个容器,启动后就退出了,因为没有任何交互,要想留在后台,需要使用run

[root@localhost ~]# docker run -itd --name ubuntu_3 ubuntu:14.04
be9d5c6f2a25bff5acaae6339cd1e2671a37cba8cec2029440f29ca967df09db
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
be9d5c6f2a25 ubuntu:14.04 "/bin/bash" 4 seconds ago Up 3 seconds ubuntu_3
dca3d42e5e3e ubuntu:14.04 "/bin/bash" 8 minutes ago Exited (0) 2 minutes ago ubuntu_2
7103a04f97d3 ubuntu:14.04 "/bin/bash" 3 hours ago Up 3 hours ubuntu
发表在 Docker | 标签为 | 留下评论