进入Docker容器attach和exec方式区别

attach 与 exec 主要区别如下:

  1. attach 直接进入容器 启动命令 的终端,不会启动新的进程。
  2. exec 则是在容器中打开新的终端,并且可以启动新的进程。
  3. 如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。
发表在 服务器 | 标签为 | 留下评论

Docker镜像ubuntu安装ssh报错的解决方案

dockerubuntu镜像下安装ssh协议的时候执行安装ssh-client或ssh-server命令的时候出错。

 apt-get install openssh-client
 apt-get install openssh-server

openssh-server : Depends: openssh-client (= 1:5.9p1-5ubuntu1) but 1:5.9p1-5ubuntu1.1 is to be installed
直接提取版本运行一下命令尝试安装:

user@ken:~$sudo apt-get install openssh-client=1:5.9p1-5ubuntu1

发表在 服务器 | 标签为 , | 留下评论

Docker默认ubuntu镜像:bash: vi: command not found

docker纯净ubuntu镜像里面是没有vi命令的,敲vi命令时提示说:vi: command not found。

这时候可以安装vim替换。

这时候需要敲:apt-get update,这个命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。

等更新完毕以后再敲命令:apt-get install -y vim命令即可。

如果下载速度异常慢而且可能中端,可以配置下国内镜像源,因为还没有vi编辑功能,只能使用echo命令导入文件。

mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.163.com/ubuntu/ wily main restricted universe multiverse" >/etc/apt/sources.list
echo "deb http://mirrors.163.com/ubuntu/ wily-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb http://mirrors.163.com/ubuntu/ wily-updates main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ wily main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ wily-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/ubuntu/ wily-updates main restricted universe multiverse" >>/etc/apt/sources.list

其中wily版本根据系统修改,查看Ubuntu使用apt-get更新慢解决方法修改镜像

更新安装源

apt-get update

再执行:apt-get install -y vim安装

发表在 服务器 | 留下评论

Ubuntu使用apt-get更新慢解决方法修改镜像

因为默认使用外国镜像地址的原因,所以国内使用很多时候会感觉缓慢,更换下镜像地址即可。

1、原文件备份

cp /etc/apt/sources.list /etc/apt/sources.list.bak

2、编辑源列表文件

vim /etc/apt/sources.list

3、将原来的列表删除,添加如下内容 这里使用网易镜像地址为例,其它自己网上搜索下。

deb http://mirrors.163.com/ubuntu/ Codename main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ Codename-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ Codename-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ Codename-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ Codename-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ Codename main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ Codename-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ Codename-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ Codename-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ Codename-backports main restricted universe multiverse

以上的配置中,表明版本的就是关键字“Codename”,这是Ubuntu表示版本的一种形式(Ubuntu称其为Codename),它即对应了一个发行版。版本号和Codename的对应关系如下表。这里只需要将上面的Codename字符串替换为下文中具体的Codename即可。

版本 别名(codename) 发布日期
4.10 Warty Warthog(长疣的疣猪) 2004年10月20日
5.04 Hoary Hedgehog(灰白的刺猬) 2005年4月8日
5.10 Breezy Badger(活泼的獾) 2005年10月13日
6.06 Dapper Drake(整洁的公鸭) 2006年6月1日(LTS)
6.10 Edgy Eft(急躁的水蜥) 2006年10月6日
7.04 Feisty Fawn(坏脾气的小鹿) 2007年4月19日
7.10 Gutsy Gibbon(勇敢的长臂猿) 2007年10月18日
8.04 Hardy Heron(耐寒的苍鹭) 2008年4月24日(LTS)
8.10 Intrepid Ibex (勇敢的野山羊) 2008年10月30日
9.04 Jaunty Jackalope(得意洋洋的怀俄明野兔) 2009年4月23日
9.10 Karmic Koala(幸运的考拉) 2009年10月29日
10.04 Lucid Lynx(清醒的猞猁) 2010年4月29日
11.10 Oneiric Ocelot(梦幻的豹猫) 2010年10月13日
11.04 Natty Narwhal(敏捷的独角鲸) 2011年4月28日
12.04 Precise Pangolin(精准的穿山甲) 2012年的4月26日(LTS)
12.10 Quantal Quetzal(量子的绿咬鹃) 2012年的10月20日
13.04 Raring Ringtail(铆足了劲的猫熊) 2013年4月25日
13.10 Saucy Salamander(活泼的蝾螈) 2013年10月17日
14.04 Trusty Tahr (可靠的塔尔羊) 2014年4月18日 (LTS)
14.10 Utopic Unicorn(乌托邦独角兽) 2014年10月23日
15.04 Vivid Vervet (活泼的小猴) 2015年4月
15.10 Wily Werewolf (狡猾的狼人) 2015年10月
16.04 Xenial Xerus (好客的非洲地松鼠) 2016年4月 (LTS)
16.10 Yakkety Yak(牦牛) 2016年10月
17.04 Zesty Zapus(开心的跳鼠) 2017年4月
17.10 Artful Aardvark(机灵的土豚) 2017年10月
18.04 Bionic Beaver(仿生海狸) 即将发布2018年4月(LTS)

