Docker中运行 MySQL

mysql 是 Docker 和 MySQL 官方提供的一个镜像。

启动服务器实例

拉取镜像

docker pull mysql

启动镜像

docker run --name first-mysql -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7

这样就创建了一个名为 first-mysql 的 mysql 5.7 实例。

Shell 中访问容器日志查看

docker exec -it first-mysql bash

日志

docker logs first-mysql

环境变量

当启动 mysql 容器时,可以传入环境变量来改变容器的配置:

  • MYSQL_ROOT_PASSWORD:必须。用于设置MySQLroot用户的密码
  • MYSQL_DATABASE:可选。用于指定镜像启动容器时要创建的数据库。如果提供了用户/密码,则会将该用户做为此数据库的超级用户。
  • MYSQL_USERMYSQL_PASSWORD:可选。用于创建一个新用户并设置密码。
  • MYSQL_ALLOW_EMPTY_PASSWORD:可选。设置为yes时,则可以使用空密码登录
  • MYSQL_RANDOM_ROOT_PASSWORD:可选。设置为yes时会为root用户设置一个随机密码(使用pwgen),所生成的随机密码会被输出到stdout
  • MYSQL_ONETIME_PASSWORD:可选。为root用户指定一个一次性密码,该密码会在用户首次登录时强制修改

数据存储

mysql 镜像创建容器时,数据库存储会以下面两种方式存储:

  • 数据卷容器:使用Docker默认的数据管理方式来管理数据库的数据存储,在这种方式下,数据库文件会被写入数据库的内部。这种方式对于用户非常简单,缺点是很在宿主机上找到所存储的数据。
  • 外部数据卷:在宿主机创建一个数据目录,再将数据目录挂载到容器内部。这种方式可以很方便的在宿主机上找到并进行数据管理,但需要确保数据目录的存在。

使用外部数据卷时,假设宿主机有 /my/data/ 目录,可以使用 -v 选项来讲宿主机挂载到容器:

docker run --name mysql -v /my/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7

数据备份

docker exec first-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql

在其他容器中连接mysql

官方的镜像中导出的是默认 3306 端口,其他容器可以使用 --link 参数来连接mysql容器

docker run --name other-app --link first-mysql:mysql -d other-application-use-mysql

2018-02-18 mysql , database , linux , docker

netdata 又一款Linux监控程序

任何服务器监控是一项很重要的事情,以前一直使用nodequery ,虽然设置方便简洁,但是数据不够详细也是他很大问题,所以经过一番寻找又发现了这个 netdata。下面是 netdata 一系列的特性

  • 安装方便,几乎是一键
  • 实时信息显示,监控内容详细
  • 发送告警,可以向很多第三方平台发送报警通知,包括 telegram, email, slack channel 等等
  • 无磁盘IO操作
  • 不需要root权限
  • 可视化界面漂亮

官方提供了一些列的 demo : https://my-netdata.io/

一键安装

按照下面的教程安装:

https://github.com/firehol/netdata/wiki/Installation

配置 Nginx

upstream backend {
	server 127.0.0.1:19999;
	keepalive 64;
}	

server {
	listen 80;
	listen [::]:80;

	index index.html index.htm index.nginx-debian.html;

	server_name status.einverne.info;

	auth_basic "Protected";
	auth_basic_user_file passwords;
	
	location / {
		proxy_set_header X-Forwarded-Host $host;
		proxy_set_header X-Forwarded-Server $host;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_pass http://backend;
		proxy_http_version 1.1;
		proxy_pass_request_headers on;
		proxy_set_header Connection "keep-alive";
		proxy_store off;
	}
}

主要配置如上,可以加上一个密码保护,具体Nginx的配置 可以参考链接。

htpasswd -c -d /etc/nginx/passwords yourusername

这行命令中的 passwords 就是之前 Nginx 配置中的 auth_basic_user_file 后的参数,通过该选项设置用户名密码。


2018-02-16 linux , vps , monitor

使用 docker compose 管理多个容器

Docker Compose 是一个定义和启动多容器的工具,可以使用 Compose 来管理多个 Docker 容器。Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。Docker Compose 使用 YAML 文件定义应用,之后可以使用一行简单的命令来创建或者启动所有的服务。

Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器,但往往实际应用可能包含不止一个容器,常见的 Web 容器通常还包括一个数据库容器。Compose 允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

  • 服务 (service):应用容器,实际上可以包括若干运行相同镜像的容器实例
  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义

使用 Compose

