zoukankan      html  css  js  c++  java
  • 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工作并计数

  • 相关阅读:
    eslint 的 env 配置是干嘛使的?
    cookie httpOnly 打勾
    如何定制 antd 的样式(theme)
    剑指 Offer 66. 构建乘积数组
    剑指 Offer 65. 不用加减乘除做加法
    剑指 Offer 62. 圆圈中最后剩下的数字
    剑指 Offer 61. 扑克牌中的顺子
    剑指 Offer 59
    剑指 Offer 58
    剑指 Offer 58
  • 原文地址:https://www.cnblogs.com/detu/p/docker-get-started.html
Copyright © 2011-2022 走看看