Docker重要概念及基本操作

一.Docker架构和底层技术简介

1.Docker Platform
  • Docker提供了一个开发,打包,运行app的平台
  • 把app和底层infrastructure(physical/virtual物理设备和虚拟设备)隔离开来
2.Docker Engine
  • 后台进程(dockerd)
  • 提供REST API Server
  • CLI 接口(docker)
3.Docker Architecture(Docker整体架构)

在这里插入图片描述

  • Client(命令行中常用的命令)
  • DOCKER_HOST
    • image镜像
    • containers容器
  • Registry(存储镜像的公共服务器,用于images的存储与获取)
4.底层技术支持
  • Namespaces:做隔离pid,net,ipc,mnt,uts
  • Control groups:做资源限制(指定容器用多少内存)
  • Union file systems:Container和image的分层
5.实验环境介绍
  • 使用已经搭建好的实验环境【暂时还没有发布】
  • 执行vagrant up命令开启centos7的虚拟机,这个虚拟机中已经安装好docker了
  • 执行vagrant ssh登录centos虚拟机中

二.Docker image概述(Image即镜像)

1.什么是Image
  • 文件和meta data的集合(root filesystem)
  • 分层的,并且每一层都可以添加改变删除文件,成为一个新的image
  • 不同的image可以共享相同的layer
  • Image本身是read-only的
    在这里插入图片描述
2.实例了解Image
  • 执行docker image ls查看本地的所有image
3.Image的获取
  • 通过Dockerfile格式的文件build出来对应的image(Build from Dockerfile)

  • 从Registry拉取Image(Pull from Registry)

    sudo docker pull ubuntu:14.04#从registry中拉取ubuntu14.04的image,不加版本号取的是最新版本
    #上述拉取的方式是从docker hub中取出的,https://hubs.docker.com
    
    • 上述拉取的方式是从docker hub中取出的,https://hubs.docker.com
    • 如果不携带版本号的拉取,拿到的是最新版本
    • 如果pull的内容带对应路径,如sudo docker pull binami/wordpress,该内容不是官方给提供的,其中binami为用户名;若想取官方image则需要执行sudo docker pull wordpress

三.DIY一个Base Image

1.提升docker命令的执行权限
#我们通常执行
#sudo docker image ls 查看docker中的image
#执行 docker image ls 会提示权限不足
#执行如下命令提升权限
sudo groupadd docker
sudo gpasswd -a vagrant docker
sudo service docker restart#重启docker服务
#使用vagrant ssh重新登录后,执行docker image ls可以直接查看结果
2.使用官方hello-world的image
docker pull hello-world#从registry中获得hello-world的baseimage,执行hello-world会创建一个容器
docker run hello-world#执行hello-world的container
3.通过c语言编写hello world,将hello wrold编译执行成二进制的可执行文件
  • 执行vim hello.c创建hello.c

  • 编写hello.c

    #include<stdio.h>
    int main()
    {
        printf("hello docker\n");
    }
    
  • 编译c语言文件成二进制文件(编译c语言使用gcc)

    #安装gcc
    sudo yum install gcc
    #安装glibc-static
    sudo yum install glibc-static
    #安装后执行如下命令进行编译c语言文件
    gcc -static hello.c -o hello
    #此时我们将hello.c文件编译成名为hello的可执行文件
    #可以使用./hello直接执行hello文件
    
  • 编写Dockerfile文件

    FROM scratch #表示当前image是base image
    ADD hello / #将hello运行到根目录中
    CMD ["/hello"]
    
  • 执行docker build -t jack/hello-world .构建Base image,最后的点表示在当前路径找Dockerfile

  • 通过dockerfile将此可执行文件打成docker image

  • 使用docker run jack/hello-world执行创建的container,会打印hello docker

四.初识container

1.什么是Container
  • 通过Image创建(copy)
  • 在Image layer之上建立一个container layer(可读写)
  • 类比面向对象:类(Image)和实例(Container)
  • Image负责app的存储和分发,Container负责运行app
2.container命令
  • docker container ls查看当前正在运行的container
  • docker container ls -a查看所有的container(当前正在运行的和退出的)
  • 如上述docker run jack/hello-world创建并运行container,运行后就会退出,故直接使用ls查看不到
  • 若想创建后不退出则可以使用命令docker run -it centos,则会创建container并不会退出,直接使用ls可以查看到对应的contianer,相当于在image上多了一个layer
  • 执行docker container rm ID号即可将对应退出的container删除【使用docker rm ID号默认移除的就是container】
  • 执行docker image rm ID号即可移除image【使用docker rmi ID号移除Image】
  • 余下命令及参数请查阅相关文档

五.构建自己的Docker镜像

1.Docker命令
  • docker container commit Container名字 Image名字[简写:docker commit Container名字 Image名字]先基于某个image创建一个container,之后在container中做某些变化(如添加软件),之后将其commit成一个新的image
  • docker image build[简写:docker build]通过Dockerfile创建一个image
2.Docker命令应用实例
  • 场景一:
    • 执行docker run -it centos以交互模式执行docker image创建container;执行yum install -y vim安装vim工具;执行exit推出container;执行docker container ls -a会查看到刚才的container变成exited状态
    • 执行docker commit container名称 image2名称将container变成image2【通过查看docker history imageID号可以发现image2的大小比image1大,相当于填了一层vim的layer】
  • 场景二:
    • 在image1中创建一个Dockerfile,内容如下
      FROM centos #表示base image是centos
      RUN yum install -y vim #表示运行相关命令
      
    • 通过docker build -t Image名 .会创建临时的container并安装vim,安装后会将container变成image并移除临时的container[其中image名表示的是创建的image的名称,.表示的是执行当前目录下的Dockerfile]
      • 其中FROM centos表示获取centos作为base image
      • RUN yum install -y vim表示运行yum安装vim,执行过程中会看到Running in 39564664ebab表示在运行过程中生成了一个continer,在container里面安装了vim,安装成功之后会rm(Removing intermediate container 39564664ebab)此container并commit成image
      • 可以通过docker image ls查看所有的image

六.温习手记

1.Registry
  • Docker借鉴GitHub思想,可以在registry拉取或上传需要的image
  • dockerhub是docker提供的公开的免费的registry
  • 如何想直接从docker官方的资源库中拉取image,直接写image名称即可;如果想拉取第三方image,则使用用户名/image[官方image:sudo docker pull wordpress,第三方image:sudo docker pull binami/wordpress]
2.部分container执行指令
  • 查看container历史所有列表的第一列数据docker container ls -a -q[使用自带指令]或docker container ls -a | awk {'print$1'}[使用awk过滤]\
  • 查看container历史所有列表中status是exited的第一列数据docker container ls -f "status=exited" -q
  • 删除container历史所有列表中status是exited的数据docker rm $(docker container ls -f "status=exited" -q)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值