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工作并计数

原文地址:https://www.cnblogs.com/detu/p/docker-get-started.html