使用 Compose 可以简单的归纳为三步

  • 定义应用的 Dockerfile
  • 定义服务 docker-compose.yml 文件
  • 执行 docker-compose up 来启动整个服务

常见的 docker-compose.yml 文件如下:

version: '3'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

安装

Compose 依赖于 Docker Engine,所以确保安装 Compose 之前 Docker 已经在本地安装成功。安装 Compose 非常简单,将编译好的二进制文件下载到本地即可,查看compose 的github release 页面 获取最新版本:

sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

示例

具体例子可参考官网或者 https://github.com/einverne/dockerfile/ 项目下有 compose-start 文件夹,其中包含示例代码:

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

在该文件夹下使用 docker-compose up 启动服务。使用 docker-compose down 关闭。如果想要在后台执行添加 -d 选项 docker-compose up -d

命令使用

Compose 命令的对象是项目本身,也可以为项目中的服务或者容器,默认为项目。 服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。

命令选项:

-f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
-p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。

常见命令

docker-compose up          # 自动完成构建镜像,创建服务,启动服务,并关联服务等操作
docker-compose down
docker-compose start       # 启动存在的服务
docker-compose stop        # 停止
docker-compose restart     # 重启项目中服务
docker-compose exec        # 进入指定容器
docker-compose help
docker-compose image       # 列出 Compose 文件中包含的镜像
docker-compose kill [SERVICE...]
docker-compose pause [SERVICE...]
docker-compose unpause [SERVICE...]
docker-compose ps          # 列出项目中所有容器

up

大部分时候都可以直接通过该命令来启动一个项目,默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息。

当通过 Ctrl-C 停止命令时,所有容器将会停止。如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。

docker-compose up -d        # 后台执行

down

此命令将会停止 up 命令所启动的容器,并移除网络

docker-compose              # 移除停止的容器
docker-compose -v           # 此选项会移除 volumns 中定义的卷,千万小心

举例

> docker-compose down -v
Removing wordpress    ... done
Removing wordpress_db ... done
Removing network wordpress_wordpress-network
Removing volume wordpress_db_data

build

重构项目中容器

docker-compose build [options] [SERVICE...]

rm

删除所有停止状态的服务容器。

docker-compose rm [options] [SERVICES ..]

config

验证 Compose 文件格式是否正确

docker-compose config

Compose 模板文件

默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。大部分的指令和 docker run 的含义是一样的。

image

指定镜像名或者镜像ID,如果本地不存在,Compose 会拉取该镜像

image: ubuntu

volumes

数据卷挂载设置,可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)

volumes:
 - /var/lib/mysql

ports

暴露端口信息,使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)

更多详细可参考: https://yeasy.gitbooks.io/docker_practice/content/compose/compose_file.html

reference


2018-02-15 docker , dockercompose , linux

Wiznote 为知笔记

很早以前写过一篇文章,为了寻找Evernote 的代替品,两年过去了,我也认认真真地用了两年的的为知笔记。说实话现在再来说为知笔记确实有些晚,很早很早以前就有很多人推荐为知笔记。

但是经过两年使用,加上最新 2.5.8 的版本更新,让我不得不出来说一说 WizNote,早在之前的文章中提到过,因为 WizNote 提供 Linux 版本的客户端,所以让我一直能够用下去。我一直坚信的一点就是做产品,一定是做到一个服务,让用户选择一个服务,能够不考虑其使用成本,也就是不管我是在 Windows ,Mac 还是 Linux,或者是 Android 或者 iOS 我都能够快速获取服务提供的内容,这才是一个真正好的产品。当然所有的笔记类产品中只有 WizNote 做到了。当然这里其实还要提一嘴网易云音乐,太良心了这两家公司。WizNote 不说其他的功能在一定程度上超越 Evernote,但就跨平台,多设备同步这一点就比 Evernote 好过不止一点。更不用说支持markdown,支持语法高亮,支持pdf,html导出等等非常良心的功能。

最新 WinNote 更新一个 Linux 的 AppImage 版本,虽然这个版本绿色,下载直接可以使用,但是带来一个问题就是,无法建立快捷方式,我的快速启动突然失效,让我有些失望。AppImage 格式是一种新的Linux程序封装方法。AppImages 是便携的——它们无需安装即可运行在大多数Linux发行版上。所有的依赖包均包含于一个AppImage文件。但是这个 AppImage 文件必须每一次都让我去目录下手动执行,这个让我非常不爽,于是找到了下面的解决方法,手动创建一个快捷方式,使用该快捷方式启动 WizNote。

