docker常用操作命令

创建

可以在hub.docker.com上创建一个新的repo,或者自己复制一个现有的repo.
绑定github后,也可以直接通过Dockerfile来发生成最新的镜像

查看镜像列表

docker images

查看容器列表

docker ps

查看所有的容器

docerk ps -a

查看最近创建的容器

docker ps -l

查找在指定 image 之后创建的 image 中的父 image

docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=xxxxxx)

获取镜像

docker pull name/reponame

删除

docker rm          Remove one or more containers
docker rmi         Remove one or more images

删除已经退出运行的容器

docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm

删除none镜像

docker images |grep none |awk '{print $3}'|xargs docker rmi

要删除全部image的话

docker rmi $(docker images -q)

停止所有容器

停止容器,才能删除所包含的image

docker stop $(docker ps -a -q)

运行

ssh登陆:

docker run -it  username/imagename /bin/bash

ssh登陆,并挂载本地目录,默认读写权限:

docker run -it -v 宿主绝对路径:docker绝对路径 username/imagename /bin/bash

attach

docker attach --sig-proxy=false $CONTAINER_ID

detach

docker没有专用的命令,目前不能使用eixit,因为会导致主进程退出。使用ctl+p+ctl+q来detach当前的进程

查看底层信息,比如IP等

docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID

commit

docker commit CONTAINER_ID docker_hub用户名/镜像名:tagname

push

docker push docker_hub用户名/镜像名:tagname

其他参考

资深专家都知道的 Docker 常用命令—源英文:Top Docker Commands Any Expert Should Know
Docker之容器的创建、启动、终止、删除、迁移等
docker入门——构建镜像

关于DEBIAN_FRONTEND noninteractive的正确用法

DEBIAN_FRONTEND这个环境变量,告知操作系统应该从哪儿获得用户输入。如果设置为”noninteractive”,你就可以直接运行命令,而无需向用户请求输入(所有操作都是非交互式的)。这在运行apt-get命令的时候格外有用,因为它会不停的提示用户进行到了哪步并且需要不断确认。非交互模式会选择默认的选项并以最快的速度完成构建。请确保只在Dockerfile中调用的RUN命令中设置了该选项,而不是使用ENV命令进行全局的设置。因为ENV命令在整个容器运行过程中都会生效,所以当你通过BASH和容器进行交互时,如果进行了全局设置那就会出问题。

正确的做法 – 只为这个命令设置ENV变量
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y python3

错误地做法 – 为接下来的任何命令都设置ENV变量,包括正在运行地容器

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get install -y python3

我的示例如下:

FROM ubuntu:trusty
MAINTAINER mryqu 
RUN \
 DEBIAN_FRONTEND=noninteractive apt-get update && \
 DEBIAN_FRONTEND=noninteractive apt-get -y install wget curl && \
 DEBIAN_FRONTEND=noninteractive apt-get -y autoremove && \
 DEBIAN_FRONTEND=noninteractive apt-get clean

go安装或者版本升级

之前go还停留在1.5现在要升级到最新版。
go是通过环境变量来关联版本的,所以安装和升级其实是一个流程。
对于升级,直接删除或者重命名原来的目录,将新包解压到原来的位置就可以了。
对于安装,就是直接解压,然后配置环境变量,参看 mac下零基础学习go语言-2-开发环境的搭建

下载

golang 官方下载

安装

tar -C /usr/local -xzf go1.11.2.linux-amd64.tar.gz

结束

服务器发回了不可路由的地址

今天突然反馈说硬件ftp无法下载了,这期间没有动过相关的部分。于是开始测试分析。

在filezilla中,发现了如下的日志:

服务器发回了不可路由的地址。使用服务器地址代替。

但是可以正常下载。但是硬件设备就无法下载文件。

网上一堆相同的文章和改客户端为主动方式的解决方案,基本无用。

仔细分析,应该还是这个提示在硬件中有影响,打开详细日志,能看到更多信息:

响应: 227 Entering Passive Mode (0,0,0,0,39,62).
状态: 服务器发回了不可路由的地址。使用服务器地址代替。

本能想就应该是指0.0.0.0这个地址了。

据此为线索搜索如下:
https://stackoverflow.com/questions/41046707/vsftpd-returns-0-0-0-0-in-response-to-pasv

https://serverfault.com/questions/821025/vsftpd-passive-reply-with-0-0-0-0-address-even-with-correct-pasv-address

最终修改配置文件:

#connect_from_port_20=YES
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10050
pasv_address=1.2.3.4
pasv_addr_resolve=YES
pasv_promiscuous=YES
listen_ipv6=NO
listen=YES

其中1.2.3.4是云主机的外网地址,不是本机网卡地址。

测试通过,硬件又恢复了。说明硬件也是实现的是pasv方式的ftp获取。

造成这个可能原因:
根据上面的两个帖子,这个问题可能是IPV6环境下的bug

php下使用redis

php下使用redis

client的选择

先去官网看了下php的client支持,选择了:https://github.com/hiproz/php-redis-client
根据文档描述,只支持到redis4.0,所以我们需要安装redis4.0