如何检查当前版本codename

可以使用如下命令:
root@virtual-machine:/# lsb_release -a
 No LSB modules are available.
 Distributor ID: Ubuntu
 Description: Ubuntu 16.04.1 LTS
 Release: 16.04
 Codename: xenial

4、运行sudo apt-get update

附带163镜像说明:http://mirrors.163.com/.help/ubuntu.html

发表在 服务器 | 标签为 | 留下评论

docker下安装ubuntu以及ssh服务进行链接

docker像虚拟机vps一样安装玩转系统。

1、安装ubuntu系统

在docker的hub仓库中,有专门的ubuntu系统。我们直接用使用就可以了。

docker search ubuntu

2、选择要拉下了的镜像

docker pull ubuntu

这里可以很很慢,因为镜像是在国外。使用镜像加速就可以了。

在/etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。如果没有文件,则新建一个。键值如下:

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

重启服务: service docker restart 。

3、下载完毕后,查看镜像:

docker images

4、运行容器

docker run --name iubuntu -t -i -d -p 3316:22 ubuntu

参数: –name 指定生成的容器的名称
-i: 以交互模式运行容器,保证容器中STDIN是开启的。通常与 -t 同时使用;
-t: 为容器重新分配一个伪tty终端,通常与 -i 同时使用;
-d: 后台运行容器,并返回容器ID;
-p:可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器。支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort。
ubuntu 则是镜像名称,镜像ID也可以的。

5、进入容器终端安装ssh服务

docker exec -t -i [容器名orID]  /bin/bash
  • 1

安装ssh服务(默认为root权限用户):

  • 先执行更新
     apt-get update
  • 安装ssh-client命令
     apt-get install openssh-client
  • 安装ssh-server命令
     apt-get install openssh-server
  • 安装完成以后,先启动服务
     /etc/init.d/ssh start

启动后,可以通过“ps -e|grep ssh”查看是否正确启动。

 

  • 最后编辑sshd_config文件
    vim  /etc/ssh/sshd_config

    将PermitRootLogin xxxx-password 改为 PermitRootLogin yes。
    如果没有vim,先apt-get install vim。

  • 重启ssh服务
    service ssh restart
  • 设置ssh密码
    passwd root
  • 查看容器ip:
    apt-get install net-tools

    然后输入ifconfig,查看容器ip。

    6、ssh链接容器中的系统

    退出容器终端exit。
    在宿主机中,docker ps -a 命令中可以查看到容器的端口。在宿主机中,可以使用localhost进行登录,也可以使用刚才ifconfig查看的ip进行登录。

    ssh root@localhost -p 3316

    如果要从外部进行登录,就要使用宿主机的ip,端口不变。这样我们的任务就完成了。接下来,就可以自由玩耍服务器了。

    ssh root@x.x.x.x -p 3316

    x.x.x.x就是宿主机的ip地址。

    7、提交更改的镜像

    刚刚我们对容器进行了安装,可以如果删掉话。每次都要重新执行上面的操作,所以可以对镜像进行提交保存。

    docker commit  [改变了的容器的ID]  [REPOSITORY:TAG]

 