如果使用 GNOME,可以安装包 sudo apt-get install --no-install-recommends gnome-panel,然后使用如下命令:

gnome-desktop-item-edit ~/.local/share/applications --create-new

该命令会弹出一个对话框,输入一些必要的参数,保存即可,该命令会在 ./local/share/application/ 目录下新建一个 WizNote.desktop 的文件

#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application                                # type
Icon=wiznote                                    # location of icon file
Terminal=false                                  # whether this app requires to be run in a terminal.
Name[en_US]=WizNote
GenericName=WizNote                             # longer name of the app
Exec=/home/einverne/app/WizNote-2.5.8-x86_64.AppImage  # command used to launch an app
Name=WizNote
Categories=WizNote;                             # categories in which this app should be listed.
GenericName[en_US.UTF-8]=WizNote

另外一个令我不爽的就是,在这个版本发布之后一段时间后我在 Linux 上的 PPA 安装的版本突然之间无法登录并无论多少次重新登录都说我密码错误,无法登录。即使说因为新版本,或者是因为同步机制升级,导致老版本的同步失效,也应该给予一个正确的提示,而不是说密码错误,我的密码并没有输入错误或者记错,因为网页版,Android/iOS 端都是正常登录的,而仅仅给个密码错误的提示会误导用户。虽然安装了新版本的 WizNote 这依然浪费了很多的时间,还有让我吐槽浪费更多的时间。

这有回到了文章开头我的观点,作为一个服务(产品),应该提供的是用户随时随地可获取的服务,所有的更新升级对用户应该都是透明的,用户不应该关心版本升级可能带来的任何问题,有很多时候我非常反感一个产品突然拿掉一些功能,虽然可能在一定程度上可能已经脱离公司发展轨迹,但其实对一些用户还是有着深刻的影响的。所以很多时候在考虑深度使用一个产品(服务)的时候,我一般都会考虑在这个产品的数据有没有备份或者导出的途径,如果没有任何可以导出或者备份的功能,一般情况下也就淘汰了这个服务。

说了这么多,其实 WizNote 还是目前我深度使用的一个服务,我真心的希望他会越来越好,也能够继续维护这么多版本的开发。最后真心地祝愿。


2018-02-14 wiznote , notebook , multi-platform , notes

书库免费的电子书站点

一年前使用 kindle 的时候有 kindle10000 ,还有无数的 kindle push 网站,去年突然一下子关闭一下子蒙了,这一年多来,陆陆续续又发现了一些很不错的站点。现在整理整理分享一下。我电脑中还有大概五六十G的当年kindle人倒闭时全站资源的打包只是一直都还么有时间建立索引,整理出来,有时间还是要整理一下的。

我的小书屋

http://mebook.cc/

以网盘下载为主

可以用来推送电子书到 Kindle 邮箱

集思会

强烈推荐的站点,几乎 kindle10000 之后就是他了。

http://www.kindlepush.com

书籍比较全,每天可推送两本,下载一本,

书伴

https://bookfere.com/

漫画

http://vol.moe/

记得以前不叫这个名字的,可推送漫画,漫画比较全,有连载。

古腾堡

http://readfree.me/

书籍比较全,相同书籍有不同版本,可推送到 kindle,可下载,可共享图书

子乌书简

http://book.zi5.me/

可推送,可下载,注册用户可以共享电子书,网站由 WordPress 所写。

鸠摩搜索

https://www.jiumodiary.com/

主要是微博网盘和百度网盘共享书籍,质量层次不齐

其他

mLook 精校电子书,注册需要邀请码

http://plugin.mlook.mobi/

周读

http://ireadweek.com/

计算机相关

https://github.com/justjavac/free-programming-books-zh_CN


2018-02-13 books , free , website , kindle

Linux 下安全的删除文件

Linux 下有一个非常危险的命令—-rm,虽然本意上rm命令是用来删除文件或者文件夹的,但是这个命令删除的文件很难找回来,一旦不小心手贱敲快了,就有可能导致不可挽回的结果。所以我搜了一圈,发现其实 Ubuntu 下有一个包 trash-cli。给Linux加了一层垃圾箱。

安装

sudo apt install trash-cli

这个命令包,包括 trash, trash-list, trash-restor, trash-empty 等等几个命令,具体可以参看 man。

~/.zshrc 中添加 alias

alias rm=trash

这样,以后使用 rm 时,默认将文件移动到垃圾箱中,再不会发生不小心删除文件之后无法找回的问题。

reference


2018-02-12 linux , rm , delete , file , manager

