运维随笔

笔记


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

Docker容器的重启策略及--restart选项详解

发表于 2019-05-10 | 更新于: 2022-06-05 | 分类于 Docker
字数统计: 1.3k | 阅读时长 ≈ 5

创建容器时没有添加参数 –restart=always ,导致的后果是:当 Docker 重启时,容器未能自动启动。

现在要添加该参数怎么办呢,方法有二:

1 重启策略及–restart选项详解

1. Docker容器的重启策略

Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。

Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关。

Docker容器的重启策略如下:

  • no,默认策略,在容器退出时不重启容器
  • on-failure,在容器非正常退出时(退出状态非0),才会重启容器
    • on-failure:3,在容器非正常退出时重启容器,最多重启3次
  • always,在容器退出时总是重启容
  • unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

2. Docker容器的退出状态码

docker run的退出状态码如下:

  • 0,表示正常退出
  • 非0,表示异常退出(退出状态码采用chroot标准)
    • 125,Docker守护进程本身的错误
    • 126,容器启动后,要执行的默认命令无法调用
    • 127,容器启动后,要执行的默认命令不存在
    • 其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码

3. docker run的–restart选项

通过--restart选项,可以设置容器的重启策略,以决定在容器退出时Docker守护进程是否重启刚刚退出的容器。
--restart选项通常只用于detached模式的容器。

--restart选项不能与--rm选项同时使用。显然,-restart选项适用于detached模式的容器,而--rm选项适用于foreground模式的容器。

在docker ps查看容器时,对于使用了--restart选项的容器,其可能的状态只有Up或Restarting两种状态。

示例:

1
2
docker run -d --restart=always bba-208
docker run -d --restart=on-failure:10 bba-208

补充:

查看容器重启次数

1
docker inspect -f "{{ .RestartCount }}" bba-208

查看容器最后一次的启动时间

1
docker inspect -f "{{ .State.StartedAt }}" bba-208

2、Docker 命令修改

