美文网首页Docker
Docker 入门学习笔记

Docker 入门学习笔记

作者: 当时就吓死我了 | 来源:发表于2017-05-14 18:35 被阅读169次

    Docker 是目前运维必掌握技能之一,它可以将一个开发环境的部署变得非常方便,其内部是基于一个镜像创建容器,让应用程序在容器内运行的模型。
    比如,我们pull了一个Ubuntu 14.04的镜像,那么它就相当于一个“底包”,基于这个镜像,你可以开启多个容器(container),每一个容器都是一个独立的运行环境,可以运行各自的应用程序。
    下面记录一下一些基本的操作,本文适用于小白简单实践,如有错误,敬请指正。

    1. Docker的安装
      这里我采用的是daocloud的镜像源。系统为Ubuntu 16.04 LTS 64位。
      直接运行命令安装稳定版docker:
      curl -sSL https://get.daocloud.io/docker | sh
      安装完后运行
      docker -v
      可以看到docker版本

    $ docker -v
    Docker version 17.05.0-ce, build 89658be
    即安装成功。

    如果你在使用docker时遇到

    Got permission denied while trying to connect to the Docker daemon socket at     unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.29/containers/create: dial unix /var/run/docker.sock: connect: permission denied
    

    这个问题,是因为当前登录用户不在docker执行组,所以需要添加进去
    sudo groupadd docker
    sudo gpasswd -a ${USER} docker
    sudo service docker restart
    newgrp - docker
    这样就可以了。

    1. 拉取Docker镜像
      这里我们也是用daocloud的镜像源进行镜像拉取。镜像搜索地址:http://hub.daocloud.io/
      搜索完毕后查看镜像地址,比如Ubuntu14.04的地址为
    Ubuntu 14.04 docker 镜像地址
    执行命令
    sudo docker pull daocloud.io/library/ubuntu:14.04 拉取镜像成功

    同样的操作再拉取一个mongodb的镜像。

    查看当前拥有的镜像:
    sudo docker images

    查看所有镜像

    看这里已经列出刚刚拉取的两个镜像了,接下来就可以基于镜像创建容器。

    1. 创建容器,对容器简单操作
      创建容器并启动的命令是 docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
      比如,我们要启动一个简单容器(基于mongo镜像)可以执行
      sudo docker run -it 51f03b16565e /bin/bash
      此时docker会随机分配一个name给此容器并且命令窗口会进入此容器交互:

      容器交互.png
      可以看到容器内是一个精简版linux系统。
      然后我们在这里就可以像操作实体linux系统一样操作这个容器,比如查看目录,文件,开启服务等等。
      运行exit即可退出容器,回到主机命令窗口交互。

      查看当前运行以及所有容器使用命令: docker ps [-a]
      查看所有容器
      那么,到这里我们可以看到这个容器的一些状态和信息,本身的container id,基于的image id, 交互命令,创建时间,当前运行状态,端口映射,别名等。
      如果我想要重新启动这个容器,怎么办呢?
      sudo docker start 49addd9c43a3 就可以了,同理你也可以stop它。
      但是执行完毕后,并没有像run那样直接进入容器内交互,要想再进入容器中进行交互需要:
      sudo docker attach 49addd9c43a3即可,当然这得需要容器已经运行才可以。
      那串数字就是容器id,所以你会发现每次都用id很麻烦,name就派上用场了。
      我们可以在创建新容器启动时就赋予它一个别名用来代替id进行后续操作。

      重新启动一个新的容器如下:
      sudo docker run -it --name mongo 51f03b16565e /bin/bash
      再次查看sudo docker ps -a
      设置容器name
      可以看到,这个容器拥有了我们指定的别名“mongo”。有了这个名字,上面的命令中用到container id的地方就可以用这个别名来替代,是不是方便了许多。
    2. 在容器内开启mongo服务并将端口映射到宿主端口
      如果我们不做端口映射,那么容器只会出现下图PORTS这样,宿主机是访问不到容器的。

      端口未映射
      所以我们需要映射,容器端口映射可在创建时加上port参数-p。
      先将之前的容器删除,使用 rm
      sudo docker stop mongo
      sudo docker rm mongo
      重新开启端口映射的守护式容器
      sudo docker run -itd -p 27016:27017 --name mongo 51f03b16565e /bin/bash
      其中
      -d是指开启守护式容器,就是直接在后台运行,不进入容器交互shell
      -p参数就是我们的端口映射,参数为hostPort:containerPort,可以加多个映射。
      结果如下:
      开启端口映射
      这样就实现了宿主机27016端口映射到容器内27017端口。
      下面我们用简单的php程序来验证我们的端口映射成功。用宿主机php-mongo驱动连接27016端口,看是否可以用到容器内的27017即mongo服务
      本文所用工具为php7.1 + nginx 1.10 + mongodb3.4.4
      php 7.1mongodb驱动与php7之前的mongo驱动有变动,并非之前的php-mongo扩展,请使用pecl安装最新驱动。安装好的标志是,进入phpinfo()页面可以看到mongo驱动在列表中。如下图
    php7.1-mongodb驱动安装成功
    编写php程序,连接mongodb并写入一些数据,这里就直接用菜鸟教程中的示例代码:
    <?php
        // 连接数据库
        $manager = new MongoDB\Driver\Manager("mongodb://localhost:27016");
        // 插入数据
        $bulk = new MongoDB\Driver\BulkWrite;
        $bulk->insert(['x' => 1, 'name'=>'菜鸟教程', 'url' => 'http://www.runoob.com']);
        $bulk->insert(['x' => 2, 'name'=>'Google', 'url' => 'http://www.google.com']);
        $bulk->insert(['x' => 3, 'name'=>'taobao', 'url' => 'http://www.taobao.com']);
        $manager->executeBulkWrite('test.sites', $bulk);
    ?>
    

    注意这里的端口并非mongodb默认端口27017,而是宿主机的27016端口,而27016映射到我们的docker中的27017,所以如果这里程序可以连接成功,说明我们的端口映射成功,即在外部宿主机即可向容器内mongodb数据库中写入数据
    接下来,看结果:
    直接将之前创建好的mongo docker启动,并进入开启其mongod服务,等待外部php程序执行写操作。

    sudo docker start mongo
    sudo docker ps
    
    docker mongo已启动,端口已映射

    进入交互界面,启动mongod服务(即打开27017端口服务):

    sudo docker exec -it mongo /bin/bash
    nohup mongod &
    mongo
    
    容器启动mongod成功
    (当然这里启动mongod也可以不进入shell启动,直接在exec命令后加上shell命令即可,如
    sudo docker exec -it mongo /bin/bash nohup mongod &就可以了,
    如想查看数据库内容,直接sudo docker attach mongo 就可以再次进入容器交互,查看数据)

    好,服务启动完毕,执行上面的php代码,无报错。查看mongodb内容
    show dbs
    发现多了一个test库,查看此库
    use test
    show tables
    

    发现多一张表,查看其中数据
    db.sites.find().pretty()

    数据已成功插入!
    至此,我们用简单的程序验证了docker 容器端口映射的实践,这对多容器服务非常重要。

    如有错误,敬请指正~

    相关文章

      网友评论

        本文标题:Docker 入门学习笔记

        本文链接:https://www.haomeiwen.com/subject/clvqxxtx.html