Docker容器和镜像 二

作者: andpy | 来源:发表于2018-08-15 16:38 被阅读4次

    Docker Platform

    Docker提供了一个开发,打包,运行app的平台;把app和底层 infrastructure 隔离开发

    • Application
    • Docker Engine
    • Infrastructure(physical/virtual)

    图示:


    docker平台-03.png

    Docker Engine

    • 后台进程( dockerd )
    • REST API Server
    • CLI接口(docker)

    图示:


    docker engine-03.png

    Docker 结构

    底层技术支持(利用Linux)

    • Namespaces:做隔离 pid,net,ipc,mnt,uts
    • Control groups:做资源限制
    • Union file systems: Container和Image的分层

    Image

    • 文件和Meta data的集合(root filesystem)
    • 分层的,并且每一层都可以添加改变,删除文件,成为一个新的 image
    • 不同的image可以共享相同的 layer
    • image本身是 read-only的

    Image获取方式

    • dockerfile获取:从文件获取

    • pull from registry:从仓库获取
      官方地址:https://hub.docker.com/

      从docker hub拉取 image
      sudo docker pull ubuntu:18.04

    制作一个 Base Image

    添加用户docker 可以不用输入sudo命令

    sudo groupadd docker
    sudo gpasswd -a root docker
    sudo service docker restart
    #还不行的话,重新连接 xshell
    
    

    docker命令相关

    #查看 docker
    docker version
    #查看docker image
    docker image -a ls
    #拉取官方 hello-world
    docker pull hello-world
    #查看 docker image
    docker image ls
    #启动
    docker run hello-world
    
    

    制作 docker base image

    mkdir demo-image
    cd demo-image
    #创建代码文件
    vi hello.c
    
        #include<stdio.h>
        int main(){
        printf("hello demo docker\n")
        }
    
    #安装编译工具
    yum install gcc glibc-static
    #编译执行文件
    gcc -static hello.c -o hello
    
    #创建 dockerfile文件
    vi dockerfile
    
        FROM scratch
        ADD hello /
        CMD "/hello"
        
    #当前目录查找 dockerfile文件 构造
    docker build -t rao-docker-hello .
    #查看 image
    docker image ls
    
    #根据id查看构造过程
    docker history id
    
    #运行docker 容器
    docker run rao-docker-hell0
    #结果输出为 hello demo docker 即成功
    

    认识 Container

    #列出本地正在运行的容器
    docker container ls
    #列出所有的容器,包括正在运行和退出的
    docker container ls -a
    #查看 dockerfile信息
    more hello-world/dockerfile
    
    #交互式运行容器
    docker run -it centos
    # 列出所有的 image
    docker images
    #移除image
    docker image rm id
    #查看容器
    docker ps -a
    #列出所有容器 id
    docker container ls -aq
    #移除容器
    docker rm id
    

    构建 Docker image

    #移除docker image
    docker image rm id
    
    #基于一个contaienr创建一个 image
    docker container commit container_name new_image_name
    #构建镜像
    docker image build
    #查看层数
    docker history id
    

    注意:不推荐使用contaienr创建image,推荐使用 dockerfile来创建 image,可以让外部的人了解你的创建过程
    示例文件:

    FROM centos
    RUN yun install -y vim
    
    #基于当前的目录 dockerfile构造 image
    docker build -t newImageName .
    

    注意:因为image时只可读的,所以在构建的过程中,临时创建了一个临时的 container,来构造最终的 image

    #查看dockerfile
    more dockefile
    
    

    Docker File介绍

    FROM 最开始的语法,在那个base image之上制作 image,尽量使用官方的 image

    FROM scratch #制作 base image
    FROM centos  #使用base image
    FROM ubuntu:18.04
    
    

    LABEL 版本,描述等信息,类似注释信息

    LABEL maintainer ="rao@gmail.com"
    LABEL version ="1.0"
    LABEL description =" 描述信息"
    

    RUN 运行相关的命令,运行一个都会生成相应临时的 contaienr,建议合并多个命令为一个

    RUN yum updage && yum install -y vim\ python-dev #反斜杠换行
    
    

    WORKDIR 设置当前的工作目录,没有的话会自动创建test目录,用WORKDIR,不要使用 RUN cd,尽量使用绝对目录

    WORKDIR /root
    

    ADD and COPY 把本地的文件添加到 docker image里面,大部分情况下,copy优于add,add除了copy还有额外的功能(解压),添加远程文件/目录 请使用 curl 或者 wget

    ADD hello /
    
    ADD test.tar.gz / #添加到根目录并解压
    
    WORKDIR /root
    ADD hello test/ #/root/test/hello
    
    WORKDIR /root
    COPY hello test/
    

    ENV 设置常量,尽量使用env,增加可维护性

    ENV MYSQL_VERSION 5.6 #设置常量
    RUN apt-get install -y mysql-server ="${MYSQL_VERSION}" \ && rm -rf /var/lib/apt/lists/* #引用常量
    
    

    docker file 的两种写法

    两种格式

    shell格式

    RUN apt-get install -y vim
    CMD echo "hello docker"
    ENTRYPOINT echo "hello docker"
    
    

    exec格式

    RUN ["apt-get", "install", "-y", "vim"]
    CMD ["/bin/echo", "hello docker"]
    ENTRYPOINT ["/bin/echo", "hello docker"] #变量替换可能出现问题
    #修改如下
    ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]
    
    

    RUN 和 CMD 和 ENTRYPOINT

    CMD

    • 设置容器启动后默认执行的命令和参数
    • 如果docker run 制定了其它的命令,cmd命令将被忽略
    • 如果定义了多个 cmd,只有最后一个会执行

    ENTRYPOINT 设置容器启动时运行的命令

    • 让容器以应用程序或者服务的形式运行
    • 不会被忽略,一定会执行
    • 示例:
      COPY docker-test.sh /usr/local/bin/
      ENTRYPOINT ["deocker-test.sh"]
      EXPOSE 27017
      CMD["mongod"]
      

    RUN 执行命令并创建新的 Image Layer

    镜像的发布

    #登录,输入用户名,密码
    docker login
    # push image 到 docker hub
    docker push imageName:latest
    #登录 docker hub 查看
    
    # 拉取 image
    docker pull imageName
    
    

    搭建自己的registry docker hub

    文档地址:https://hub.docker.com/_/registry/

    docker run -d -p 5000:5000 --restart always --name registry registry:2
    
    #验证访问某个端口
    telnet ip:port
    # /etc/docker 创建 daemon.json 文件,因为在提交的时候,会有安全警告。
        {
            "insecure-registries":["ip:port"]
        }
    #编辑 docker 启动文件 /lib/systemd/system/docker.service,添加内容
        EnvirementFile = /etc/docker/daemon.json
    
    #重启docker服务
    sudo service docker restart
    
    #push到私有仓库 docker hub
    
    #如果让查看自己的docker hub docker提供了api的方式,查看,
    地址: https://docs.docker.com/registry/spec/api/#listing-repositories
    
    

    Docker部署flask-demo

    app.py 程序 demo

    from flask import Flask
    app = Flask(__name__)
    @app.route('/')
    def hello():
        return "hello docker"
    if __name__=='__main__'
        app.run()
    
    

    创建docker file

    FROM python2.7
    LABEL "maintainer= rao@demo.com"
    RUN pip install flask
    COPY app.py /app/
    WORKDIR /app
    EXPOSE 5000
    CMD ["python", "app.py"]
    
    

    构造 image 并运行

    #构造 docker image
    docker build -t rao-flask-demo .
    #创建 container, -d后台方式运行
    docker run -d rao-flask-demo
    #查看
    docker ps
    
    #进入运行中的容器
    docker exec -it containerId /bin/bash
    #退出容器
    exit
    #打印运行中容器中ip地址
    docker exec -it containerId ip a
    #停止容器
    docker stop containerId
    #启动容器
    docker start containerId
    #清理退出的容器
    docker rm $(docker ps -aq)
    
    #指定名字启动container
    docker run -d --name=rao imageName
    #显示container详细的信息
    docker inspect containerId
    #查看日志
    docker logs containerId
    

    创建容器的时,配置参数示例,以 stress为例

    docker run -it ubuntu
    # 压力测试工具
    apt-get update && apt-get install -y stress
    stress --vm 1 --vm-bytes 500M --verbose
    

    在创建容器的时候输入参数示例,dockerfile写法

    FORM ubuntu
    RUN apt-get update && apt-get install -y stress
    ENTRYPOINT ["/usr/bin/stress"]
    CMD []
    

    运行
    docker run ImageName --vm 1 --verbose --vm-bytes 500M #(stress相关的参数)

    配置资源限制

    #内存大小,cpu权重(所有容器的百分比)
    docker run --memory=200M --cpu-shares=2 imageName
    
    

    相关文章

      网友评论

        本文标题:Docker容器和镜像 二

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