搭建自己的Weibo转RSS服务

认识我的人都是知道我一直使用RSS订阅信息,但是互联网越来越闭塞的现在,每一家公司都在自建后花园,把所有的信息封闭在内部,几乎现在没有任何内容型平台提供 RSS 输出了,所以也才有了这篇文章。以前我使用的微博转RSS的服务大都已经挂掉,唯一一家微博档案最近也似乎有些危险。不过幸好查到下面两个项目,让微博定义RSS不在困难。

  • https://github.com/DIYgod/Weibo2RSS
  • https://github.com/zgq354/weibo-rss

我使用了第二个项目,安装过程可以参考下文,都是使用 nodejs 实现,如果手动安装需要手动配置一下环境。

使用 Docker 安装

安装 Docker 的文章可以查看之前的文章

git clone https://github.com/zgq354/weibo-rss.git
cd weibo-rss
docker build -t <tag> .
docker run -p 3000:3000 -d --name weibo-rss --restart=always <tag>

默认程序会监听服务器的 3000 端口,可以通过 Nginx 的 proxy_pass 指令配置请求转发

reference


2018-02-11 linux , docker , weibo , rss , inoreader

每天学习一个命令:find 查找文件

查找的动作在平时使用的频率也还是很高的,所以知道并用好 find 这个命令也很重要。find 命令顾名思义,就是搜索特定文件夹内的文件。

基本使用

最基本的使用

find [path] [expression]

在 path 目录下查找 expression 的文件。

使用举例

通过文件名查找

find -name "query"   # 搜索文件名,大小写敏感
find -iname "query"  # 大小写不敏感
find -not -name "query"  # 查找不包含关键字的文件
find \! -name "query"    # 不包含

按照类型查找文件

find -type [fdlcb] "query"

type 后能够使用的类型有

  • f 常规文件
  • d 目录
  • l 连接
  • c character devices
  • b block devices

比如要查找系统中所有以 .conf 结尾的文件

find / -type f -name "*.conf"

通过文件大小查找

find /path/to/folder -size 50M

查找 50M 的文件,size 后能够使用的单位有:

  • b 512byte blocks
  • c byte 字节
  • w two byte
  • k kB 千字节
  • M MB
  • G

size 后面的参数可以使用 + 或者 - 或者不加来标识,超过,少于,或者正好。

find / -size +700M   # 表示查找大于 700M 的文件
find / -size -50c    # 表示查找小于 50 自己的文件

通过时间来查找文件

Linux 会存储下面的时间:

  • Access time 上一次文件读或者写的时间
  • Modifica time 上一次文件被修改的时间
  • Change time 上一次文件 inode meta 信息被修改的时间

在按照时间查找时,可以使用 -atime-mtime 或者 -ctime ,和之前 size 参数一样可以使用 + 或者 - 来标识超多多长时间或者少于多长时间。

find / -mtime 1          # 寻找修改时间超过一天的文件
find / -atime -1         # 寻找在一天时间内被访问的文件
find / -ctime +3         # 寻找 meta 信息被修改的时间超过 3 天的文件

寻找修改时间超过 1 小时的 mp3 文件

find /path/to/folder -maxdepath 1 -mmin +60 -type f -name "*.mp3"

其中的-mmin n 参数表示的就是文件内容在前 n 分钟没有修改。

find /path/to/folder -maxdepath 1 -mmin +60 -type f -name "*.mp3" -exec rm -f {} \;

通过上面的语句就能够一次性删除超过 60 分钟未修改的 mp3 了。

通过 Owner 和权限搜索

使用 -user-group 参数来通过拥有者搜寻

find / -user einverne
find / -group shadow

同样按着权限查找文件

find / -perm 644
find / -perm -644 # 查找权限至少是 644 的文件

限制查找的深度

使用 -maxdepth 来限制查找的深度,默认情况下 find 会一层层搜索,如果只想让 find 命令查找当前目录或者子目录,可以使用

find -maxdepth 2 -name "query"

同理 还有一个选项 -mindepth

find -mindepth 2 -maxdepth 3 -name "query"

对搜索结果批处理

在搜索出结果之后,可以使用如下的方式对搜索的结果执行一个命令

find [param] -exec command {} \;

比如批量修改权限

find . -type f -perm 644 -exec chmod 664 {} \;
find . -type d -perm 755 -exec chmod 700 {} \;   # 批量修改文件夹权限

批量删除时间超过 1 天的文件

综合上面按时间查找文件和对搜索结果批处理,可以获知

