网站首页 文章专栏 docker快速入门
docker快速入门
编辑时间:2020-08-24 00:05 作者:小铨 浏览量:159

-docker快速入门

1 docker入门

1  什么是docker
     Docker 是一个开源的应用容器引擎,你可以将其理解为一个轻量级的虚拟机,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何 流行的 Linux 机器上。

2  为什么要使用 Docker?
    (1) 更高效的利用系统资源
        由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。 
    无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应 用。
    (2) 更快速的启动时间
        传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的 启动时间。大大的节约了开发、测试、部署的时间。
    (3) 一致的运行环境
        开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了 除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
    (4) 持续交付和部署
        对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。 使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。 而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜 像。
    (5) 更轻松的迁移
        由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其 运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
    (6) 更轻松的维护和扩展
        Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。 此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务 的镜像制作成本。

2 docker基本概念

Docker 包括三个基本概念:镜像,容器,仓库 
这三部分组成了Docker的整个生命周期,如下图所示,容器是由镜像实例化而来的,这和我们学习的面向对象的概念十分相似,我们可以把镜像想象成类,把容器 想象成类经过实例化后的对象,这样就非常好理解镜像和容器的关系了。 

镜像(Image)
    Docker的镜像概念类似于虚拟机里的镜像,是一个只读的模板,-个独立的文件系统,包括运行 容器所需的数据,可以用来创建新的容器。 
    
    例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Mysql或用户需要的其 它应用程序。 
    
    Docker的镜像实际上由一层- -层的文件系统组成,这种层级的文件系统被称为 UnionFS。 镜像可以基于Dockerfile构建,Dockerfile是- -个描述文件,里面包含若干条命令,每条命令都会对基础文件系统创建新的层次结构。
    
    Docker提供了-个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那 里下载一个已经做好的镜像来直接使用。

容器(Container)
    Docker利用容器来运行应用。 
    
    Docker容器是由Docker镜像创建的运行实例。Docker容器类似虚拟机, 可以支持的操作包括启动,停止,删除等。每个容器间是相互隔离的,容 器中会运行特定的应用,包含特定应用的代码及所需的依赖文件。 
    
    可以把容器看做是一-个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

仓库(Repository)
    如果你使用过git和github就很容易理解Docker的仓库概念。Docker 仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。

    Docker仓库是用来包含镜像的位置,Docker提供一 个注册服务器(Register) 来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。 Docker运行中使用的默认仓库是Docker Hub公共仓库。 
    
    仓库支持的操作类似git,当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜 像时候,只需要从仓库上pull下来就可以了。.

3 docker镜像

1   docker images 
    查看镜像

2   docker run 
    运行一个镜像,docker首先是会在本机寻找该镜像,如果本机不存在,会去docker Hub上面搜索符合条件的镜像并将其下载下来运 行
    eg: docker docker run ubuntu echo "hello world docker"

3   docker pull 
    也可以通过pull命令来完成拉取镜像
    eg:docker pull nginx

4   删除镜像
    docker rmi 镜像id(image id) 
    -- 强制删除 
    docker rmi -f 镜像id(image id) 
    -- 删除所有容器 
    docker rmi $(docker images -q)

4 dockerfile介绍及构建镜像

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

这种方式是比较流行的方式。就是将需要对镜像的操作全部写到一个文件中,然后使用docker build命令从这个文件中创建镜像。这种方法可以使镜像的创建变得 透明化和独立化,并且创建过程可以被重复执行。dockerfile文件以行位单位,性首为dockerfile命令,命令都是大写形式,期后紧跟着的是命令的参数。

1   dockerfile指令
    (1)  FROM 指定基础镜像
    指定待扩展的父级镜像。除了注释外,在文件开头必须是一一个FROM指令, 接下来白指令便在这个父级镜像的环境中运行,直到遇到下一一个FROM指令。通过 添加多个FROM命令可以在同一个Dockerfile文件中创建多个镜像。
    (2)  RUN 执行命令
    RUN 指令是用来执行命令行命令的。 
    eg:
    FROM alpine 
    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories 
    RUN apk add gcc g++ libc-dev wget vim openssl-dev make linux-headers RUN mkdir -p /usr/src/redis
    (3)  MAINTAINER
    用来声明创建的镜像的作者信息。
    (4)  EXPOSE
    用来指明容器内进程对外开放的端口,多个端口之间使用空替隔力。运行容器通过参数-p(大写)即可将EXPOSE里所指定的端口映射到主机上另外的随机端口,容器 或主机就可以通过映射后的端口与此容器通信。同时,我们也可以通过-p (小写)参数将dockerfile中EXPOSE中没有列出的端口设置成公开的。
    (5)  ADD
    向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一个网络文件, 也可以是一个文件夹
    (6)  ENV
    设置容器运行的环境变量。在运行容器的时候,通过-e参数可以修改这个环境变量值,也可以添加新的环境变量:

    注:Dockerfile 中每一个指令都会建立一层, RUN 也不例外。每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令, 执行结束后, commit这一层的修改,构成新的镜像。使用 Dockerfile 定制镜像而上面的这种写法,创建了很多层镜像。这是完全没有意义的,而且很多运行时不 需要的东西,都被装进了镜像里,比如编译环境、更新的软件包等等。结果就是产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。 这是很多初学Docker 的人常犯的一个错误。Union FS是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过 127 层。

