美文网首页
Docker使用

Docker使用

作者: 某言 | 来源:发表于2018-03-06 17:05 被阅读0次

    首先,了解了下,我直接把它看做虚拟机.

    里面有两个概念imagecontainer,image可能相当于系统的镜像,比如win7之类的,而container相当于计算机,把镜像安装在计算机中,构成了一个独立的环境.

    比如说我的linux是一个系统,它相当于运行在我linux上的一个虚拟机,项目,就运行在Docker这个虚拟机内,迁移的时候,或者部署的时候,只用动这个虚拟机就行了,里面有着成套的环境,非常方便.我甚至可以在docker的image内布置一个ubuntu系统,然后在其中跑各种环境.首先摆上两个网址供给参考:


    一 基本操作

    • 安装(环境centos6.5):先升级库,否则docker服务会启动失败,执行:
    yum upgrade device-mapper-libs
    

    之后执行下列命令来安装:

    yum install -y docker-io
    

    启动,停止,重启

    servive docker start
    servive docker stop
    servive docker restart
    

    • 安装(环境ubuntu16.06+):分别执行:
    sudo apt-get update
    sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
    curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add - 
    sudo add-apt-repository \
        "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
        $(lsb_release -cs) \
        stable"
    

    之后执行下列命令来安装:

    sudo apt-get update
    sudo apt-get install docker-ce
    

    启动,停止,重启等状态

    systemctl start docker
    systemctl stop docker
    systemctl status docker
    

    • 例子,构建自己的image:以运行一个Python2.7的flask应用为简单的例子,假定工作的目录是:/home/app,目录内有以下文件:app.py,requirements.txt,.dockerignore,Dockerfile
    # app.py 是应用文件
    from flask import Flask
    import os
    import socket
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
        html = "<h3>Hello {name}!</h3>" \
               "<b>Hostname:</b> {hostname}<br/>" \
               "<b>Visits:</b> {visits}"
        return html
    
    if __name__ == "__main__":
        app.run(host='0.0.0.0', port=8088)
    
    # requirements.txt , python应用的依赖文件
    Flask
    
    # .dockerignore 忽略加入image的文件
    README.MD
    
    # Dockerfile,docker的配置文件,按照这个来打包 
    # https://docs.docker.com上提供的版本镜像
    FROM python:2.7-slim
    
    # Set the working directory to /app
    WORKDIR /app
    
    # Copy the current directory contents into the container at /app
    ADD . /app
    
    # 运行安装依赖的命令
    RUN pip install --trusted-host pypi.python.org -r requirements.txt
    
    # 暴露端口给linux真实机器,就是flask监听的端口
    EXPOSE 8088
    
    # Define environment variable
    ENV NAME World
    
    # Run app.py when the container launches
    CMD ["python", "app.py"]
    
    

    好了之后,就要构建image虚拟机(box)(镜像),运行:

    docker build -t flask_application # 构建名字叫做flask_application的image
    

    查看image:

    docker  images # 我的centos上是如此的 运行docker可以查看相关命令
    

    运行这个image命令:

    # 将8888端口,映射到8088,外部访问时候访问8888就行
    docker run -p 8888:8088  flask_application[Image name]
    

    然后,在浏览器输入server_pi:8888,就可以看到flask返回的内容了.


    • Image的管理:有了image之后,将它提交到docker库,从其他服务器上下载下来,直接就可以用了,不需要再次部署环境.
      首先,要在docker库注册账号,然后在安装了docker并且有image的服务器上,运行:
    # 登陆docker
    docker login
    

    根据提示输入相关信息,然后,登陆成功,之后,提交自己的image:

    # 给image做版本
    docker tag [imageName] [username]/[repository]:[tag]
    docker tab flask_application docker_username/flask_application:1.0.0
    

    然后,推上去,像git:

    docker image push docker_username/flask_application:1.0.0
    

    然后就保存着了,如果其他服务器上要用,可以进入仓库,查看pull的地址,然后执行:

    # 仓库中查看到的命令和相关版本信息
    docker pull docker_username/flask_application:1.0.0
    

    确实是很方便,而且想法很新,移植性非常的强,但是还是有问题:网站可能是外国的,pull时候太慢,如果项目比较复杂,构建起来也是很麻烦单靠Dockerfile.


    二 微服务器部署例子

    每个docker容器,就是一个微小的服务器了,打包了所有的环境,使得服务器上只需要有docker,不需要配置其他的环境了,可以避免一个服务挂了,项目之间的附带影响. 比如部署一个ubuntu.

    这个后来才知道非常好的,我使用一个虚拟docker镜像ubuntu运行在我的实际的ubuntu上,然后,开通ssh的port,然后,我直接就可以使用docker的虚拟机子而不使用我正常的环境了,避免出错得很!

    1. 首先pull镜像
    docker pull ubuntu
    

    如果镜像网络太慢,可以配置成国内的镜像.首先找到docker配置文件,我的目录是:

    # centos6.5
    vim /etc/sysconfig/docker
    # 最后一行加入
    DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"
    # 重启
    service docker restart
    
    # ubuntu16.04 ,如果不存在就添加
    vim /etc/docker/daemon.json
    # 加上:
    {
      "registry-mirrors": [
        "https://registry.docker-cn.com"
      ]
    }
    # 重启
    systemctl restart docker
    

    然后保存,重启动docker服务.之后要进入ubuntu镜像,只需要:

    #  映射主机80到虚拟机80
    # 映射主机/data目录到虚拟机的/data目录
    # 运行命令行centos
    docker run -p 80:80 -v /data:/data ubuntu bash
    # ubuntu
    docker run -it ubuntu bash
    

    然后就可以当做ubuntu操作了.如果要推出bash,不是exit,而要使用:

    ctrl + p

    然后再按

    ctrl + q

    如果再次进入的话,对于ubuntu的镜像,需要运行

    docker attach container_id
    或者
    docker exec -ti container_id bash
    

    外部登陆微系统
    这个我就觉得很神奇了,相当于可以在原生系统里面可以使用多个的linux系统了,那么当时候给别人使用,也很方便的哈哈哈!
    假设我讲外部的5561端口映射到容器的22端口(默认ssh端口),执行如下启动:

    docker run -it -p 5561:22 ubuntu bash
    

    启动了镜像之后,只需要在镜像容器内安装一个ssh服务

    apt-get install openssh-server openssh-client
    

    找到配置vim /etc/ssh/sshd_config,将有PermitRootLogin的注释了,然后增加一行:

    PermitRootLogin yes
    

    之后给root用户设定密码,之后就可以从外部登陆,假设我的真实的服务器的ip是:116.11.11.13,那么登陆服务器方式就应该是:

    ssh -p 5561 root@116.11.11.13
    

    就完全像登陆上了一台真实的服务器一样操作docker的镜像容器了.


    三 常用命令

    # 从仓库(默认拉取镜像)
    git pull nginx
    # 列出镜像
    docker images
    # 列出运行镜像的container
    docker ps -a
    # 删除运行中的container
    docker rm container_id
    # 删除镜像ubuntu/centos
    docker image rm image_id / docker rmi image_id
    # 启动并且运行docker
    docker run --name container_name[容器名] -d[后台运行] 
            -p [服务器端口]:[虚拟端口] -v [服务器目录]:[虚拟机目录]
            image_name[镜像名称]
    # 切换到那个容器进行操控,exit退出
    docker exec -it container_name[容器名] bash
    # 停止,开始某容器的运行
    docker start/stop container_name[容器名] 
    # 登陆docker
    docker login
    # 将本地的某一个镜像归入某个仓库
    docker tag local_image[:tag]  repository/image_name:tag
    # 将运行的容器内的当前镜像打包生成新的镜像
    docker commit -m "statement" -a "user statement" container_id repository/image_name:tag
    

    四 docker部署nginx思路

    先摆出这条命令,就清楚多了:

    docker run -d -p 8765:80 --name nginx_server 
            -v /home/app/docker/nginx/html/:/usr/share/nginx/html/ 
            -v /home/app/docker/nginx/conf/sites-enabled/:/etc/nginx/conf.d/ 
            nginx
    

    因为配置nginx主要是两个方面:1.项目的目录,2.nginx的配置文件,所以,为了方便,需要做映射,上面的每个参数-v都是映射,将本机的目录映射到虚拟机内,而且每次修改文件要重新创建才起作用,如果要进入虚拟机的脚本,运行命令docker exec nginx_server bash就可进入交互页面.启动或者停止容器,只要用名子运行就可以了docker ngixn_server start/stop


    五 dockerhub的push上云端

    dockerhubgithub一样,可以把自己的环境镜像推送上去保存.重点是,它保存的是镜像,就是软件运行的环境,而不是代码,只是环境
    首先得有一个dockerhub的账号: docker镜像仓库链接.
    之后,在命令行输入:

    docker login
    

    登录后,比如我的镜像是nginx,那么,我先制作标签

    # docker tag image:tag [original image style] user_name/image:tag
    # 作用是生成自己的版本,设定自己的仓库,以方便推,nginx的直接推是不行的,会得到deny回应
    docker tag nginx [拉下来的默认是这个,没有tag] login_name/warehouse
    

    之后推送镜像

    docker push username/warehouse
    

    就可以吧项目推送到dockerhub的仓库中供给到处使用了

    经过实际的测试,我的ubuntu的docker镜像是18.04的,我的linux系统是16.04的,我在docker镜像里面安装了依赖和一些软件.当我push上dockerhub,然后,我在centos6.5拉下来,我的镜像无法运行,报错:fatal:kernal too old,就是核心组件太老,无法支持我的镜像了.在ubuntu16.04上拉下来之后,是可以正常使用的.


    六 docker容器生成新镜像

    docker commit -a "user statement" -m "statement"  container_id repsitory/image_name:tag
    

    七 little cookies

    有的东西不好归类,在此处说明

    1. 给已经在容器里面run着的镜像添加端口
      没看到有啥子方法能够补充添加的,能做的都只是要关闭容器,删除容器,重新run起来一个镜像,在run 的时候规定,如果容器里面安装了很多程序,可就麻烦了,只能转化一下思路了,思路就是:先把这个容器做成一个镜像,然后就保存了此个容器的状态在一个image中,然后,再重新运行这个image,顺便增加端口.删除原来的容器和镜像即可

    相关文章

      网友评论

          本文标题:Docker使用

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