docker-day1-安装和基本使用

 


 

Docker

1.什么是docker

  Docker 是一个开源项目,可以实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

2.为啥要用docker

  作为一种新兴的虚拟化方式,docker跟传统的虚拟化方式相比有很多优势。

  1)启动速度很快,可以在秒级实现,大量节约开发,测试,部署的时间

  2)docker对系统资源利用率很高,一台主机可以同时运行数千个容器,容器除了运行其中的应用外,几乎不消耗额外的系统资源,使得应用性能很高,同时系统的开销尽量小

  3)更高效:Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

  4)更轻松的迁移和扩展:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

  5)更简单的管理:使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

3.基本概念

  1)Docker镜像

    镜像就是一个只读的模板,例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

  2)Docker容器

    Docker 利用容器来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

    *注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层

  3)Docker仓库

    仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

  *注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。

 

4.安装和基本使用

  *这里介绍ubuntu和centos两种的安装方法

   Ubuntu

通过系统自带包安装

#Ubuntu 14.04 版本系统中已经自带了 Docker 包,可以直接安装。

$ sudo apt-get update
$ sudo apt-get install -y docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io

#如果使用操作系统自带包安装 Docker,目前安装的版本是比较旧的 0.9.1。 要安装更新的版本,可以通过
使用 Docker 源的方式


通过Docker源安装最新版本

#要安装最新的 Docker 版本,首先需要安装 apt-transport-https 支持,之后通过添加源来安装。

$ sudo apt-get install apt-transport-https
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker


14.04 之前版本

#如果是较低版本的 Ubuntu 系统,需要先更新内核。

$ sudo apt-get update
$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
$ sudo reboot

#然后重复上面的步骤即可。
#安装之后启动 Docker 服务。

$ sudo service docker start

  Centos

  Centos支持centos6及以后的版本

 

CentOS6

#对于 CentOS6,可以使用 EPEL 库安装 Docker,命令如下

$ sudo yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
$ sudo yum install docker-io


CentOS7

#CentOS7 系统 CentOS-Extras 库中已带 Docker,可以直接安装:

$ sudo yum install docker

#安装之后启动 Docker 服务,并让它随系统启动自动加载

$ sudo service docker start
$ sudo chkconfig docker on

 

  镜像使用:

获取镜像
     #这里要先开启路由转发功能,要不docker容器不能上网
     开启路由转发功能
    1:
    vim /etc/sysctl.conf
    net.ipv4.ip_forward = 1
    sysctl -p
    2:
    echo 1 > /proc/sys/net/ipv4/ip_forward
    #以上两种方式都可以

    #使用docker pull命令来从仓库获取所需要的镜像
    #默认使用Docker Hub仓库下载,我们可以用国内的
    #这里用的是腾讯的

    docker pull index.tenxcloud.com/tenxcloud/centos
    latest: Pulling from index.tenxcloud.com/tenxcloud/centos
    0c908fa575ec: Pull complete 
    172ab63cd5e0: Pull complete 
    bd510c860c2e: Pull complete 
    f3b78c658786: Pull complete 
    456b1d0b21b9: Pull complete 
    6927e5ef1c2a: Pull complete 
    9ce5b52c7a15: Pull complete 
    f8ba963e89df: Pull complete 
    ea2c0e06606f: Pull complete 
    13def3dd8ad0: Pull complete 
    64efe21b2af1: Pull complete 
    19feb6d5a6b9: Pull complete 
    432440471e5c: Pull complete 
    432440471e5c: Pulling fs layer
     Digest:sha256:190cbd5234c4aad993b852d5f118ecfba5499adc6f752026938bce0e    ca754b0c
    Status: Downloaded newer image for index.tenxcloud.com/tenxcloud/centos:latest

#列出本地镜像
    docker images

    REPOSITORY                   TAG                 IMAGE ID            CREATED                 SIZE
    docker.io/weaveworks/scope   1.6.7               692f6731868d        12 days ago         74.39 MB
    docker.io/centos             6.9                 fca4c61d0fa7        7 weeks ago         194.7 MB
    docker.io/ubuntu             12.04               5b117edd0b76        8 months ago        103.6 MB
    docker.io/training/sinatra   latest              49d952a36c58        3 years ago         447 MB

#在列出信息中,可以看到几个字段信息
    1来自于哪个仓库,比如 index.tenxcloud.com/tenxcloud/centos
    2镜像的标记,比如 14.04
    3它的 ID 号(唯一)
    4创建时间
    5镜像大小

#启动容器
     docker run -t -i index.tenxcloud.com/tenxcloud/centos" /bin/bash

#创建镜像
    创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个。

    1.我们从已有镜像来创建一个
    vi /etc/docker/damen.json     ##修改默认docker镜像下载地址
    }
                    "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
    }

    docker run -t -i centos /bin/bash
    yum -y install httpd
    exit
    docker ps     #查看运行的docker容器id
    docker commit 42a3441b2f82 centos:apache    #commit用来创建新的镜像,基于已有镜像上,centos:apache是给新镜像取名字
    docker images
    REPOSITORY                   TAG                 IMAGE ID            CREATED                 SIZE
    centos                       apache              8b74fe22414a        12 seconds ago      203.5 MB
    docker.io/centos             latest              3fa822599e10        4 weeks ago         203.5 MB
    #可以进入新镜像查看一下是不是有httpd,是不是感觉像快照一样

    2.通过docer build创建一个基于centos的httpd服务镜像
    使用创建docker build创建时,需要使用Docekrfile自动化制作images
    #Dockerfile有点像源码编译时./configure后产生的Makefile
    mkdir /docker-build
    cd /docker-build
    touch Dockerfile
    vi Dockerfile

    FROM centos          #基于哪个镜像,直接写centos就是latest(如果没有特殊表明,比如ubuntu:12.04)
    MAINTAINER <Daniel@localhost.localdomain>    #作者
    RUN yum -y install httpd     #运行yum命令
    ADD start.sh /usr/local/bin/start.sh       #拷贝一个文件到实例里
    ADD index.html /var/www/html/index.html  #同上

    echo '/usr/sbin/httpd - DFOREGROUND' >start.sh  #这个相当于执行了systemctl start httpd
    chmod +x start.sh
    touch index.html

    #使用build命令创建新的image
    语法:docker build -t  父镜像名:镜像tag  Dockerfile所在路径 -t表示tage,镜像名

