• Docker入门


    容器主要内容:

    1 初步了解概念

    构建image镜像

    3 Service

    4 Swarm

    5 Stack

    1 初步了解概念

    什么是Docker:https://www.docker.com/what-docker

    为什么用Docker(用户案例):  https://www.docker.com/use-cases

    先大致了解几个概念:image镜像、container容器、 Repository库、 Service服务、Task任务、stack堆叠、swarm群集

    image镜像是一个只读模板,里面包含了完整的系统环境、应用程序和数据,可以理解为打包好的一个包

    container容器是image的一个实例,可以启动,停止,删除,将image载入内存跑起来就是一个container,可以将其理解为一台机器,但是这个机器不能单独存在,需要依赖于一个操作系统。

    Repository库为存image的地方,每个image镜像用标签tag区分

    Task任务:如果一个image只运行了一个container,这个正在运行中的container就可以看作是一个任务。

    Service服务:可以理解为镜像的运行方式:使用哪个端口,运行多少个副本(replicas)CPU和内存的限制,使用哪种文件系统,副本挂掉之后的处理方式等等,一个服务只运行一个镜像。

    stack堆叠:多个任务组合到一起就是一个Stack堆叠

    Swarm群集:一个或者多个主机(可以是物理机也可以是虚拟机)组成一个Swarm集群

     docker的安装见:http://www.cnblogs.com/detu/p/Docker-Installation.html

    下面我们进一步了解。

    2 构建image镜像

      2.1 通过文件搭建自己的image 镜像

    通过文件 Dockerfile来构建image

    建立自己的image

    建立空目录

    cd /tmp

    mkdir hello

    vi Dockerfile

    vi requirements.txt

    vi app.py

    这三个文件的内容见 https://docs.docker.com/get-started/part2/#apppy

     

    docker build -t friendlyhello .

    #注意 最有有一个点

    #friendlyhello是取的名字,当然也可以用其他名字

     

    构建完之后image就生成并保存在本地

    利用命令 docker image ls  查看

    node1:/tmp/hello # docker image ls

    friendlyhello       latest    00422a9450a8        8 hours ago         150 MB

      2.2 运行镜像

    用参数 -p将容器的80端口映射成主机的4000端口

    docker run -p 4000:80 friendlyhello

    或者用curl 查看

    curl http://localhost:4000

     

    运行 Ctrl+C 关闭

    后台运行

    加上参数 -d在后台运行:

    docker run -d -p 4000:80 friendlyhello

    这时想要结束需要用docker container stop < CONTAINER ID >

    先查看CONTAINER ID

    docker container ls

    CONTAINER ID        IMAGE               COMMAND             CREATED

    b5c44054f916        friendlyhello       "python app.py"     28 seconds ago

     

    结束运行:docker container stop b5c44054f916

     

      2.3 共享镜像

    上传image到docker云上。

    先登录docker cloud建立一个库

    我这里建立了一个 teslade/hello的库

    标记image名字 docker tag image username/repository:tag

    如:docker tag friendlyhello teslade/hello:part1

    docker login

    然后将image推到云上docker push username/repository:tag

    如:docker push teslade/hello:part1

    3 Service

      3.1 基本概念

    “服务”包含着这些信息:使用哪个端口,运行多少个副本(replicas)CPU和内存的限制,使用哪种文件系统,副本挂掉之后的处理方式等等,一个服务只运行一个镜像。

      3.2 利用yml文件编排service服务

    docker通过yml文件来编排这些服务

    新建一个yml文件

    vi docker-compose.yml

    version: "3"

    services:

      web:

        # replace username/repo:tag with your name and image details

        image: username/repo:tag

        deploy:

          replicas: 5

    #运行5个实例

          resources:

            limits:

              cpus: "0.1"

    #CPU限制最高为10%

              memory: 50M

    #内存限制最高为50M

          restart_policy:

            condition: on-failure

    #如果运行失败立即重启

        ports:

          - "80:80"

    #容器的80端口映射为主机的80端口

        networks:

          - webnet

    networks:

      webnet:

    在运行之前先运行docker swarm init (目的为建立一个集群,在这里为单节点集群)

    运行:docker stack deploy -c docker-compose.yml <appname>

    <appname>为给这次运行起个名字

    如:docker stack deploy -c docker-compose.yml getstartedlab

    运行后查看服务

    docker service ls

    得到ID之后查看具体信息,可以看到该服务的所有节点(副本)因为在配置文件docker-compose.yml中设置了五个任务(task)replicas: 5 所以可以看到运行了5个

    每个副本(任务task)都有一个容器与之对应。

    查看每一个副本的ID 命令为 docker service ps <service ID>

    可以查看每一个任务的具体信息

    docker inspect  <task ID>

    在这里限定格式只输出完整容器的ID

    docker inspect --format='{{.Status.ContainerStatus.ContainerID}}' <Task ID>

    如:docker inspect --format='{{.Status.ContainerStatus.ContainerID}}' gdqkw5kbr89l

     反之,可以通过容器的ID去查看任务ID

    先查看容器ID   docker container ls   然后根据容器ID查看任务ID

    docker inspect --format="{{index .Config.Labels "com.docker.swarm.task.id"}}" <container ID>

    如docker inspect --format="{{index .Config.Labels "com.docker.swarm.task.id"}}" ba6c19458795 

    docker container ls -q 只列出容器ID

     

      3.3 扩展服务应用

    通过通过改文件docker-compose.yml中replicas的值来改变运行的任务副本(同时容器的数量随之改变,有多少个任务就有多少个容器)改完值之后保存,重新运行docker s

    tack deploy -c docker-compose.yml getstartedlab 此时会更新运行的容器。再次用命令docker container ls -q查看运行的容器

     

      3.4 停止服务

    执行命令docker stack rm <appname>

    如:docker stack rm getstartedlab

     

    swarm还在运行

    docker node ls

    关闭swarm: docker swarm leave --force

     

    4 Swarm

       4.1 简介

    Swarm是Dockerd 集群(主机的集群),集群中的机器可以是物理机也可以是虚拟机,第一个加入的为管理节点。

      4.2 配置Swarm集群

    需要至少准备两台机器,这里准备了两台虚拟机node1和node2

    在第一台虚拟机上运行命令 docker swarm init 进行初始化,这个节点自动成为管理节点

    在第二台节点上运行

      docker swarm join

      --token <token>

      <ip>:<port>

    如图:

    token的内容由管理节点给出

    加入后查看节点

    在节点1上部署服务(Service)实际为部署一个stack(包含多个service)

      4.3 在Swarm集群上部署服务

    执行docker stack deploy -c docker-compose.yml getstartedlab

    docker stack ps getstartedlab

    可以看到这5个副本任务(task)分布在两个节点上,对应的容器也分布在两台机器上,执行docker container ls查看

    可以看到node1上运行了两个容器

    节点node2运行了三个容器

    其中 docker stack ls; docker service ls ; docker node ls这几个命令只能在管理节点上运行。

    到浏览器上浏览 http://localhost或者执行curl http://localhost

      4.4 调整应用:

    只需要更改docker-compose.yml的内容,然后重新执行docker stack deploy -c docker-compose.yml getstartedlab即可。

    如果需要新增节点,只需要在节点上执行以下命令

    docker swarm join

      --token <token>

      <ip>:<port>

    然后再执行docker stack deploy -c docker-compose.yml getstartedlab重新部署即可。

    节点脱离集群,执行docker swarm leave 关闭管理节点执行: docker swarm leave --force

    5 Stack

      5.1 简介

    Stack是几个service服务的集合,在yml文件中中可以编排多个service

      5.2 部署stack

    我们现在按照https://docs.docker.com/get-started/part5/ 的内容修改yml文件

    version: "3"
    services:
      web:
    # replace username/repo:tag with your name and image details
    #替换成自己的镜像名
        image: username/repo:tag
        deploy:
          replicas: 5
          restart_policy:
            condition: on-failure
          resources:
            limits:
              cpus: "0.1"
              memory: 50M
        ports:
          - "80:80"
        networks:
          - webnet
      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - "8080:8080"
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
    #需要访问主机的分区
        deploy:
          placement:
            constraints: [node.role == manager]
    #表示只能运行在管理节点上
        networks:
          - webnet
    networks:
      webnet:

    重新运行docker stack deploy -c docker-compose.yml getstartedlab

    到主机上访问http://localhost:8080/

    查看正在运行的stack

    docker stack ls

    查看更详细的信息 docker stack ps <stack ID>

    查看service: docker service ls

      5.3 保存数据到主机

    保存运行过程中产生的数据到主机

    在主机上保存容器运行的数据

    编辑yml文件

    version: "3"

    services:

      web:

    # replace username/repo:tag with your name and image details

    #改成自己的镜像名

        image: username/repo:tag

        deploy:

          replicas: 5

          restart_policy:

            condition: on-failure

          resources:

            limits:

              cpus: "0.1"

              memory: 50M

        ports:

          - "80:80"

        networks:

          - webnet

      visualizer:

        image: dockersamples/visualizer:stable

        ports:

          - "8080:8080"

        volumes:

          - "/var/run/docker.sock:/var/run/docker.sock"

        deploy:

          placement:

            constraints: [node.role == manager]

        networks:

          - webnet

      redis:

        image: redis

        ports:

          - "6379:6379"

        volumes:

          - /home/docker/data:/data

    #将/home/docker/data挂在为容器的/data

        deploy:

          placement:

            constraints: [node.role == manager]

        command: redis-server --appendonly yes

        networks:

          - webnet

    networks:

      webnet:

    redis运行时可以记录访问量,要使之能够访问主机的数据并保存下来。

    到/home/docker下创建data目录

    重新部署stack

    docker stack deploy -c docker-compose.yml getstartedlab

    再访问http://localhost 可以看到redis工作并计数

  • 相关阅读:
    Git 分支管理
    Git 保存工作区
    Git 版本控制
    Git 基本命令-详细版本
    Git 初始化配置
    Git 基本概念:分区
    JavaScript 调试
    JavaScript 错误
    JS 判断字符串是否全部为字母
    JS 判断输入字符串是否为数字、字母、下划线组成
  • 原文地址:https://www.cnblogs.com/detu/p/docker-get-started.html
Copyright © 2020-2023  润新知