2   dockerfile构建redis镜像
    创建一个Dockerfile的文件,注意没有后缀(文件名也可以不叫Dockerfile,但是docker默认找的就是这个文件,如果不是则需要指定) 
    我们通过如下命令构建redis5的镜像:
    FROM centos 
    RUN groupadd -r redis && useradd -r -g redis redis
    RUN yum update -y && yum install epel-release -y 
    RUN yum install wget -y && yum -y install gcc automake autoconf libtool make 
    RUN yum install gcc gcc-c++ -y RUN mkdir -p /usr/src/redis
    RUN wget https://github.com/antirez/redis/archive/5.0.7.tar.gz 
    RUN tar -zxvf 5.0.7.tar.gz -C /usr/src/redis 
    RUN cd /usr/src/redis/redis-5.0.7 && make && make PREFIX=/usr/local/redis install

=》 docker build -t redis5 .

3   命令执行注意实现
    在docker中的设计是采用文件系统,而在dockerfile中一个RUN代表一层曾经是最大不得超过 42 层,现在是不得超过 127 层。而且在docker中下载的文件是会占用 一定的资源,对于容器我们是尽量占用足够小的资源所以下载安装之后就要删除文件。对于命令之间我们通常是建议一些能一起执行的命令放在一起执行可通过 “;\"分割
   
    所以对于上面的错误主要包含有: 
    1. 下载安装的文件没有删除 
    2. RUN的层次太多 
    
    所以正确的写法应该如下:
    FROM centos 
    RUN groupadd -r redis && useradd -r -g redis redis 
    RUN yum update -y ; \
        yum -y install gcc automake autoconf libtool make wget epel-release gcc-c++;
    RUN mkdir -p /usr/src/redis; \
        wget https://github.com/antirez/redis/archive/5.0.7.tar.gz; \
        tar -zxvf 5.0.7.tar.gz -C /usr/src/redis; \
        rm -rf 5.0.7.tar.gz; \
        cd /usr/src/redis/redis-5.0.7 && make && make PREFIX=/usr/local/redis install;

5 docker hub 发布

这个有点类似于composer的仓库地址就是用来存储我们开会人员的镜像地址的; 
官网:https://hub.docker.com 
自己注册一个账号,这个过程我就跳过
~ docker login 
Username: wuhequan 
Password: Login Successded

登入成功之后,使用push命令就可以上传镜像,如果不指定tag则本地的镜像都会上传。如下实例: 
注意docker hub的push要求是如下格式

docker push 注册名/镜像名:tag

比如:因为我们创建的镜像是redis5不符合规划
执行tag修改:docker tag redis5 wuhequan/redis5:v1
  1. 容器

(1) 基础操作
我们可以基于镜像与构建容器
    docker run -itd --name 容器名称(自定义) 镜像名称:标识

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明: 
    -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; 
    -d: 后台运行容器,并返回容器ID; 
    -i: 以交互模式运行容器,通常与 
    -t 同时使用; -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; 
    --name="nginx-lb": 为容器指定一个名称; --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致; 
    --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致; 
    -h "mars": 指定容器的hostname; 
    -e username="ritchie": 设置环境变量; 
    --env-file=[]: 从指定文件读入环境变量; 
    --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
    -m :设置容器使用内存最大值; 
    --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; 
    --link=[]: 添加链接到另一个容器; 
    --expose=[]: 开放一个端口或一组端口; 

如下为创建过程 :
    docker ps -a
    docker images
    docker run -itd --name redis5 wuhequan/redis5:v1
容器类型: 
    * 交互型容器:运行在前台,通常会制定有交互的控制台,可以给容器输入,也可以得到容器的输出。创建该日期的终端被关闭,在容器内部使用 exit命令或者调用docker stop 、docker kill命令后,容器会 
    * 后台型容器:运行在后台,创建启动之后就与终端无关。即便终端关闭了,改后台容器也依然存在,只有执行docker stop或者docker kill命令 时候才能够使容器变成停止状态

我们可以进入容器中的系统:
    docker exec -it redis5 bash
    如上命令我们就相当于进入容器中的系统了,同时我们也可以启动容器中的redis


我们可以查看容器中的进程,通过如下命令:
    docker top redis5

查看镜像的历史:
    docker history 镜像

Docker容器的迁移处理

docker的流行与它对容器的易分享和易移植密不可分。用户不仅可以把容器提交到公共服务器上,还可以将容器导出到本地文件系统中。同样我们也可以讲导出的 容器重新导入到docker运行环境中。docker的导入和导出分别由import命令和export命令完成。
     docker export redis5 > redis5.tar
     docker export 命令会把容器的文件系统以tar包的格式导出到标准输出,我们将其重定位到目标文件name.tar。将容器保存到本地文件也算是其持久化方式的一种。 将容器保存到本地之后,我们就可以通过网络等方法将tar包分享给他人。反过来,我们可以使用docker import命令 导人一个本地的tar包作为镜像:
     docker import redis5.tar redis5:v1 将tar包导出生成容器,再docker ps -a 就可以看到
        
     注:   
     export import  用于容器
     save   load    用于镜像 (类推也是导出和生成)
常用命令:
    1.启动 
    docker start 容器名

    2.删除 
    docker rm 容器名

    3.停止所容器 
    docker stop $(docker ps -a -q) 
    docker rm $(docker ps -a -q)

    4.docker build -t 名称 . 
    Usage:docker build [OPTIONS] PATH | URL | -

    OPTIONS: 
    -t ,--tag list #构建后的镜像名称 
    -f, --file string #指定Dockerfiile文件位置
        示例: 
        1,docker build . 
        2,docker build -t redis:v1 . 
        3,docker build -t redis:v2 -f /path/Dockerfile /path

    一般常用第2种方式构建,我们在构建时都会切换到Dockerfile文件的目录下进行构建,所以不需要指定-f参



    出自:铨程互动

    地址:www.wuhequan.cn

    转载请注明出处!


来说两句吧
最新评论
0.093337s