安装redis4.0

下载 redis4.0

编译:

$ wget http://download.redis.io/releases/redis-5.0.0.tar.gz
$ tar xzf redis-5.0.0.tar.gz
$ cd redis-5.0.0
$ make

编译完成后,执行文件就在 src目录下,启动redis server

src/redis-server

安装好后,就可以用本地内置的client来测试:

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

开机服务自启动

make install 后,reids在源码的util目录下提供了可以直接创建系统service的脚本install_server.sh。直接执行,就可以安装成系统服务:

[root@sz-svr1 utils]# ./install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] 
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli

设置成开机自启动:

[root@sz-svr1 /]# systemctl enable redis_6379
redis_6379.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig redis_6379 on

增加密码后的停止

在设置密码后,在我们用systemctl stop redis_xxxx时,redis不会停止,一直输出:

Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...

所以我们需要在结束指令中,增加密码参数。具体修改自行参看/etc/rc.d/init.d/reids_xxxx

测试

至此,我们的环境完成了,我们执行测试代码 examples/raw_commands.php,在浏览器输入路径后,页面显示:

result: bar result: bar result: or value with spaces

观察php日志,确认代码,我们知道页面的结果是正确的。

支持php环境下的redis支持就完成了,剩下的就是码业务逻辑了。

hanve fun!

php项目的vendor依赖安装

在测试开源代码时,提示vendor/autoload.php找不到。
vendor是composer安装后的系统依赖,默认项目里面是没有的。

安装composer

wget -nc http://getcomposer.org/composer.phar
php composer.phar
mv composer.phar /usr/local/bin/composer 
composer -V

有composer环境安装vendor

一般使用composer的工程,目录下都有现成的配置文件composer.json,主要描述了工程需要的各种依赖和需求:

{
  "name": "cheprasov/php-redis-client",
  "version": "1.8.0",
  "description": "Php client for Redis. It is a fast, fully-functional and user-friendly client for Redis, optimized for performance. RedisClient supports the latest versions of Redis starting from 2.6 to 4.0",
  "homepage": "http://github.com/cheprasov/php-redis-client",
  "minimum-stability": "stable",
  "license": "MIT",
  "authors": [
    {
      "name": "Alexander Cheprasov",
      "email": "acheprasov84@gmail.com"
    }
  ],
  "autoload": {
    "psr-0": {
      "RedisClient\\": "src"
    }
  },
  "require": {
    "php": ">=5.5"
  },
  "require-dev": {
    "phpunit/phpunit": "4.8.*",
    "cheprasov/php-extra-mocks": "^1.0.0"
  }
}

我们在项目的的composer.json同级目录下执行:

composer install

正常成功后:

Writing lock file
Generating autoload files

至此,verdor目录生成

无composer环境直接安装vendor

如果没有安装过composer,也可以直接通过php安装,在项目根目录下执行(有composer.json的目录):

php composer.phar require xxx

xxx是composer.json 中的name字段。

make install的卸载

系统中yum 和make install的路径是不同的。但是由于PATH路径的优先级问题,很多时候不同场景是不同的版本在生效,导致混乱。

如果源代码没有支持uninstall,怎么干净的卸载完所有的安装包呢,没有捷径,只有本笨办法:
1. 重新编译部署一次,使用–prefix=/xxx/xxx/ 指定make install的目录: ./configure –prefix=/tmp/packname/ && make && sudo make install
2. 根据安装完后的目录层次,依次手动在现有系统中删除对应的文件。
3. 重启相关的服务。

php-fpm及mysql pdo安装

正常在系统版本兼容的情况下,只需要yum就可以全部安装:

yum install php
yum install php-fpm
yum install php-pdo
yum install php-mysql

pdo_mysql.so 驱动就在php-mysql包中。

如果yum安装的pdo_mysql加载有问题:

php -m

看不到对应的pdo_mysql,或者

php -v

有pdo_mysql相关的warning或者错误,则可以参考用源码编译:
pdo_mysql源码编译(github)

centos7下的mysql安装和开机自启动

资料整理,避免下次再浪费时间,待细化:


在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB。

1 下载并安装MySQL官方的 Yum Repository
[root@localhost ~]# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
使用上面的命令就直接下载了安装用的Yum Repository,大概25KB的样子,然后就可以直接yum安装了。

[root@localhost ~]# yum -y install mysql57-community-release-el7-10.noarch.rpm
之后就开始安装MySQL服务器。

[root@localhost ~]# yum -y install mysql-community-server
这步可能会花些时间,安装完成后就会覆盖掉之前的mariadb。

至此MySQL就安装完成了,然后是对MySQL的一些设置。

2 MySQL数据库设置
首先启动MySQL

[root@localhost ~]# systemctl start mysqld.service
查看MySQL运行状态,运行状态如图:

[root@localhost ~]# systemctl status mysqld.service

此时MySQL已经开始正常运行,不过要想进入MySQL还得先找出此时root用户的密码,通过如下命令可以在日志文件中找出密码:

[root@localhost ~]# grep “password” /var/log/mysqld.log

如下命令进入数据库:

