Blog

  • Dockerfile

    CMD

    CMD 是 docker 启动时运行的命令,在 Dockerfile 中只能指定一条 CMD 命令

    EXPOSE

    暴露端口

  • docker 镜像

    查看本地 docker 镜像

    docker images

    查看 repositories

    curl -XGET http://127.0.0.1:5000/v2/_catalog

    查找 registry 中的镜像

    docker search ansible

    删除所有镜像

    docker rmi `docker images -a -q`
  • 运行docker容器

    运行一个 centos 容器
    The -i and -t flags can be passed to the exec command to keep an interactive shell open, and you can specify the shell you want to attach after the container ID.

    [root@localhost ~]# docker run  -i -t centos /bin/bash
    Unable to find image 'centos:latest' locally
    latest: Pulling from library/centos
    8d30e94188e7: Pull complete 
    Digest: sha256:2ae0d2c881c7123870114fb9cc7afabd1e31f9888dac8286884f6cf59373ed9b
    Status: Downloaded newer image for centos:latest
    

    运行 docker 以 daemon 方式运行,host 开放端口 5001,对应容器内端口 5000
    The -p means “publish ports”

    docker run -d -p 5001:5000 python-flask
    

    查看信息

    docker info
    Containers: 1
     Running: 0
     Paused: 0
     Stopped: 1
    Images: 1
    

    查看容器列表

    docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    ebf5f9bf4bc9        centos              "/bin/bash"         16 minutes ago      Exited (0) 7 minutes ago                       furious_leakey
    

    查看 docker 运行的 log

    docker logs  furious_leakey

    探测 docker 更详尽信息,json 输出

    docker inspect furious_leakey

    退出后的容器是 stopped 状态,现在根据名字 furious_leakey 启动它

    docker start furious_leakey

    通过 shell 进入到容器中

    docker attach furious_leakey

    上面运行的容器是交互式容器

    docker工作目录在

    /var/lib/docker/

    容器存放在

    /var/lib/docker/containers

    删除所有 docker 容器

    docker rm `docker ps -a -q`

    进入到运行中的 docker

    docker exec -i -t 82d98bdf2d77046ce52a61f2bab27465db868a97faebe94a83581fc0322e4c26 /bin/bash

    docker ps 只显示容器名

    docker ps -a --format '{{ .Names }}'
    

    docker 及对应的所有 ip

    docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}} {{.IPAddress}} {{end}}' $(docker ps -aq)
    
  • centos7 docker 安装

    在 centos7 下,安装

    curl -s https://get.docker.com/ | sh

    启动并设置开机启动

    systemctl start docker.service
    systemctl enable docker.service
    

    检查 docker 状态

    docker info
    systemctl status docker
  • 身份证号构成

    18位身份证号码

    第7、8、9、10位为出生年份(四位数)
    第11、第12位为出生月份
    第13、14位代表出生日期
    第17位代表性别,奇数为男,偶数为女。
  • nodejs

    node 04
    Modules
    Semantic Versioning
    version patch
        “connect”: “~2.2.1”,
        “underscore”: “~1.3.3”
    node 03
    streams
    curl –upload-file abc.jpg http://localhost:3000
    node 01
    fs.readFileSync
    fs.readFile(‘/etc/hosts’, function(){});
    setTimeout(function(){ console.log(“here we go”)}, 5000); // 等 5000ms 再运行 function
    non-blocking
    epxress 05
    route instances
    app.route()
    chaining function
    single application file is too long
    extracting routes to modules
    var router = express.Router();
    set router as a express module
    module.exports = router;
    var router = express.Router();
    router.route(‘/’);
    app.use(‘/cities’, router);
    router.route(‘/’)
      .get(function (request, response) {
        if(request.query.search){
          response.json(citySearch(request.query.search));
        }else{
          response.json(cities);
        }
      })
      .post(parseUrlencoded, function (request, response) {
        if(request.body.description.length > 4){
          var city = createCity(request.body.name, request.body.description);
          response.status(201).json(city);
        }else{
          response.status(400).json(‘Invalid City’);
        }
      });
    router.route(‘/:name’)
      .get(function (request, response) {
        var cityInfo = cities[request.cityName];
        if(cityInfo){
          response.json(cityInfo);
        }else{
          response.status(404).json(“City not found”);
        }
      })
      .delete(function (request, response) {
        if(cities[request.cityName]){
          delete cities[request.cityName];
          response.sendStatus(200);
        }else{
          response.sendStatus(404);
        }
      });
    What function would you call to match all HTTP verbs?
    app.all()
    express 04
    post & delete
    body-parser
    app.delete(‘/blocks/:name’, function(request, response){});
    response.sendStatus(200);
    express 03
    handle routes
    response.json();
    /blocks?limit=1
    use request.query to access query strings
    blocks.slice(1, 3)  from 1 , 3 items
    response.status(404).json(‘No description found for ‘ + request.params.name)
    maps placeholders to callback functions, and is commonly used for running pre-conditions on Dynamic Routes
    app.param(‘name’, function(request, response, next){
    });
    javascript
    array ->   blocks = [‘Fixed’, ‘Movable’, ‘Rotating’];
    object ->  blocks = {
        ‘Fixed’: ‘description 1’,
        ‘Movable’: ‘description 2’,
        ‘Rotating’: ‘description 3’
    }
    for object , use Object.keys(blocks) get all keys of objects.
    express 02
    response.sendFile(__dirname + ‘/public/index.html’);
    express 的 static middleware
    middleware 用于检验,认证,数据解析
    app.use(express.static(‘public’));
    当调用一个 middleware ,可以加一个 next 调用下一个 middleware
    app.use(function(request, response, next) {
        next();
    });
    到最后一个 middleware,没有 next 则响应一个 done
    app.use(function(request, response, next){
        response.send(‘done!’);
    });
    express 使用 ajax 返回
    express 01
    安装 node 并指定版本
    npm install [email protected]
    response.send();
    blocks = [“a”, “b”, “c”];
    response.send(blocks);
    curl 查看 header 会发现自动解析成 json
    等同于
    response.json(blocks);
    302跳转
    response.redirect(‘/parts’);
    301跳转
    response.redirect(301, ‘/parts’);