find /path/to/folder/* -mtime +1 -exec rm {} \;
  • find 后面接一个完整的 path
  • -mtime +1 表示的查找时间超过 1 天的内容
  • -exec 后面表示对搜索的结果进行处理

使用 locate

locate 命令需要额外安装

sudo apt install mlocate

locate 命令维护了一份文件和目录的数据库,所以检索速度会快一些,数据库通常一天更新一次,可以手动更新数据库

sudo updatedb
locate -S   # 查看当前数据库数据

locate 使用的方式和 find 大致差不多。

reference


2018-02-10 linux , find , file , command

监控 docker 运行数据 stats 命令

之前因为学习 Docker 也总结了一批经常使用的 Docker 命令 然后回头过来看唯独漏掉了 Docker 监控的一块,一方面也是当时看的文档并没有覆盖到这个领域,另一方面也是最近看到 Google cAdvisor 才开始注意到 Docker 监控的命令。

使用

查看容器资源使用

直接运行,查看所有当前运行的 Docker 状态及资源消耗

docker stats

该命令执行后会返回下列数据

  • 容器ID,名字
  • CPU及 MEM 使用率
  • 内容使用量及限制
  • NET I/O 网络IO
  • BLOCk I/O 本地IO
  • PIDs 进程ID

查看容器中进程情况

查看容器中启动的进程

docker top [CONTAINER] [ps options] 

查看容器的日志

使用如下命令查看容器日志

docker logs [OPTIONS] CONTAINER

使用参数 -f 来追踪打印未来的日志

docker logs -f CONTAINER

2018-02-10 docker , monitor , container

Linux 下显示网络流量

Linux 下查看网络流量的命令有很多,之前 也介绍过使用 nethogs 来按照进程查看网络流量。但其实 Linux 下有很多命令同样可以达到效果。

总体带宽使用

bmon

使用 apt install bmon 安装,使用非常简单直接运行即可。

bmon 的介绍说是一个网络监控和调试工具,能够提供一个可视化的界面。

其他还有 nload, slrum, speedometer, netload

套接字连接带宽使用

常用的有 iftop,iptraf

iftop 使用 pcap 库来捕获进出网络适配器的数据包,然后汇报总数据包大小和数量。iftop 报告每一个连接所使用的带宽,但是没有办法报告进程名和编号。使用 iftop 时如果系统包含多个网络接口可能需要指定监控的接口 sudo iftop -i eth0,类似 top 命令,iftop 可以在运行时改变显示:

  • h 帮助
  • n 是否解析域名
  • s 是否显示源地址
  • d 是否显示目标地址
  • S 是否显示端口号

iptraf

iptraf 是一款交互式的网络监控工具,它可以显示每个连接和主机之间的传输数据。按连接/端口查看流量。

ifstat

ifstat: 按设备查看流量

ethtool

ethtool: 诊断工具

ss

ss: 连接查看工具


2018-02-09 linux , command , network , iftop , bmon

电子书

Google+

最近文章

  • 威联通折腾篇五:安装 Transmission 下载 BT 这一篇讲在威联通上安装和使用下载工具 – Transmission。
  • 威联通折腾篇六:文件同步 文件同步应该算是 NAS 最最基本的一个服务了,但是为什么直到篇六才提到他呢,是因为威联通自带的 QSync ,嗯,虽然能用,但是,没有 Linux 客户端,虽然其他平台客户端 OK,但是作为我主力工作的平台没有同步客户端,只能 smb 挂载。而之前搞 zerotier 同局域网速度不佳,其他 frp 内网穿透 也最多拉一些小文件,完全做不到 Dropbox 那样无缝,无痛。
  • 威联通折腾篇四:Container Station 运行 Docker 容器 威联通上有一个 Container Station 的应用,可以直接用官方的 App Center 中下载安装,这其实就是一个 Docker 本地环境,如果熟悉 Docker 使用,那么其实都直接可以 ssh 登录 NAS 然后完全使用命令行来操作。
  • 威联通折腾篇一:使用命令行安装威联通 QNAP 的 qpkg 安装包 如果想要给威联通安装一个 qpkg 的安装包时,最直观界面方式就是在 App Center 中,右上角,将本地的 .qpkg 文件上传到 NAS 并安装。
  • 威联通折腾篇二:使用 frp 内网穿透 这是 QNAP NAS 折腾第二篇,使用 frp 来从外网访问 NAS。威联通自带的 qlink.to 实在是太慢几乎到了无法使用的地步,用 Zerotier 也依然很慢,所以无奈还是用回了 frp.