zoukankan      html  css  js  c++  java
  • Docker----起步

    最近学习了一下的docker相关的东西,下面介绍一下我个人的学习总结和体会。关于docker的详细介绍和优势,在网上随便都可以找得到,就不做介绍了。这个部分的内容比较简单,有Docker基础的朋友可以忽略。

    一、Docker 与GitHub类比

    Docker 与Github 类比(纯属个人理解、可能有所偏差)
    Docker组件 GitHUb要素
    镜像仓库(https://hub.docker.com/ 或私有仓库等) 代码仓库(https://github.com/ 或个人仓库等)
    镜像 代码
    容器 将不同的代码组件融合到一起的项目

    二、docker 安装:(以Ubuntu为例)

      安装的docker有两种方式:(推荐使用第二种)

      方式一:

        使用apt源安装docker.io,可能安装版本比较古老;

    sudo apt-get update
    sudo apt-get install docker.io
    

       方式二:

        使用curl安装,可以直接安装最新版

    sudo apt-get install curl  // 如果没有安装curl的话
    curl -sSL https://get.docker.com | sh
    

      安装完成之后,需要启动:

    sudo service docker start
    

       每次需要使用sudo权限很麻烦,所以将用户添加到docker组中更方便一点,然后重启docker服务。

    sudo usermod -aG docker 用户名
    service docker restart // 重启

       检查docker是否安装成功,以及docker版本:

    docker version
    

       会得到如下信息,版本可能会不相同

    Client:
     Version:	18.03.0-ce
     API version:	1.37
     Go version:	go1.9.4
     Git commit:	0520e24
     Built:	Wed Mar 21 23:10:22 2018
     OS/Arch:	linux/amd64
     Experimental:	false
     Orchestrator:	swarm
    
    Server:
     Engine:
      Version:	18.03.0-ce
      API version:	1.37 (minimum version 1.12)
      Go version:	go1.9.4
      Git commit:	0520e24
      Built:	Wed Mar 21 23:08:52 2018
      OS/Arch:	linux/amd64
      Experimental:	false
    

     三、docker的简单使用:

      1. 由于国内网络限制,可能直接从hub.docker.com 上获取docker镜像可能会花费很长时间,因此,我选择国内的一些加速器:

      使用 /etc/docker/daemon.json来配置 Daemon,若没有daemon.json需要在对应目录下新建一个,然后daemon.json内容如下:

    {
      "registry-mirrors": ["http://hub-mirror.c.163.com"]
    }
    

      2.从docker仓库中获取一个docker镜像:

        1)hello-world镜像试水

      直接运行,会先拉取镜像,然后创建容器

    sudo docker run hello-world

      这时候,docker会查询本地是否有hello-world镜像,如果没有,则会从代码仓库中拉取该镜像。

    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    9bb5a5d4561a: Pull complete 
    Digest: sha256:bbdaf0ed64b665f3061aeab15b946697dd00845161935d9238ed28e8cfc2581c
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/engine/userguide/
    

       也可以直接拉取镜像

    docker pull hello-world
    

       2)hello-world的相关信息查询:

      查看docker中当前有哪些镜像:

    docker images
    

       查看有哪些容器:

    docker ps -a // -a会将所有容器显示出来,而docker ps 只显示正在运行的
    
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                           PORTS               NAMES
    b9bfbac244d2        hello-world         "/hello"            7 minutes ago       Exited (0) 7 minutes ago                             brave_booth
    

       可以看到hello-world容器的名称是brave_booth(该名字可以指定)

      查看hello-world容器的相关日志(这个命令很有用,帮助我解决了一些容器运行不起来的问题):

    docker logs brave_booth
    
    root@aasV:~# docker logs brave_booth 
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/engine/userguide/
    

      查看某个容器的配置信息:

    docker inspect brave_booth
    
    [
        {
            "Id": "b9bfbac244d2adbe4918554f7cdab0a238e7a913c837e91019a4b2a7fa2d89f8",
            "Created": "2018-04-13T05:56:22.678087607Z",
            "Path": "/hello",
            "Args": [],
            "State": {
                "Status": "exited",
                "Running": false,
                "Paused": false,
                "Restarting": false,
                "OOMKilled": false,
                "Dead": false,
                "Pid": 0,
                "ExitCode": 0,
                "Error": "",
                "StartedAt": "2018-04-13T05:56:23.916771803Z",
                "FinishedAt": "2018-04-13T05:56:23.946817217Z"
            },
            "Image": "sha256:e38bc07ac18ee64e6d59cf2eafcdddf9cec2364dfe129fe0af75f1b0194e0c96",
            "ResolvConfPath": "/var/lib/docker/containers/b9bfbac244d2adbe4918554f7cdab0a238e7a913c837e91019a4b2a7fa2d89f8/resolv.conf",
            "HostnamePath": "/var/lib/docker/containers/b9bfbac244d2adbe4918554f7cdab0a238e7a913c837e91019a4b2a7fa2d89f8/hostname",
            "HostsPath": "/var/lib/docker/containers/b9bfbac244d2adbe4918554f7cdab0a238e7a913c837e91019a4b2a7fa2d89f8/hosts", //该容器在主机的物理地址,很有用哦
            "LogPath": "/var/lib/docker/containers/b9bfbac244d2adbe4918554f7cdab0a238e7a913c837e91019a4b2a7fa2d89f8/b9bfbac244d2adbe4918554f7cdab0a238e7a913c837e91019a4b2a7fa2d89f8-json.log",
            "Name": "/brave_booth",
            "RestartCount": 0,
            "Driver": "aufs",
            "Platform": "linux",
            "MountLabel": "",
            "ProcessLabel": "",
            "AppArmorProfile": "docker-default",
            "ExecIDs": null,
            "HostConfig": {
                "Binds": null,
                "ContainerIDFile": "",
                "LogConfig": {
                    "Type": "json-file",
                    "Config": {}
                },
                "NetworkMode": "default",
                "PortBindings": {},
                "RestartPolicy": {
                    "Name": "no",
                    "MaximumRetryCount": 0
                },
                "AutoRemove": false,
                "VolumeDriver": "",
                "VolumesFrom": null,
                "CapAdd": null,
                "CapDrop": null,
                "Dns": [],
                "DnsOptions": [],
                "DnsSearch": [],
                "ExtraHosts": null,
                "GroupAdd": null,
                "IpcMode": "shareable",
                "Cgroup": "",
                "Links": null,
                "OomScoreAdj": 0,
                "PidMode": "",
                "Privileged": false,
                "PublishAllPorts": false,
                "ReadonlyRootfs": false,
                "SecurityOpt": null,
                "UTSMode": "",
                "UsernsMode": "",
                "ShmSize": 67108864,
                "Runtime": "runc",
                "ConsoleSize": [
                    0,
                    0
                ],
                "Isolation": "",
                "CpuShares": 0,
                "Memory": 0,
                "NanoCpus": 0,
                "CgroupParent": "",
                "BlkioWeight": 0,
                "BlkioWeightDevice": [],
                "BlkioDeviceReadBps": null,
                "BlkioDeviceWriteBps": null,
                "BlkioDeviceReadIOps": null,
                "BlkioDeviceWriteIOps": null,
                "CpuPeriod": 0,
                "CpuQuota": 0,
                "CpuRealtimePeriod": 0,
                "CpuRealtimeRuntime": 0,
                "CpusetCpus": "",
                "CpusetMems": "",
                "Devices": [],
                "DeviceCgroupRules": null,
                "DiskQuota": 0,
                "KernelMemory": 0,
                "MemoryReservation": 0,
                "MemorySwap": 0,
                "MemorySwappiness": null,
                "OomKillDisable": false,
                "PidsLimit": 0,
                "Ulimits": null,
                "CpuCount": 0,
                "CpuPercent": 0,
                "IOMaximumIOps": 0,
                "IOMaximumBandwidth": 0
            },
            "GraphDriver": {
                "Data": null,
                "Name": "aufs"
            },
            "Mounts": [],
            "Config": {
                "Hostname": "b9bfbac244d2",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
                "AttachStdout": true,
                "AttachStderr": true,
                "Tty": false,
                "OpenStdin": false,
                "StdinOnce": false,
                "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                ],
                "Cmd": [
                    "/hello"
                ],
                "ArgsEscaped": true,
                "Image": "hello-world",
                "Volumes": null,
                "WorkingDir": "",
                "Entrypoint": null,
                "OnBuild": null,
                "Labels": {}
            },
            "NetworkSettings": {
                "Bridge": "",
                "SandboxID": "700ca800a7f8b43a7d69193f443672eb8d9ae1249fbe4eed3c1d0d9d5e838344",
                "HairpinMode": false,
                "LinkLocalIPv6Address": "",
                "LinkLocalIPv6PrefixLen": 0,
                "Ports": {},
                "SandboxKey": "/var/run/docker/netns/700ca800a7f8",
                "SecondaryIPAddresses": null,
                "SecondaryIPv6Addresses": null,
                "EndpointID": "",
                "Gateway": "",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "IPAddress": "",
                "IPPrefixLen": 0,
                "IPv6Gateway": "",
                "MacAddress": "",
                "Networks": {
                    "bridge": {
                        "IPAMConfig": null,
                        "Links": null,
                        "Aliases": null,
                        "NetworkID": "1086453e378b89bade50ea64c981d42e92cb39aaa7cdf4ac68c70c4411e174dd",
                        "EndpointID": "",
                        "Gateway": "",
                        "IPAddress": "",
                        "IPPrefixLen": 0,
                        "IPv6Gateway": "",
                        "GlobalIPv6Address": "",
                        "GlobalIPv6PrefixLen": 0,
                        "MacAddress": "",
                        "DriverOpts": null
                    }
                }
            }
        }
    ]
    

     四、尝试实践与资源总结:

      docker中文网站:https://www.docker-cn.com/

      菜鸟教程:http://www.runoob.com/docker/ubuntu-docker-install.html

      我尝试在docker容器中在安装一个ubuntu镜像,然后对该镜像进行相关操作。

      执行命令:

    sudo docker exec -it containerID或containerName /bin/bash 
    

       成功进入ubuntu容器,然后在该容器中安装了nginx,可参照该网站http://wiki.ubuntu.org.cn/Nginx安装,并成功启动使用。然而启动了nginx之后,发现在容器内部使用curl访问localhost是没有问题的,那么我如何才能在本地机器上访问该容器内部的nginx呢?

      那么肯定是找到docker为该容易分配的IP地址嘛,经过一番尝试,发现之前使用的命令docker inspect 还是最大的突破口

      使用命令:

    docker inspect 容器ID | grep IPAddress
    

       成功找到该容器的IP地址172.17.0.2。在本地主机浏览器中访问172.17.0.2,看到nginx的欢迎页,真的很激动哦。

      

      

      

      

  • 相关阅读:
    jvm系列(八):jvm知识点总览-高级Java工程师面试必备
    jvm系列(七):jvm调优-工具篇
    JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结
    Java ClassLoader详解
    语言堆栈入门——堆和栈的区别
    kubernetes基本了解
    软编码和硬编码的理解
    前台页面传日期类型后台接收问题
    mybatis-plus简单了解
    二叉树基础知识
  • 原文地址:https://www.cnblogs.com/kingkangstudy/p/8820119.html
Copyright © 2011-2022 走看看