zoukankan      html  css  js  c++  java
  • Linux----------容器

    一、容器简介

    Docker 帮助系统管理员和程序员在容器中开发应用程序,并且可以扩展到成千上万的节点,容器和 VM(虚拟机)的主要区别是,容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短,容器使用宿主操作系统的内核,而虚拟机使用独立的内核,Docker 的局限性之一是,它只能用在 64 位的操作系统上。

    • docker的理念:
    • 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
    • 容器之间希望有可能共享数据

    1.1 容器的定义

    Docker的基本组成:镜像(image)、容器(container)、仓库(repository)
    Docker利用容器(container)独立运行的一个或一组应用。容器是用镜像创建的运行实例,每个容器都行相互隔离的、保证安全的平台。
    容器是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

    1.2 镜像的定义

    UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

    特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

    镜像加载原理:docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

    二、简单安装容器

    环境:
    系统版本:CentOS Linux release 7.6.1810 (Core)
    内核版本:3.10.0-957.el7.x86_64

    ##Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令:
    [root@186 ~]# yum install docker* -y
    ...........................................................
    
    ##如果报错就安装三个依赖包,yum-utils提供yum-config-manager包,用来管理yum配置文件;lv2和device-mapper-persistent-data为dockerdevicemapper存储设备的必须依赖
    [root@186 ~]# yum install -y yum-utils device-mapper*  lvm2
    ................................................................................................
    
    ##安装成功就启动服务,查看服务状态检查是否启动成功
    [root@186 ~]# systemctl start docker
    [root@186 ~]# systemctl enable docker.service 
    Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
    
    [root@186 ~]# systemctl status docker
    ● docker.service - Docker Application Container Engine
       Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
       Active: active (running) since 四 2019-08-15 15:00:22 CST; 16s ago
         Docs: http://docs.docker.com
     Main PID: 8229 (dockerd-current)
       CGroup: /system.slice/docker.service
               ├─8229 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtim...
               └─8234 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics...
    
    8月 15 15:00:20 186 dockerd-current[8229]: time="2019-08-15T15:00:20.993812526+08:00" level=info msg="libcontainerd: n... 8234"
    8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.077694666+08:00" level=info msg="Graph migration ...conds"
    8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.078553209+08:00" level=info msg="Loading containe...tart."
    8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.099355199+08:00" level=info msg="Firewalld running: true"
    8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.261051865+08:00" level=info msg="Default bridge (...dress"
    8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.425824071+08:00" level=info msg="Loading containe...done."
    8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.492111727+08:00" level=info msg="Daemon has compl...ation"
    8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.492745036+08:00" level=info msg="Docker daemon" c...1.13.1
    8月 15 15:00:22 186 systemd[1]: Started Docker Application Container Engine.
    8月 15 15:00:22 186 dockerd-current[8229]: time="2019-08-15T15:00:22.500602634+08:00" level=info msg="API listen on /v....sock"
    Hint: Some lines were ellipsized, use -l to show in full.
    
    ##查看docker版本。docker版本为1.13.1,API版本为1.26
    [root@186 ~]# docker version 
    Client:
     Version:         1.13.1
     API version:     1.26
     Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
     Go version:      go1.10.3
     Git commit:      7f2769b/1.13.1
     Built:           Mon Aug  5 15:09:42 2019
     OS/Arch:         linux/amd64
    
    Server:
     Version:         1.13.1
     API version:     1.26 (minimum version 1.12)
     Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
     Go version:      go1.10.3
     Git commit:      7f2769b/1.13.1
     Built:           Mon Aug  5 15:09:42 2019
     OS/Arch:         linux/amd64
     Experimental:    false
    
    ##下载官方我CentOS镜像到本地并确认
    [root@186 ~]# docker pull centos
    Using default tag: latest
    Trying to pull repository docker.io/library/centos ... 
    latest: Pulling from docker.io/library/centos
    8ba884070f61: Pull complete 
    Digest: sha256:a799dd8a2ded4a83484bbae769d97655392b3f86533ceb7dd96bbac929809f3c
    Status: Downloaded newer image for docker.io/centos:latest
    [root@186 ~]# docker images centos
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    docker.io/centos    latest              9f38484d220f        5 months ago        202 MB
    
    ##切入到容器中,我们可以看到 CentOS 容器已经被启动,并且我们看到了 bash 提示符。在 docker 命令中我们使用了 “-i 捕获标准输入输出”和 “-t 分配一个终端或控制台”选项。断开输入exit
    [root@186 ~]# docker run -i -t centos /bin/bash
    [root@31a625f874c1 /]# ip a
    bash: ip: command not found
    [root@31a625f874c1 /]# cat /etc/redhat-release 
    CentOS Linux release 7.6.1810 (Core) 
    
    ##显示当前正在运行容器的列表
    [root@186 ~]# docker ps -a 
    [root@186 ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
    139e4dee63e1        centos              "/bin/bash"         19 seconds ago      Exited (0) 18 seconds ago                         sad_tesla
    31a625f874c1        centos              "/bin/bash"         26 minutes ago      Exited (127) 25 minutes ago                       zealous_saha
    

    三、容器常用命令

    • 管理命令:
      container   管理容器
      image       管理镜像
      network     管理网络
      node        管理Swarm节点
      plugin      管理插件
      secret      管理Docker secrets
      service     管理服务
      stack       管理Docker stacks
      swarm       管理Swarm集群
      system      查看系统信息
      volume      管理卷
    

    如:docker container ls 显示所有容器

    • 普通命令:
      attach     进入一个运行的容器
      build      从一个DockerFile构建镜像
      commit     从容器创建一个镜像
      cp          从容器和主机文件系统之间拷贝文件 
      create      创建一个容器
      diff        检查容器文件系统上的更改
      events      从服务器获取实时事件
      exec        在正在运行的容器中运行命令
      export      将容器的文件系统导出为tar存档
      history     显示镜像的历史记录
      images      查看镜像列表
      import      从归档文件中创建镜像
      info        显示系统范围的信息
      inspect     返回Docker对象的低级信息
      kill        kill运行中的容器
      load        从存档或者STDIN加载镜像
      login       登陆docker镜像仓库
      logout      退出docker镜像仓库
      logs        获取一个容器的日志
      pause       暂停一个或多个容器中的所有进程
      port        查看端口映射或容器的特定映射列表
      ps          查看容器列表
      pull        从镜像仓库拉取镜像
      push        将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
      rename      重命名容器
      restart     重启容器
      rm          删除容器
      rmi         删除镜像
      run         创建一个新的容器并运行一个命令
      save        将指定镜像保存成 tar 归档文件
      search      从Docker Hub搜索镜像
      start       启动容器
      stats       实时显示容器资源使用情况的统计信息
      stop       停止容器
      tag         标记本地镜像,将其归入某一仓库
      top         展示一个容器中运行的进程
      unpause     恢复容器中所有的进程
      update      更新容器配置
      version    显示Docker的版本信息
      wait        阻塞直到容器停止,然后打印退出代码
    

    如:docker images 显示所有镜像

    3.1 run创建容器

    docker run 命令格式

    Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]  
     
      -d, --detach=false         指定容器运行于前台还是后台,默认为false   
      -i, --interactive=false   打开STDIN,用于控制台交互  
      -t, --tty=false            分配tty设备,该可以支持终端登录,默认为false  
      -u, --user=""              指定容器的用户  
      -a, --attach=[]            标准输入输出流和错误信息(必须是以非docker run -d启动的容器)
      -w, --workdir=""           指定容器的工作目录 
      -c, --cpu-shares=0        设置容器CPU权重,在CPU共享场景使用  
      -e, --env=[]               指定环境变量,容器中可以使用该环境变量  
      -m, --memory=""            指定容器的内存上限  
      -P, --publish-all=false    指定容器暴露的端口  
      -p, --publish=[]           指定容器暴露的端口 
      -h, --hostname=""          指定容器的主机名  
      -v, --volume=[]            给容器挂载存储卷,挂载到容器的某个目录  
      --volumes-from=[]          给容器挂载其他容器上的卷,挂载到容器的某个目录
      --cap-add=[]               添加权限,权限清单详见:http://linux.die.net/man/7/capabilities  
      --cap-drop=[]              删除权限,权限清单详见:http://linux.die.net/man/7/capabilities  
      --cidfile=""               运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法  
      --cpuset=""                设置容器可以使用哪些CPU,此参数可以用来容器独占CPU  
      --device=[]                添加主机设备给容器,相当于设备直通  
      --dns=[]                   指定容器的dns服务器  
      --dns-search=[]            指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件  
      --entrypoint=""            覆盖image的入口点  
      --env-file=[]              指定环境变量文件,文件格式为每行一个环境变量  
      --expose=[]                指定容器暴露的端口,即修改镜像的暴露端口  
      --link=[]                  指定容器间的关联,使用其他容器的IP、env等信息  
      --lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc时使用  
      --name=""                  指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字  
      --net="bridge"             容器网络设置:
                                    bridge 使用docker daemon指定的网桥     
                                    host     //容器使用主机的网络  
                                    container:NAME_or_ID  >//使用其他容器的网路,共享IP和PORT等网络资源  
                                    none 容器使用自己的网络(类似--net=bridge),但是不进行配置 
      --privileged=false         指定容器是否为特权容器,特权容器拥有所有的capabilities  
      --restart="no"             指定容器停止后的重启策略:
                                    no:容器退出时不重启  
                                    on-failure:容器故障退出(返回值非零)时重启 
                                    always:容器退出时总是重启  
      --rm=false                 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)  
      --sig-proxy=true           设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理 
    
    • 示例:
    [root@186 ~]# docker run -p 8090:8080 -p 50000:50000 --restart always --link Redis:redis --name jenkins -v /home/jenkins:/home/jenkins_home --privileged=true dokcer.io/jenkins/jenkins
         -p:把容器的8080端口映射到宿主机8090上
         -v:主机的目录/home/jenkins映射到容器的目录/home/jenkins_home
         --name:给容器起个名字jenkins,docker.io/jenkins/jenkins是你下载的镜像
         --restart:always 容器退出时总是重启
      --privileged=true:挂载主机目录Docker访问出现Permission denied的解决办法
         --link:为redis容器起个别名Redis,访问的时候使用别名Redis
    

    四、主要命令使用实例

    ## 拉取/上传 pull---  从国外的官方镜像仓库拉取镜像,不指定版本就默认是最新版本,因为网速问题更推荐从国内阿里云等镜像获取。docker push推送本地镜像到服务器
    [root@186 ~]# docker pull redis
    Using default tag: latest
    Trying to pull repository docker.io/library/redis ... 
    latest: Pulling from docker.io/library/redis
    1ab2bdfe9778: Pull complete 
    966bc436cc8b: Pull complete 
    c1b01f4f76d9: Pull complete 
    8a9a85c968a2: Pull complete 
    8e4f9890211f: Pull complete 
    93e8c2071125: Pull complete 
    Digest: sha256:9755880356c4ced4ff7745bafe620f0b63dd17747caedba72504ef7bac882089
    Status: Downloaded newer image for docker.io/redis:latest
    
    
    ##镜像images---(images列出所有镜像,images -a列出所有镜像包括历史,images --tree显示镜像的所有层,rmi <IMAGE ID>删除一个镜像)
    [root@186 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    docker.io/redis     latest              f7302e4ab3a8        17 hours ago        98.2 MB
    docker.io/nginx     latest              4733136e5c3c        24 hours ago        126 MB
    docker.io/mysql     latest              62a9f311b99c        25 hours ago        445 MB
    docker.io/centos    latest              9f38484d220f        5 months ago        202 MB
    
    ## 日志logs ---(查看某容器的日志)
    [root@186 ~]# docker logs -f -t --tail 10 cc1084e70cab
    2019-08-15T07:41:23.641939000Z [root@cc1084e70cab /]# df -h
    2019-08-15T07:41:23.642167000Z Filesystem               Size  Used Avail Use% Mounted on
    2019-08-15T07:41:23.642363000Z overlay                   10G  1.5G  8.6G  15% /
    2019-08-15T07:41:23.642591000Z tmpfs                    487M     0  487M   0% /dev
    2019-08-15T07:41:23.642778000Z tmpfs                    487M     0  487M   0% /sys/fs/cgroup
    2019-08-15T07:41:23.642973000Z /dev/mapper/centos-root   10G  1.5G  8.6G  15% /etc/hosts
    2019-08-15T07:41:23.643159000Z shm                       64M     0   64M   0% /dev/shm
    2019-08-15T07:41:23.643346000Z tmpfs                    487M     0  487M   0% /proc/acpi
    2019-08-15T07:41:23.643623000Z tmpfs                    487M     0  487M   0% /proc/scsi
    2019-08-15T07:41:23.643863000Z tmpfs                    487M     0  487M   0% /sys/firmware
    
    
    ## 网络network---(create创建,inspect查看,disconnet网络中移除或断开某容器,rm删除)
    [root@186 ~]# docker network create mynet
    e78d79314337a7cb9a3acfb340f624272fcfb53126866c463c87d8d2d2cdb980
    [root@186 ~]# docker network inspect mynet
    [
        {
            "Name": "mynet",
            "Id": "e78d79314337a7cb9a3acfb340f624272fcfb53126866c463c87d8d2d2cdb980",
            "Created": "2019-08-15T15:53:53.833288083+08:00",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "172.18.0.0/16",
                        "Gateway": "172.18.0.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Containers": {},
            "Options": {},
            "Labels": {}
        }
    ]
    
  • 相关阅读:
    【POJ 1655】Balancing Act
    【POJ 2631】 Roads in the North
    【洛谷 1002】 过河卒
    【洛谷 3178】树上操作
    【洛谷 1060】开心的金明
    【洛谷 2709】小B的询问
    【洛谷 1972】HH的项链
    JavaSpark-sparkSQL
    java8下spark-streaming结合kafka编程(spark 2.3 kafka 0.10)
    Kafka 使用Java实现数据的生产和消费demo
  • 原文地址:https://www.cnblogs.com/wangchengshi/p/10912204.html
Copyright © 2011-2022 走看看