美文网首页
Docker小记

Docker小记

作者: Monkee | 来源:发表于2015-12-01 21:15 被阅读954次

    本文首发:http://m0nkee.github.io/2015/11/30/about-docker/

    Docker简介

    Docker可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题。Docker能处理的事情包括:

    • 隔离应用依赖
    • 创建应用镜像并进行复制
    • 创建容易分发的即启即用的应用
    • 允许实例简单、快速地扩展
    • 测试应用并随后销毁它们

    Docker三大核心概念

    • 镜像 image :类似于虚拟机的快照,但更轻量。
    • 容器 container :镜像的一个运行实例,可以独立运行一个或一组应用。
    • 仓库 repository :集中存放镜像的地方

    Docker安装

    OS:Ubuntu 14.04 #主要docker 默认为64位系统,32位会出现问题

    要求kernel >= 3.8,若不满足执行下面操作
    #安装内核
    sudo apt-get update
    sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
    #重启
    sudo reboot
    
    1. 添加docker的repository到本地密钥库
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
    
    1. 将Docker添加到你的apt软件安装源中,然后update和install lxc-docker
    sudo sh -c "echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
    sudo apt-get update
    sudo apt-get install lxc-docker
    

    镜像

    • 获取镜像
    sudo docker pull ubuntu [TAG]
    #TAG:14.04 表示特定版本, 默认下载最新版本
    
    #eg:
    monkee@ubuntu:~$ sudo docker pull ubuntu
    Using default tag: latest
    latest: Pulling from library/ubuntu
    0a85502c06c9: Pull complete 
    0998bf8fb9e9: Pull complete 
    a6785352b25c: Pull complete 
    e9ae3c220b23: Pull complete 
    Digest: sha256:f91f9bab1fe6d0db0bfecc751d127a29d36e85483b1c68e69a246cf1df9b4251
    Status: Downloaded newer image for ubuntu:latest
    monkee@ubuntu:~$ sudo docker pull ubuntu:14.04
    14.04: Pulling from library/ubuntu
    Digest: sha256:28bd2edcebe82d41c3494bf6205016fe08e681452f1448acd44d55e2cda7e3c0
    Status: Downloaded newer image for ubuntu:14.04
    monkee@ubuntu:~$ sudo docker pull ubuntu:13.04
    13.04: Pulling from library/ubuntu
    d634beec75db: Pull complete 
    acc11bd60981: Pull complete 
    307e4bfe3398: Pull complete 
    2dd5ccb60cc5: Pull complete 
    e754e00b59af: Pull complete 
    Digest: sha256:bc48dd7075ce920ebbaa4581d3200e9fb3aaec31591061d7e3a280a04ef0248c
    Status: Downloaded newer image for ubuntu:13.04
    
    • 使用镜像创建一个容器
    sudo docker run -t -i ubuntu /bin/bash
    
    • 查看镜像信息
    sudo docker images
    #添加新标签
    sudo docker tag [OLD_REPOSITORY]:[OLD_TAG] [NEW_REPOSITORY]:[NEW_TAG]
    
    #eg.
    monkee@ubuntu:~$ sudo docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    ubuntu              14.04               e9ae3c220b23        2 weeks ago         187.9 MB
    ubuntu              latest              e9ae3c220b23        2 weeks ago         187.9 MB
    ubuntu              13.04               e754e00b59af        17 months ago       169.4 MB
    

    镜像拥有唯一ID,以及一个供人阅读的名字和标签对。镜像可以命名为类似ubuntu:latest、ubuntu:14.04等。
    image id相同说明标签指向了同一个镜像文件。

    sudo docker inspect [image id] #获取镜像的详细信息
    
    #eg.
    monkee@ubuntu:~$ sudo docker inspect e9ae3c220b23
    [
    {
        "Id": "e9ae3c220b23b699cb5e6914af806219b028c78d5cf6fed8eeca98ffaa8c9b43",
        "RepoTags": [
            "ubuntu:14.04",
            "ubuntu:latest"
        ],
        "RepoDigests": [],
        "Parent": "a6785352b25c7398637e5ab5a6e989b8371f5dfdf72d9a6cdb00742f262a223e",
        "Comment": "",
        "Created": "2015-11-10T00:35:07.49709192Z",
        "Container": "84382e3b0cae0e65ad88f32aee022f08bd2b88ba703b3b52b2f5af6bafdedc62",
        "ContainerConfig": {
            "Hostname": "a52c17016130",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) CMD [\"/bin/bash\"]"
            ],
            "Image": "a467a7c6794fd7ebd5bd0e2dcb83a656ac8302e549c4a2cc29c524aea5c5623b",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "1.9.0",
        "Author": "",
        "Config": {
            "Hostname": "a52c17016130",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "a467a7c6794fd7ebd5bd0e2dcb83a656ac8302e549c4a2cc29c524aea5c5623b",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 0,
        "VirtualSize": 187919300,
        "GraphDriver": {
            "Name": "aufs",
            "Data": null
        }
    }
    ]
    
    • 搜索镜像
    #搜索带关键字的镜像
    sudo docker search KEYWORDS
    
    #eg.
    monkee@ubuntu:~$ sudo docker search docker
    NAME                                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    jenkins                                 Official Jenkins Docker image                   837       [OK]       
    registry                                Containerized docker registry                   499       [OK]       
    alpine                                  A minimal Docker image based on Alpine Lin...   346       [OK]       
    fedora                                  Official Docker builds of Fedora                251       [OK]       
    swarm                                   Swarm: a Docker-native clustering system.       87        [OK]       
    dockerui/dockerui                       A web interface to interact with the Docke...   71                   [OK]
    konradkleine/docker-registry-frontend   Browse and modify your Docker registry in ...   56                   [OK]
    jdubois/jhipster-docker                 Official JHipster Docker image, by the JHi...   44                   [OK]
    docker                                  Docker in Docker!                               41        [OK]       
    docker-dev                              Docker is an open source project to pack, ...   36        [OK]       
    hello-world                             Hello World! (an example of minimal Docker...   30        [OK]       
    martin/docker-cleanup-volumes           Delete orphaned docker volumes                  24                   [OK]
    devalx/docker-teamspeak3                Docker Container with Teamspeak 3. Contain...   16                   [OK]
    twiecki/pydata-docker-jupyterhub        PyData multi-user IPython/Jupyter notebook...   15                   [OK]
    datadog/docker-dd-agent                 Docker container for the Datadog Agent.         15                   [OK]
    grahamdumpleton/mod-wsgi-docker         Docker images for Apache/mod_wsgi.              13                   [OK]
    spotify/docker-gc                       Garbage collection of Docker containers an...   10                   [OK]
    dockercore/docker                                                                       5                    [OK]
    cgal/testsuite-docker                   Docker images for the CGAL testsuite            2                    [OK]
    dockerimages/docker-tools                                                               1                    [OK]
    docker/migrator                         Tool to migrate Docker images from a v1 re...   1                    [OK]
    sematext/spm-agent-docker               Performance Monitoring, Events and Logs fo...   1                    [OK]
    docker/docker-bench-security            Docker Bench checks for dozens of common b...   1                    [OK]
    piefke3000/helma-docker                 Dockerizing the old and wise odd-toed ungu...   1                    [OK]
    pylam/docker                            Build Fedora docker container                   0                    [OK]
    
    • 删除镜像
    sudo docker rmi [TAG | IMAGE ID]
    

    注意

    删除镜像前先要删除依赖该镜像的所有容器。

    • 创建镜像

    三种方法:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建

    1). 基于已有镜像的容器创建

    首先启动一个镜像,并进行修改

    monkee@ubuntu:~$ sudo docker run -t -i  ubuntu:14.04 /bin/bash
    root@3b776d7e84c3:/# touch test 
    root@3b776d7e84c3:/# echo "this is a test :)" > test
    root@3b776d7e84c3:/# exit
    exit
    

    容器ID为:3b776d7e84c3

    现在可以创建一个新的镜像了

    monkee@ubuntu:~$ sudo docker commit -m "add a test file" -a "Docker test" 3b776d7e84c3 test
    879f386d63fcf1c7b7a9c5550970bf4cc06b66241a3f61d3ce4dae24b49ae86b   #返回新创建镜像的ID信息
    monkee@ubuntu:~$ sudo docker images  #查看新创建的镜像
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    test                latest              879f386d63fc        2 minutes ago       187.9 MB
    ubuntu              14.04               e9ae3c220b23        2 weeks ago         187.9 MB
    ubuntu              latest              e9ae3c220b23        2 weeks ago         187.9 MB
    ubuntu              13.04               e754e00b59af        17 months ago       169.4 MB
    
    monkee@ubuntu:~$ sudo docker run -t -i  test:latest /bin/bash
    root@f57c9ec148db:/# ls
    bin   dev  home  lib64  mnt  proc  run   srv  test  usr
    boot  etc  lib   media  opt  root  sbin  sys  tmp   var
    root@f57c9ec148db:/# cat test
    this is a test :)
    
    

    2)2.基于本地模板创建
    首先,从OpenVZ下载模板here

    然后,解压倒入方可

    sudo cat ubuntu-15.04-x86_64-minimal.tar.gz | docker import - ubuntu:15.04
    
    • 存出和载入镜像
    #存出镜像
    sudo docker save -o ubuntu-test.tar test:latest
    
    #载入镜像
    sudo docker load  --input ubuntu-test.tar
    or
    sudo docker load < ubuntu-test.tar
    

    3).使用Dockerfile创建镜像
    Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建镜像文件。

    容器

    容器与虚拟机一样也是隔离的,它们都拥有这一个唯一标识自己的ID和名字。容器需要对外提供服务,所以Docker允许容器公开容器的特定端口。

    Docker容器Docker容器
    • 创建容器
    monkee@ubuntu:~$ sudo docker create -it test:latest
    [sudo] password for monkee: 
    20eaf1df8114e74bd93dac72d4abcd34ccf07f68887c1e20f9bf4d417ce6f769
    monkee@ubuntu:~$ sudo docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
    20eaf1df8114        test:latest         "/bin/bash"         23 seconds ago      Created                                      amazing_engelbart
    
    

    对于终止状态的容器,可以通过命令sudo docker ps -a -q命令查看
    通过sudo docker start 20e来启动上述新建的容器;
    通过sudo docker stop 20e来终止上述新建的容器。

    • 新建并启动容器
    #开启一个bash终端
    sudo docker -t -i unbuntu:14.04 /bin/bash
    

    其中

    -t 选项是让Docker分配一个伪终端
    -i选项是让容器的标准输入保持打开
    另外,-d 容器守护态运行

    • 进入容器
      对于使用-d选项进入后台运行的容器,有时需要进入容器进行操作。

    1)1. 使用attack命令

    monkee@ubuntu:~$ sudo docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    monkee@ubuntu:~$ sudo docker run -idt test:latest
    aabf150e0fb3900f0e1854a83a9c92375275f3e24c026315926b580a7ffe5568
    monkee@ubuntu:~$ sudo docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    aabf150e0fb3        test:latest         "/bin/bash"         8 seconds ago       Up 6 seconds                            compassionate_jones
    monkee@ubuntu:~$ sudo docker attach compassionate_jones
    root@aabf150e0fb3:/# 
    

    2). 使用exec命令

    monkee@ubuntu:~$ sudo docker ps 
    [sudo] password for monkee: 
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    670f5153659c        test:latest         "/bin/bash"         13 hours ago        Up 13 hours                             happy_hawking
    monkee@ubuntu:~$ sudo docker exec -ti happy_hawking /bin/bash
    root@670f5153659c:/# 
    
    • 删除容器
    sudo docker rm [container id]
    
    • 查看本机存在的所有容器
    sudo docker ps -a #查看本机存在的所有容器
    

    仓库

    仓库分私有仓库和公共仓库,Docker官方提供并维护了一个公共仓库:https://hub.docker.com/

    Docker Pool是国内专业的Docker技术社区,也提供镜像下载服务。

    对于私有仓库,可以通过该Docker提供的registry镜像来搭建简单的私有仓库。

    数据

    容器中的数据一般需要备份、恢复操作,容器和主机以及容器和容器之间需要进行数据交互。
    容器中管理数据有两种方式:

    • 数据卷(Data Volumes)
    • 数据卷容器(Data Volume Containers)

    数据卷

    数据卷是一个可提供容器使用的特殊目录,其保存在运行Docker的宿主机的文件系统上。
    数据卷的使用相当于Linux下的mount

    • 创建一个数据卷
      docker run命令后加-v选项可以创建一个数据卷,多次使用-v可以创建多个数据卷。
    #使用training/webapp镜像创建一个容器,并在容器内/webapp目录下创建一个数据卷
    sudo docker run -d -P --name web -v /webapp training/webapp python app.py 
    
    #挂载一个主机目录最为数据卷,例如将主机的/src/webapp目录挂载到容器的/opt/webapp,目录默认可读写
    sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
    
    #目录的权限也可以设定为只读
    sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
    
    #也可以挂载一个主机文件作为数据卷
    

    -P选项是运行外部访问容器提供的服务端口

    数据卷容器

    数据卷容器其实就是一个专门提供数据卷的普通容器。一般应用于容器之间共享持续更新的数据的情景。

    创建一个名为dbdata的数据卷容器,并挂载到/dbdata

    sudo docker run -it -v /dbdata --name dbdata ubuntu 
    

    创建容器并使用--volumes-from来挂载dbdata容器中的数据卷

    sudo docker run -it --volumes-from dbdata --name db1 ubuntu
    
    # 创建数据卷容器dbdata
    monkee@ubuntu:~$ sudo docker run -i -t -v /dbdata --name dbdata ubuntu:14.04
    root@03dc8fef808f:/# ls
    bin   dbdata  etc   lib    media  opt   root  sbin  sys  usr
    boot  dev     home  lib64  mnt    proc  run   srv   tmp  var
    
    #创建db1容器,并挂载dbdata容器
    monkee@ubuntu:~$ sudo docker run -it --volumes-from dbdata --name db1 ubuntu:14.04
    [sudo] password for monkee: 
    root@c20f50dc54fd:/# 
    
    #创建db2容器,并挂载dbdata容器
    monkee@ubuntu:~$ sudo docker run -it --volumes-from dbdata --name db2 ubuntu:14.04
    [sudo] password for monkee: 
    root@a71fc85d1451:/# 
    
    #在容器db1中的/dbdata目录创建test文件
    root@c20f50dc54fd:/# touch /dbdata/test
    root@c20f50dc54fd:/# echo "test fun :)">/dbdata/test 
    root@c20f50dc54fd:/# cat /dbdata/test 
    test fun :)
    
    #在容器db2和数据卷容器dbdata中可以查看到共享文件test
    root@a71fc85d1451:/# cat /dbdata/test 
    test fun :)
    
    root@03dc8fef808f:/# cat /dbdata/test 
    test fun :)
    

    多次使用--volumes-from可以从多个容器挂载多个数据卷,同时也可以从已挂载的容器挂载数据卷

    monkee@ubuntu:~$ sudo docker run -it --volumes-from db1 --name db3 ubuntu:14.04[sudo] password for monkee: 
    root@ae89fcba3b48:/# ls
    bin   dbdata  etc   lib    media  opt   root  sbin  sys  usr
    boot  dev     home  lib64  mnt    proc  run   srv   tmp  var
    root@ae89fcba3b48:/# cat dbdata/test 
    test fun :)
    

    备份和恢复

    备份操作如下

    monkee@ubuntu:~$ sudo docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu:14.04 tar cvf /backup/backup.tar /dbdata
    tar: Removing leading `/' from member names
    /dbdata/
    /dbdata/test
    monkee@ubuntu:~$ ls
    backup.tar  Documents  examples.desktop  Pictures  Templates
    Desktop     Downloads  Music             Public    Videos
    

    恢复数据到一个容器如下

    #新建一个带有数据卷的容器
    sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
    
    #再创建一个新容器,并挂载dbdata2
    sudo docker run --volumes-from dbdata2 -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar
    

    网络

    没个容器拥有一个私有的IP。

    • 端口映射

    为实现端口映射,需要在docker run命令后加选项-p-P

    sudo docker run -d -p localport:containerport ubuntu python server.py
    

    通过多次使用-p选项可以映射多个端口。
    若要指定特定的IP地址

    sudo docker run -d -p ip:localport:containerport ubuntu python server.py
    

    若localport缺省,则会映射到任意的本地端口。

    查看映射端口

    sudo docker port [containerNAME] [containerport]
    or
    sudo docker inspect containerID
    
    • 容器间互联

    容器的名称是唯一的,可以使用--name选项自定义。
    使用--link name:alias选项实现容器间互联,其中name为链接容器的名字,alias为这个链接的别名

    #先新建一个容器
    sudo docker run -d --name db Ubuntu
    
    #然后再创建一个关联的容器
    sudo docker run -d -P --name web --link db:webdb Ubuntu python sever.py
    

    这样web容器就可以直接访问db容器了。如ping db

    关于Docker的原理剖析后续再接上:)


    参考

    相关文章

      网友评论

          本文标题:Docker小记

          本文链接:https://www.haomeiwen.com/subject/cuwjhttx.html