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是会被覆盖的。

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

php里??和?:的区别

php语法:
$c=$a??$b;等同于 $c=isset($a)?$a:$b;
$c=$a?:$b;等同于 $c=$a?$a:$b;

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

kartik-v/yii2-widget-fileinput删除前询问提示事件

最近使用kartik-v/yii2-widget-fileinput结合yii2做项目来实现单图、多图上传图片,异步同步删除图片还是不错的,带预览功能。找了半天网上都没有,应该很少人用吧,最后发现官网有文档。下面红色部分代码处理:

<?php $form = ActiveForm::begin(["options" => ["enctype" => "multipart/form-data"]]);  ?>
<?php
echo $form->field($comment_image_model, 'image[]')->label('点评图')->widget(FileInput::classname(), [
    'options' => ['multiple' => true],
    'pluginOptions' => [
        // 需要预览的文件格式
        'previewFileType' => 'image',
        // 预览的文件
        'initialPreview' => $p1,
        // 需要展示的图片设置,比如图片的宽度等
        'initialPreviewConfig' => $p2,
        // 是否展示预览图
        'initialPreviewAsData' => true,
        //是否重写初始化的图片
        'overwriteInitial'=>false,
        // 异步上传的接口地址设置
        'uploadUrl' => Url::toRoute(['image-upload']),
        // 异步上传需要携带的其他参数,比如商品id等
        'uploadExtraData' => [
            'goods_id' => $id,
        ],
        'uploadAsync' => true,
        // 最少上传的文件个数限制
        'minFileCount' => 1,
        // 最多上传的文件个数限制
        'maxFileCount' => 10,
        // 是否显示移除按钮,指input上面的移除按钮,非具体图片上的移除按钮
        'showRemove' => false,
        // 是否显示上传按钮,指input上面的上传按钮,非具体图片上的上传按钮
        'showUpload' => true,
        //是否显示[选择]按钮,指input上面的[选择]按钮,非具体图片上的上传按钮
        'showBrowse' => true,
        // 展示图片区域是否可点击选择多文件
        'browseOnZoneClick' => true,
        // 如果要设置具体图片上的移除、上传和展示按钮,需要设置该选项
        'fileActionSettings' => [
            // 设置具体图片的查看属性为false,默认为true
            'showZoom' => true,
            // 设置具体图片的上传属性为true,默认为true
            'showUpload' => true,
            // 设置具体图片的移除属性为true,默认为true
            'showRemove' => true,
        ],
    ],
    // 一些事件行为
    'pluginEvents' => [
        // 上传成功后的回调方法,需要的可查看data后再做具体操作,一般不需要设置
        "fileuploaded" => "function (event, data, id, index) {
            console.log(data);
        }",
        "filebeforedelete" => "function (event, data, id, index) {//找了半天 官网有文档 应该很少人用
            var aborted = !window.confirm('你确定要删除该图片吗?');
            if (aborted) {
                //window.alert('File deletion was aborted! ');
            };
            return aborted;
        }",
    ],
]);
?>

附带官网地址

事件说明
http://plugins.krajee.com/file-input/plugin-events#filebeforedelete

事件演示

http://plugins.krajee.com/file-plugin-methods-demo#delete-validation-1

http://plugins.krajee.com/file-plugin-methods-demo#delete-validation-2

有问题留言。

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

Yii 2.0 dropDownList无法默认选择

今天使用使用ActiveForm小部件dropDownList表单。以为在后面的选项加入id选择值

<?= $form->field($model, 'member_id')->dropDownList($member,
[
    '1' => ['selected' => 'selected']
]) 
?>

这样就可以了,其实不对,它是根据$model模型对应的字段内容来自动选择的。$model->member_id如果有id,它就会selected上了,不需要你额外赋值。

也可以一开始就选择默认值,但是不是以上参数,要用value

<?= $form->field($model, 'member_id')->dropDownList($member,
['prompt'=>'选择会员','value' => 3]) 
?>

这样就可以了,如果直接用html的dropDownList也可以

<?= Html::dropDownList( 'member_id',null,$member,
[  
 'options' => ['5' => ['selected' => true]],  
 'prompt' =>['text'=>'顶级栏目', 'options'=>['value'=>0]],  
 'style'=>'width:200px',  
]
) 
?>
发表在 服务器 | 标签为 | 留下评论

git pull时出现冲突 从远程库内容拉取强行覆盖本地代码

不知道为什么pull后,团队修改过的代码文件会和本地没有修改过的文件产生冲突,放弃本地修改。

首先删除文件或修改名称后尝试从远程拉一个下来:

git checkout — 文件路径

最后实在不行就备份好文件后整个版本恢复,切记要先备份,防止你忘记了什么文件后悔莫已。

git reset –hard origin/dev //下载某个分支
git reset –hard origin/master //把HEAD指向最新下载的主版本

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