发表在 服务器 | 标签为 | 留下评论

CentOS和Ubuntu安装Docker的方法

老听说人docker,这两天就来试试看,发现最终用起来和虚拟机vps很像,肤浅认为对硬件和系统各个层面控制不同。

前提条件 

在root权限下,通过 uname -r 命令查看你当前的内核版本

Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。

apt-get update
apt-get install -y docker.io

//docker.io ismaintained by Ubuntu
//docker-engine ismaintained by Docker

Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。

yum -y install docker-io

容器常用命令

service docker start //启动docker服务
service docker stop //停止docker服务
service docker restart //重启docker服务

docker info 或者 docker version 查看安装的信息

二、 docker常用命令

1、docker inspect [容器名orID]/[镜像名orID] //检查镜像或者容器的参数,默认返回 JSON 格式

//获得容器IP
docker inspect cocky_hermann | grep IPAddress
//将容器的8000端口映射到docker主机的8001端口
iptables -t nat -A  DOCKER -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:8000

2、docker logs [容器名orID] //获取容器运行时的输出日志

-f 跟踪容器日志的最近更新;
-t 显示容器日志的时间戳;
–tail=”10” 仅列出最新10条容器日志。

3、查看容器目录

docker ps   //查看正在运行的容器
docker ps -a  //查看所有的容器,包括已经停止的

4.查看镜像目录

docker images

5、启动、杀死、停止、删除(删除容器必须先停止,再执行删除)容器

docker start [容器名orID]
docker kill  [容器名orID]
docker stop  [容器名orID]
docker rm    [容器名orID]

6、删除镜像(需要先删除容器,再删镜像)

docker rmi  [镜像名orID]
//强制删除
docker rmi -f <imageID>
//删除所有none镜像
docker rmi $(docker images | grep "none" | awk '{print $3}') 
//删除所有镜像
docker rmi $(docker images -q)

7、查看一个镜像的历史

docker history  [镜像名orID]

8、启动容器

  • 启动容器并启动bash(交互方式):
    docker run -i -t [镜像名orID] /bin/bash
  • 启动容器以后台方式运行(更通用的方式):
    docker run -d -it  [镜像名orID]

9、附着到容器

  • 附着到正在运行的容器:
    docker attach [容器名orID]
  • 进入正在运行的容器内部,同时运行bash(比attach更好用):
    docker exec -t -i [容器名orID]  /bin/bash

10、从dockerhub检索image

docker search [镜像名]

11、拉取、下载镜像

docker pull [镜像名]

这里可能很慢,因为镜像是在国外。使用镜像加速就可以了。

在/etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。如果没有文件,则新建一个。键值如下:

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

12、发布镜像

docker push <namespace>/<image name>

13、查看docker基础信息

  • 查看docker版本:
    docker version
  • 查看docker系统的信息
    docker info

14、构建docker镜像

  • 通过commit提交改变构建镜像
    docker commit  [改变了的容器的ID]  [REPOSITORY:TAG]

    如:docker commit 6282cee20e5b anumbrella/ubuntu
    当然还可以更详细一点:
    docker commit -m=”add ssh” –author=”anumbrella” 6282cee20e5b anumbrella/ubuntu:ssh

  • 通过Dockerfile来构建镜像
    docker build -t [REPOSITORY:TAG] -f [Dockerfile文件]  [Dockerfile目录]

    如: docker build -t anumbrella/ubuntu:ssh -f /docker/ubuntu/Dockerfile /docker/ubuntu

15、保存、加载docker镜像

保存镜像

docker save [OPTIONS] IMAGE [IMAGE...]

将docker的镜像打包保存下载下来。
如:
docker save -o myUbuntu.zip anumbrella/ubuntu:ssh
也可以使用
docker save anumbrella/ubuntu:ssh>myUbuntu.zip

加载镜像

docker load [OPTIONS] IMAGE [IMAGE...]

如:
docker load -i myUbuntu.zip
也可以使用
docker load < myUbuntu.zip

//打包镜像
docker save -o python-achievements-image.tar.gz <imageName>
//加载镜像
docker load -i python-achievements-image.tar.gz

docker hub