1
docker container update --restart=always 容器名字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
操作实例如下:
[root@localhost mnt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46cdfc60b7a6 nginx "nginx -g 'daemon ..." About a minute ago Up 42 seconds 80/tcp n3
79d55a734c26 nginx "nginx -g 'daemon ..." About a minute ago Up 42 seconds 80/tcp n2
f7b2206c019d nginx "nginx -g 'daemon ..." About a minute ago Up 46 seconds 80/tcp n1
[root@localhost mnt]# docker container update --restart=always n1
n1
[root@localhost mnt]# systemctl restart docker
[root@localhost mnt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46cdfc60b7a6 nginx "nginx -g 'daemon ..." 2 minutes ago Exited (0) 5 seconds ago n3
79d55a734c26 nginx "nginx -g 'daemon ..." 2 minutes ago Exited (0) 5 seconds ago n2
f7b2206c019d nginx "nginx -g 'daemon ..." 2 minutes ago Up 2 seconds 80/tcp n1

3、直接改配置文件

(经测试后无效,修改配置文件后,启动容器后,该参数有自动变成了no,修改不生效)

首先停止容器,不然无法修改配置文件
配置文件路径为:/var/lib/docker/containers/容器ID
在该目录下找到一个文件 hostconfig.json,找到该文件中关键字 RestartPolicy
修改前配置:"RestartPolicy":{"Name":"no","MaximumRetryCount":0}
修改后配置:"RestartPolicy":{"Name":"always","MaximumRetryCount":0}
最后启动容器。


4 修改docker容器的挂载路径

  • 停止所有docker容器
1
sudo docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
  • 停止docker服务
1
sudo service docker stop
  • 修改mysql路径
1
2
cd ~
sudo cp -r mysql/ /home/server/
  • 备份容器配置文件
1
2
3
cd /var/lib/docker/containers/de9c6501cdd3
cp hostconfig.json hostconfig.json.bak
cp config.v2.json config.v2.json.bak
  • 修改hostconfig的冒号前的配置路径
1
2
3
vi hostconfig.json

"Binds": ["/home/server/mysql/conf/my.cnf:/etc/mysql/my.cnf", "/home/server/mysql/logs:/logs", "/home/server/mysql/data:/mysql_data"],
  • 修改config的Source的配置路径
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
vi config.v2.json

"MountPoints": {

"/etc/mysql/my.cnf": {

"Source": "/home/server/mysql/conf/my.cnf",

"Destination": "/etc/mysql/my.cnf",

"RW": true,

"Name": "",

"Driver": "",

"Relabel": "",

"Propagation": "rprivate",

"Named": false,

"ID": ""

},

"/logs": {

"Source": "/home/server/mysql/logs",

"Destination": "/logs",

"RW": true,

"Name": "",

"Driver": "",

"Relabel": "",

"Propagation": "rprivate",

"Named": false,

"ID": ""

},

"/mysql_data": {

"Source": "/home/server/mysql/data",

"Destination": "/mysql_data",

"RW": true,

"Name": "",

"Driver": "",

"Relabel": "",

"Propagation": "rprivate",

"Named": false,

"ID": ""

},

"/var/lib/mysql": {

"Source": "",

"Destination": "/var/lib/mysql",

"RW": true,

"Name": "85d91bff7012b57606af819480ce267449084e81ab386737c80ace9fe75f6621",

"Driver": "local",

"Relabel": "",

"Propagation": "",

"Named": false,

"ID": "897cd0152dd152166cb2715044ca4a3915a1b66280e0eb096eb74c2d737d7f77"

}

},

5 修改docker默认的存储位置

docker 的所有images及相关信息存储位置为:/var/lib/docker

  • 查看默认的docker存储路径
1
2
3
docker info |grep 'Docker Root Dir'
WARNING: No swap limit support
Docker Root Dir: /var/lib/docker
  • 停止所有docker容器
1
sudo docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
  • 停止docker服务
1
2
sudo service docker stop
cd /var/lib
  • 打包docker目录
1
2
3
sudo tar -czvf /usr/docker.tar.gz docker/
cd /usr/
sudo tar -xzvf docker.tar.gz
  • 修改docker默认的存储位置
1
2
3
4
5
sudo vim /etc/docker/daemon.json

{
"graph": "/home/server/docker"
}
  • 启动docker服务
1
sudo service docker start
  • 启动所有docker容器
1
sudo docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
  • 查看修改后docker存储路径
1
2
3
docker info |grep 'Docker Root Dir'
WARNING: No swap limit support
Docker Root Dir: /usr/docker

本文转自:https://www.cnblogs.com/zhuochong/p/10070516.html !!!!!!

MyISAM与InnoDB两者之间区别与选择

发表于 2019-04-28 | 更新于: 2022-03-31 | 分类于 Linux
字数统计: 5.5k | 阅读时长 ≈ 20

1、MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。不是事务安全的,而且不支持外键,如果执行大量的select,insert MyISAM比较适合。

2、InnoDB:支持事务安全的引擎,支持外键、行锁、事务是他的最大特点。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。

阅读全文 »

MySQL自带的性能压力测试工具mysqlslap

发表于 2019-04-28 | 更新于: 2022-06-05 | 分类于 Linux
字数统计: 1.1k | 阅读时长 ≈ 4

1 mysqlslap介绍

mysqlslap是从MySQL5.1.4版就开始官方提供的压力测试工具。

通过模拟多个并发客户端并发访问MySQL来执行压力测试,同时提供了较详细的SQL执行数据性能报告,并且能很好的对比多个存储引擎(MyISAM,InnoDB等)在相同环境下的相同并发压力下的性能差别。

mysqlslap 官方介绍:http://dev.mysql.com/doc/refman/5.6/en/mysqlslap.html

1.1 常用参数 [options] 详解

--host=host_name: -h host_name 连接到的MySQL服务器的主机名(或IP地址),默认为本机localhost;

--user=user_name: -u user_name 连接MySQL服务时用的用户名;

--password[=password]: -p[password] 连接MySQL服务时用的密码;

--create-schema: 代表自定义的测试库名称,测试的schema,MySQL中schema也就是database;(没指定使用哪个数据库时,可能会遇到错误mysqlslap: Error when connecting to server: 1049 Unknown database ‘mysqlslap’)

`–query=name`: -q 使用自定义脚本执行测试(可以是SQL字符串或脚本),例如可以调用自定义的一个存储过程或者sql语句来执行测试。

--create: 创建表所需的SQL(可以是SQL字符串或脚本)

--concurrency=N: -c N 表示并发量,也就是模拟多少个客户端同时执行query。可指定多个值,以逗号或者–delimiter参数指定的值做为分隔符。例如:–concurrency=100,200,500(分别执行100、200、500个并发)。

--iterations=N: -i N测试执行的迭代次数,代表要在不同的并发环境中,各自运行测试多少次;多次运行以便让结果更加准确。

--number-of-queries=N: 总的测试查询次数(并发客户数×每客户查询次数)

--engine=engine_name: -e engine_name 代表要测试的引擎,可以有多个,用分隔符隔开。例如:–engines=myisam,innodb,memory。

--auto-generate-sq: -a 自动生成测试表和数据,表示用mysqlslap工具自己生成的SQL脚本来测试并发压力。

--auto-generate-sql-load-type=type: 测试语句的类型。代表要测试的环境是读操作还是写操作还是两者混合的。取值包括:read (scan tables), write (insert into tables), key (read primary keys), update (update primary keys), or mixed (half inserts, half scanning selects). 默认值是:mixed.

--auto-generate-sql-add-auto-increment: 代表对生成的表自动添加auto_increment列,从5.1.18版本开始支持。

--number-char-cols=N: -x N 自动生成的测试表中包含多少个字符类型的列,默认1

--number-int-cols=N: -y N自动生成的测试表中包含多少个数字类型的列,默认1

--commint=N: 多少条DML后提交一次。

--compress: -C 如果服务器和客户端支持都压缩,则压缩信息传递。

--only-print: 只打印测试语句而不实际执行。

--detach=N: 执行N条语句后断开重连。

--debug-info: -T 打印内存和CPU的相关信息。

1.2 测试范例:

1
mysqlslap -uroot -p --socket /tmp/mysql3306.sock --concurrency=1 --iterations=1 --create-schema='test' --query='SELECT id,unionid,current_num,total_num FROM invite_join WHERE unionid="Cmo" AND active_id="3" AND is_deleted =0 ORDER BY id DESC LIMIT 1;' --number-of-queries=1000000

各种测试参数实例(-p后面跟的是mysql的root密码):

  • 单线程测试。测试做了什么。
1
# mysqlslap -a -uroot -p123456
  • 多线程测试。使用–concurrency来模拟并发连接。
1
# mysqlslap -a -c 100 -uroot -p123456
  • 迭代测试。用于需要多次执行测试得到平均值。
1
# mysqlslap -a -i 10 -uroot -p123456
1
2
3
4
5
6
7
# mysqlslap ---auto-generate-sql-add-autoincrement -a -uroot -p123456
# mysqlslap -a --auto-generate-sql-load-type=read -uroot -p123456
# mysqlslap -a --auto-generate-secondary-indexes=3 -uroot -p123456
# mysqlslap -a --auto-generate-sql-write-number=1000 -uroot -p123456
# mysqlslap --create-schema world -q "select count(*) from City" -uroot -p123456
# mysqlslap -a -e innodb -uroot -p123456
# mysqlslap -a --number-of-queries=10 -uroot -p123456
  • 测试同时不同的存储引擎的性能进行对比:
1
# mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info -uroot -p123456
  • 执行一次测试,分别50和100个并发,执行1000次总查询:
1
# mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info -uroot -p123456
  • 50和100个并发分别得到一次测试结果(Benchmark),并发数越多,执行完所有查询的时间越长。为了准确起见,可以多迭代测试几次:
1
# mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --debug-info -uroot -p123456

mysql优化

发表于 2019-04-25 | 更新于: 2022-03-31 | 分类于 Linux
字数统计: 2.4k | 阅读时长 ≈ 8

1 缓存优化之QueryCache

阅读全文 »

Linux下run包制作

发表于 2019-03-28 | 更新于: 2022-06-05 | 分类于 Linux
字数统计: 566 | 阅读时长 ≈ 2

1 Run软件包介绍

run 程序安装包实质上是一个安装脚本加要安装的程序,如下所示:

|—————–——|
| |
| 安装脚本 |
| |
|—————–——|
| |
| 程序 |
| |
|—————–——|

这样整个 run 安装包结构就一目了然了,实际上因为实际需要结构多少有点变动但这个无关紧要,只需要明白原理就行了。
安装文件的优点:

(1)只有一个包文件;

(2)可以直接运行在 Linux上,因为它是 sh(它的前半部分是sh);

(3)在 sh 中可以包含需要用户接收的协议信息,而且提示用户接收,如果用户不接收,安装退出。

2 制作run安装包

2.1 压缩环境包

1
tar -zcvf app.tar.gz app/

2.2 制作安装脚本

install.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
#! /bin/bash
lines=13 #这个值是指这个脚本的行数加 1,这个脚本共有 12 行
tail -n +$lines $0 > /tmp/app.tar.gz
# $0 表示脚本本身,这个命令用来把从 $lines 开始的内容写入一个 /tmp 目录的 scan.tar.gz 文件里。
tar zxvf /tmp/app.tar.gz
cp -pR app /opt/
rm -rf app/
echo "********************************************************************************************************************"
echo "*****Install Success **********************************************************************************************"
echo "*****Installation path: /opt/app **********************************************************************************"
echo "*****Explain: Modify the start.sh configuration parameter, and then execute the start.sh script startup program.****"
echo "********************************************************************************************************************"
exit 0

3 生成run文件

1
cat install.sh app.tar.gz > app.run

这样就得到了 app.run 文件,它的结构如下:
|—————–———| 第1行
| |
| install.sh |
| | 第12行
|—————–———|
| app.tar.gz | 第13行
| |
|—————–———| 结尾

可通过vi/vim app.run 查看脚本内容

在运行 apprun 时,运行到第 12 行的 exit 0 ,脚本就会自动退出了,不会去运行第 13 行以下的二进制数据(即 app.tar.gz 文件),这样 shell 就不会因为识别不了二进制数据而出错了。这里我们巧妙地使用了 tail 命令,把第 12 行以下的数据重新生成了一个app.tar.gz文件,然后再执行安装。运行超级简单,使用 sh app.run 或赋予可执行权限然后直接执行 ./app.run 就可以安装了。

run 安装包制作较小的程序包是很好的选择,但是它也有缺点,做逻辑比较复杂的安装包,写的安装脚本将会很麻烦,因此此时还是用其他的安装包更好。

1…121314…32
OperationMAN

OperationMAN

日常运维文档整理。

157 日志
9 分类
107 标签
E-Mail GitHub 码云 Linux命令大全 鸟哥的私房菜 RUNOOB.com 陈沙克日志 Bitnami Font Awesome
友情链接
  • Next优化
  • Next深度优化
© 2023 OperationMAN | 豫ICP备 17032296 号