#镜像的删除
      语法:docker rmi 镜像名
#镜像的发布
    #方法1:save image to TarBall
    保存image到tar包到本地
    语法:docker save -o 导出的镜像名.tar 本地镜像名:镜像标签
    docker save -o centos-httpd-docker-image.tar centos:httpd
    导入:docker load -i 镜像名.tar  #原来的要删除或者不存在

    #方法2:Push image to docker hub 发布到外网
    1.Sigup on docker hub & create repo
        https://hub.docker.com/
    2.Login to docker hub
        docker login -u user -p passwd -e 
    3.Push image to docker hub  #上传镜像
        docker push centos:httpd
    4.pull image from docker hub   #下载镜像
        docker pull user/centos:httpd

  容器使用:

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动

#新建并启动
docker run ubuntu:14.04 /bin/echo 'Hello world' #跟在本地echo一个"hello world"几乎没有区别
Hello world

docker run -t -i ubuntu:14.04 /bin/bash 
#下面的命令则启动一个 bash 终端,允许用户进行交互
# -t  选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,  -i  则让容器的标
准输入保持打开
root@af8bae53bdd3:/#

#当利用  docker run  来创建容器时,Docker 在后台运行的标准操作包括:
1.检查本地是否存在指定的镜像,不存在就从公有仓库下载
2.利用镜像创建并启动一个容器
3.分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
4.从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
5.从地址池配置一个 ip 地址给容器
6.执行用户指定的应用程序
7.执行完毕后容器被终止

#启动已终止容器
docker start  #这个命令可以将已经停止的容器启动

#守护状态
更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加  -d  参数来实现。
docker run -d ubuntu:12.04 /bin/sh -c "while true; do echo hello world;sleep 1; done"
容器启动后会返回一个唯一的 id,也可以通过  docker ps  命令来查看容器信息。
docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS               NAMES
680f67dc53d8        ubuntu:12.04             "/bin/sh -c 'while tr"   11 minutes ago      Up 11 minutes                           stupefied_hopper
9b121e3e2ec7        centos:6.9               "/bin/bash"              6 days ago          Up 3 minutes                            sick_aryabhata

docker logs stupefied_hopper #用来获取容器输出信息

#终止容器
docker stop #这个命令用来停止正在运行的容器

此外,当Docker容器中指定的应用终结时,容器也自动终止。 例如对于上一章节中只启动了一个终端的容
器,用户通过  exit  命令或  Ctrl+d  来退出终端时,所创建的容器立刻终止。
终止状态的容器可以用  docker ps -a  命令看到
此外, docker restart  命令会将一个运行态的容器终止,然后再重新启动它

#进入容器
在使用  -d  参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach  命令或  nsenter  工具等

docker run -idt ubuntu:12.01 #在后台运行一个容器
docker attach #后面跟容器id或者名字就可以进入容器
但是使用  attach  命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步
显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

nsenter  工具在 util-linux 包2.23版本后包含。 如果系统中 util-linux 包没有该命令,可以按照下面的方法从源码安装
wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-linux-2.24.tar.gz
cd util-linux-2.24
./configure --without-ncurses && make nsenter
sudo cp nsenter /usr/local/bin
PID=$(docker inspect --format "{{ .State.Pid }}" 容器名或者容器id   #每一个容器都有.State.Pid,所以这个命令除了容器的id需要我们根据docker ps -a去查找,其他的全部为固定的格式
nsenter --target $PID --mount --uts --ipc --net --pid #进入

#导出和导入容器
导出容器
如果要导出本地某个容器,可以使用  docker export  命令
docker ps -a
docker export 680f67dc53d8c3510e4dcaa55a63c001a7818eb10a23f2498474fdfb5f58982e > ubuntu:12.04.tar

导入容器快照,可以使用  docker import  从容器快照文件中再导入为镜像
cat ubuntu\:12.04.tar | docker import test/ubuntu:2
docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED              SIZE
test/ubuntu                  2                   42ee63485fbd        About a minute ago   83.58 MB

#此外,也可以通过指定 URL 或者某个目录来导入,例如
docker import http://example.com/exampleimage.tgz example/imagerepo
*注:用户既可以使用  docker load  来导入镜像存储文件到本地镜像库,也可以使用  docker import  来
导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息
(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

#删除容器
可以使用  docker rm  来删除一个处于终止状态的容器。 例如
docker rm trusting_newton
如果要删除一个运行中的容器,可以添加  -f  参数。Docker 会发送  SIGKILL  信号给容器。

 


 

posted @ 2017-12-27 16:23  qwerdf六连  阅读(369)  评论(0编辑  收藏  举报