//登录docker hub,输入用户名userName密码登录
docker login
//退出
docker logout
//命名镜像
docker tag <imageName> <userName>/<imageName>
//发布镜像,在docker hub创建仓库imageName
//构建镜像。将某个容器提交到本地仓库。无需拷贝完整的id,通常来讲最开始的三至四个字母即可区分
docker commit <containerId> <userName>/<imageName>
//将本地仓库推送到远程仓库
docker push <userName/imageName>

//发布镜像后,镜像保存在自己的用户名下,根据用户名可查询所有镜像,然后pull相应的镜像
docker search coldchains

NAME                             DESCRIPTION   STARS     OFFICIAL   AUTOMATED
coldchains/python_achievements                 0                    
coldchains/python-mysql                        0

在容器中的操作

//退出容器并关闭
exit
//退出容器不关闭
control+P+Q

发表在 服务器 | 标签为 | 留下评论

git删除远程分支后,本地依然能看到的解决办法

今天切换分支后,发现很多远程已经删除的分支在本地依然可以看到。

使用命令 git remote show origin,可以查看remote地址,远程分支,还有本地分支与之相对应关系等信息。

分支状态 (use 'git remote prune' to remove)

此时我们可以看到那些远程仓库已经不存在的分支,根据提示,使用 git remote
prune origin
 命令来同步删除了那些远程不存在的分支。

发表在 服务器 | 标签为 | 留下评论

yii2自带官方queue队列模块使用方法

今天为了熟悉yii2队列模块如何,查了下官方有,首先要安装扩展插件,在项目目录命令行模式下执行以下代码:

php composer.phar require --prefer-dist yiisoft/yii2-queue

或者添加以下内容

"yiisoft/yii2-queue": "~2.0"

到composer.json文件里面,然后执行composer update。

添加配置在common\config公共目录下的main.php或main-local.php选择一个加入以下内容。其中队列保存信息可以选择file,redis,db等各种数据存储方式,这里首先选择文件方式,其它根据自己需求选择测试。