[root@localhost ~]# mysql -uroot -p
输入初始密码,此时不能做任何事情,因为MySQL默认必须修改密码之后才能操作数据库:

mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘new password’;
这里有个问题,新密码设置的时候如果设置的过于简单会报错:

原因是因为MySQL有密码设置的规范,具体是与validate_password_policy的值有关:

MySQL完整的初始密码规则可以通过如下命令查看:

复制代码
mysql> SHOW VARIABLES LIKE ‘validate_password%’;
+————————————–+——-+
| Variable_name | Value |
+————————————–+——-+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 4 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | LOW |
| validate_password_special_char_count | 1 |
+————————————–+——-+
7 rows in set (0.01 sec)
复制代码
密码的长度是由validate_password_length决定的,而validate_password_length的计算公式是:

validate_password_length = validate_password_number_count + validate_password_special_char_count + (2 * validate_password_mixed_case_count)

我的是已经修改过的,初始情况下第一个的值是ON,validate_password_length是8。可以通过如下命令修改:

mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=1;
设置之后就是我上面查出来的那几个值了,此时密码就可以设置的很简单,例如1234之类的。到此数据库的密码设置就完成了。

但此时还有一个问题,就是因为安装了Yum Repository,以后每次yum操作都会自动更新,需要把这个卸载掉:

[root@localhost ~]# yum -y remove mysql57-community-release-el7-10.noarch
此时才算真的完成了。


关闭防火墙:
[root@localhost system]# systemctl stop firewalld.service
[root@localhost system]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.Fedoraproject.FirewallD1.service.

设置mysql的开机启动:
[root@localhost system]# systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.
[root@localhost system]# systemctl list-unit-files | grep mysqld
mysqld.service enabled

取消mysql的开机自启动:
[root@localhost system]# systemctl disable mysqld
Removed symlink /etc/systemd/system/multi-user.target.wants/mysqld.service.
[root@localhost system]# systemctl list-unit-files | grep mysqld
mysqld.service disabled

通过acme的DNS方式实现lesencrypt通配证书的自动更新

详细完整参见:https://github.com/Neilpang/acme.sh/wiki/说明

文章已经讲的很详细了,现就就DNS和通配相关的使用做简要摘录和关键步骤说明
1. 安装
curl https://get.acme.sh | sh
2. 重定向
打开 .bashrc,添加 alias acme.sh=~/.acme.sh/acme.sh ,方便命令输入
3. 默认dns是需要手动添加域名记录验证归属合法性的,通过dnspod这样的第三方平台 API,我们就可以实现自动更新的功能。

export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh   --issue   --dns dns_dp   -d *.aa.com

dnspod的token申请路径:https://www.dnspod.cn/console/user/security
4. 证书的安装
默认是在~/.acme.sh/目录下的,通过安装可以安装到我们指定的生产环境路径

acme.sh --install-cert -d *.aa.com \
--key-file       /path/domain/privkey.pem  \
--fullchain-file /path/domian/fullchain.pem \
--reloadcmd     "systemctl force-reload nginx.service"

以上相关的操作都会被acme脚本自动记录,并且在证书自动更新的时候会自动执行。
5. 证书的更新
完成以上后,acme就会自动帮你更新证书了。
6. acme.sh本身的自动更新
开启:acme.sh –upgrade –auto-upgrade
关闭:acme.sh –upgrade –auto-upgrade 0

alios vsc 插件错误

点击项目和平台时,VSC提示错误:
ENOENT: no such file or directory, scandir ‘C:\Users\xxx.aos\AliOS-Things\board’

很显然是alios-studio插件的系统路径和实际安装的不符。
在VSC中,点击设置,在右侧有”用户设置”和”工作区设置”,点击工作区设置,指定对应的路径如下:

{
  "aliosStudio.sdkPath": "xxxxx\\AliOS-Things"
}

phpadmin错误

  1. 配置文件现在需要一个短语密码
    解决:设定 libraries/config.default.php 文件的 $cfg['blowfish_secret'] 参数,参数字符串长度必须在32位以上。
  2. .$cfg[‘TempDir’] (./tmp/) 读取失败且不能建立缓存, phpMyAdmin运行速度将受影响
    解决:在phpadmin的web目录根目录下,创建缓存目录:
    sudo mkdir -m 777 ./tmp

一份VSC的本地设置

本地UI设置:

{
    "editor.tabSize": 4,
    "editor.formatOnSave": true,
    "clang-format.executable": "D:\\Program Files\\LLVM\\bin\\clang-format.exe",
    "git.path": "D:\\Program Files\\Git\\bin\\git.exe",
    "window.zoomLevel": 1,
    "explorer.confirmDelete": false,
    "git.confirmSync": false,
    "files.autoSave": "afterDelay",
    "editor.wordWrapColumn": 200
}

.clang-format 文件配置:

BasedOnStyle: llvm
BreakBeforeBraces: Linux
Language: Cpp
ColumnLimit: 0
ReflowComments: false
SortIncludes: false

#括号风格
BreakBeforeBraces: Custom
BraceWrapping:
  AfterEnum: false
  AfterStruct: false
  SplitEmptyFunction: false