<?php
return [
    'components' => [
        'redis' => [
            'class' => 'yii\redis\Connection',
            'hostname' => '192.168.0.100',
            'port' => 6379,
            'database' => 0,
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'queue' => [//队列文件方式
            'class' => \yii\queue\file\Queue::class,
            'as log' => \yii\queue\LogBehavior::class,//错误日志 默认为 console/runtime/logs/app.log
            'path' => '@console/runtime/queue',//这样控制台才能操作到
            //'path' => '@runtime/queue',
        ],
        /*'queue' => [//队列redis
            'class' => \yii\queue\redis\Queue::class,
            'redis' => 'redis', // 连接组件或它的配置
            'channel' => 'queue', // Queue channel key
        ],*/
    ],
    'bootstrap' => [
        'queue', // 把这个组件注册到控制台
    ],
];

接着就要创建相关文件了

首先在common\components公共目录下创建Job.php文件,内容如下,队列执行的任务类,让这个类实现 \yii\queue\JobInterface 接口就可以了。

<?php
/**
 * Created by PhpStorm.
 * User: ken
 * Date: 2018/7/12
 * Time: 16:19
 */

namespace common\components;
use yii\base\BaseObject;


class Job extends BaseObject implements \yii\queue\JobInterface
{
    public $url;
    public $file;

    public function execute($queue)
    {
        file_put_contents($this->file, file_get_contents($this->url));
    }
}

然后就在项目任意控制器下,添加以下内容来添加队列的内容:测试环境是windows

use common\components\Job;
public function actionJob(){
   //添加任务到队列
   Yii::$app->queue->push(new Job([
   'url' => 'http://img.netpc.com.cn/2018/06/12080502tmd.jpg',
   'file' => 'c:\1.jpg',
   ]));
   // 将作业推送到队列并获得其ID
   $id=Yii::$app->queue->delay(1 * 30)->push(new Job([
      'url' => 'http://img.netpc.com.cn/2018/06/12080502tmd.jpg',
      'file' => 'c:\2.jpg',
   ]));
   // 这个作业等待执行。
   //Yii::$app->queue->isWaiting($id);
   // Worker 从队列获取作业,并执行它。
   //Yii::$app->queue->isReserved($id);
   // Worker 作业执行完成。
   //Yii::$app->queue->isDone($id);

}

执行后会在@console/runtime/queue目录下生产index.data和jobXXX.data一堆任务文件,XXX是任务编号。

添加完队列后就要来执行它了,命令行下控制台执行队列worker,windows下是运行cmd,对应项目目录下,执行以下命令。当执行成功一个任务后会删除对应文件同时更新index.data文件。

yii queue/clear//清空初始化

yii queue/run// 执行

yii queue/listen //监听队列

yii queue/info来//队列状态

其它内容可以参考官方网址:

https://github.com/yiisoft/yii2-queue/blob/master/docs/guide-zh-CN/README.md

 

发表在 服务器 | 标签为 , | 留下评论

yii2命令行控制台Console操作

有时候php需要在命令行下来完成一些操作,这时候就需要命令行控制台来协助你完成了。在项目目录上创建console\controllers\indexController.php文件,复制以下代码直接运行就能看到效果了。

<?php
/**
 * Created by PhpStorm.
 * User: ken
 * Date: 2018/7/17
 * Time: 20:08
 */

namespace console\controllers;
use yii\helpers\Console;
use yii\console\Controller;

class IndexController extends Controller{
    public function actionIndex(){

        //进度条效果
        Console::startProgress(0, 100);
        for ($n = 1; $n <= 100; $n++){
            usleep(100); Console::updateProgress($n, 100);
        }
        Console::endProgress();

        //字体颜色 只是在linux下有效果 windows出现一堆x
        $hello = Console::ansiFormat("Hello",[Console::FG_YELLOW,Console::BG_BLUE]);//字体和背景颜色
        $world = Console::ansiFormat("World",[Console::FG_GREEN]);
        Console::output("{$hello} {$world}");

        Console::output(Console::ansiFormat("normal",[Console::NORMAL]));//正常
        Console::output(Console::ansiFormat("bold",[Console::BOLD]));//粗体
        Console::output(Console::ansiFormat("italic",[Console::ITALIC]));//斜体
        Console::output(Console::ansiFormat("underline",[Console::UNDERLINE]));//下划线
        Console::output(Console::ansiFormat("negative",[Console::NEGATIVE]));

        //用户输入
        $name = Console::input("请输入你的名字:");
        $formatName = Console::ansiFormat($name,[Console::FG_YELLOW]);
        Console::output("你的名字是:{$formatName}");

        //选择单选题
        $sex = Console::select("性别:",[1=>'男',2=>'女']);
        $formatSex = Console::ansiFormat($sex,[Console::FG_YELLOW]);
        Console::output("你的性别是:{$formatSex}");

        //对或错
        if (Console::confirm("Are you sure?")){
            Console::output("user input yes");
        }else{
            Console::output("user input no");
        }

        //必填 强行验证
        Console::prompt("你的名字",['required'=>true,'error'=>'必须输入']);
        /* 关于prompt方法主要是第二个参数进行限制,这是一个数组类型的参数,里面的值为
        required 真假,是否必须填写
        default 默认值
        pattern 正则匹配
        validator 自定义验证函数
        error 错误信息*/
    }
}
发表在 服务器 | 标签为 , | 留下评论

php在数组开头插入一个或多个元素单元

如果使用php系统自带的array_unshift() 函数将传入的单元插入到 array 数组的开头。刚好的我下表是数字,不符合需求。该函数注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。

发现官方文档下面有另外一种方法,直接使用加法还简单,按数组相加循序计算。

$someArray=array(224=>'someword1', 228=>'someword2', 102=>'someword3', 544=>'someword3',95=>'someword4');
$someArray=array(100=>'Test Element 1 ',255=>'Test Element 2')+$someArray;
 ?>

运行结果

array(
 100=>'Test Element 1 ',
 255=>'Test Element 2'
 224=>'someword1',
 228=>'someword2',
 102=>'someword3',
 544=>'someword3',
 95=>'someword4'
 );

注意相同key是会被覆盖的。

发表在 服务器 | 标签为 | 留下评论