• docker 基础入门


    1:docker 安装时 linux内核版本过低问题

      使用uname -a 可以查看linux内核的版本号,例如ubuntu会输出类似的内容:

    root@ubuntu:~# uname -a
    Linux ubuntu 4.4.0-142-generic #168-Ubuntu SMP Wed Jan 16 21:00:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

    由于docker的安装条件包括了内核的条件限制:低于3.8的运行docker可能会有问题

    下面来看一下如何升级linux内核

    apt-get update
    
    spt-get install linux-headers-版本号-generic等待安装完毕

    然后是用update-grub启动加载器加载新内核。

    最后使用reboot来重启宿主机启用新的内核。

    验证以下使用uname -a看看内核版本有没有变化

     2:验证docker是否已经准备就绪

    docker info

      使用docker可执行程序的info命令,如果docker准备就绪的话,会输出已运行的容器数量,安装的镜像数量,docker使用的执行驱动和存储驱动和docker环境的配置信息。

    3:docker 是一个基于 c/s架构设计的,既能做客户端也能做服务器。做客户端时,docker程序向docker守护进程发送请求,然后在度i返回的请求结果惊醒处理。

    4:运行一个容器

    • 第一条命令
    docker run -i -t  ubuntu /bin/bash

    下面来解释以下各个参数的意思:

    docker run 这是docker的一条命令, 

    -i 标志保证容器中STDIN时开启的,持久的表中输入时交互式shell的半边天

    -t 告诉docker为要创建的容器分配一个伪tty终端。另外半边天。

    ubunutu 是一个镜像。

    /bin/bash 告诉docker容器运行一个shell命令。

    运行完上面的命令后就会i进入到ubuntu容器中,docker会给容器分配一个唯一id:dae666724601

    root@ubuntu:~# docker run -i -t  ubuntu /bin/bash
    root@dae666724601:/# 
    • 第二条命令:查看主机名称
    root@dae666724601:/# hostname
    dae666724601
    • 第三条命令:查看ip地址
    root@dae666724601:/# cat /etc/hosts 
    127.0.0.1    localhost
    ::1    localhost ip6-localhost ip6-loopback
    fe00::0    ip6-localnet
    ff00::0    ip6-mcastprefix
    ff02::1    ip6-allnodes
    ff02::2    ip6-allrouters
    172.17.0.4    dae666724601
    • 第四条命令:容器中安装vim
    root@dae666724601:/# apt-get update && apt-get install vim
    • 第五条命令:退出容器,回到宿主机
    root@dae666724601:/# exit
    exit

    这条命令会结束容器的运行。可以使用虾米那一条命令来看一下容器是否已经结束运行了

    • 第六条命令。这里也可以使用-a 参数
    root@ubuntu:~# docker ps -l
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    dae666724601        ubuntu              "/bin/bash"         18 minutes ago      Exited (0) 6 seconds ago                       heuristic_poincare

    -l参数是列出最后一次运行的容器,亲测只包括已经停止的。

    -a参数是查看当前系统中容器的列表(已经停止的和正在运行的),来看一下两者的输出区别:

    root@ubuntu:~# docker ps -l
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    dae666724601        ubuntu              "/bin/bash"         18 minutes ago      Exited (0) 6 seconds ago                       heuristic_poincare
    root@ubuntu:~# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                               NAMES
    dae666724601        ubuntu              "/bin/bash"              22 minutes ago      Exited (0) 3 minutes ago                                       heuristic_poincare
    8b7fa227bca2        mysql               "docker-entrypoint.s…"   17 hours ago        Up 17 hours                33060/tcp, 0.0.0.0:3307->3306/tcp   second_mysql
    df6e780fb24a        mysql               "docker-entrypoint.s…"   17 hours ago        Up 17 hours                0.0.0.0:3306->3306/tcp, 33060/tcp   first-mysql

    从上面的输出结果可以看出来,NAMES这一列,系统给自动分配了一个随机的名字。下面来说一下容器的命名

    • 第七条命令:容器的命名。在启动容器的时候可以加上--name参数来指定容器的名字,从而避免随机命名。
    root@ubuntu:~# docker ps -al
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    dd1ee14b8f14        ubuntu              "/bin/bash"         19 seconds ago      Exited (0) 5 seconds ago                       smeon_ubuntu

    细心的同学应该会发现容器的唯一id和名字都变了。是的,我们在使用run命令的时候,docker是会进行创建和运行两步操作的,但是用的是同一个镜像。所以使用docker ps -a 会看到有两个ubuntu容器已经停止了。

    root@ubuntu:~# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                               NAMES
    dd1ee14b8f14        ubuntu              "/bin/bash"              27 seconds ago      Exited (0) 14 seconds ago                                       smeon_ubuntu
    dae666724601        ubuntu              "/bin/bash"              31 minutes ago      Exited (0) 13 minutes ago                                       heuristic_poincare
    8b7fa227bca2        mysql               "docker-entrypoint.s…"   17 hours ago        Up 17 hours                 33060/tcp, 0.0.0.0:3307->3306/tcp   second_mysql
    df6e780fb24a        mysql               "docker-entrypoint.s…"   17 hours ago        Up 17 hours                 0.0.0.0:3306->3306/tcp, 33060/tcp   first-mysql

    那如果像复用之前已经停止的容器该怎么办呢?这就需要使用另一个命令。

    • 第八条命令:docker start 容器名字/唯一段id/唯一长id.让我们来试一下吧:
    root@ubuntu:~# docker start smeon_ubuntu
    smeon_ubuntu
    root@ubuntu:~# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                               NAMES
    dd1ee14b8f14        ubuntu              "/bin/bash"              6 minutes ago       Up 50 seconds                                                   smeon_ubuntu
    dae666724601        ubuntu              "/bin/bash"              37 minutes ago      Exited (0) 19 minutes ago                                       heuristic_poincare
    8b7fa227bca2        mysql               "docker-entrypoint.s…"   17 hours ago        Up 17 hours                 33060/tcp, 0.0.0.0:3307->3306/tcp   second_mysql
    df6e780fb24a        mysql               "docker-entrypoint.s…"   17 hours ago        Up 17 hours                 0.0.0.0:3306->3306/tcp, 33060/tcp   first-mysql

    可以看到之前停止的指定名字的容器已经启动了。另外两种方式可以自己去试一下。另外还可以使用docker restart 容器名字/唯一段id/唯一长id 来重启容器。

    • 第九条命令:停止一个 已经启动的容器 docker stop容器名字/唯一段id/唯一长id
    root@ubuntu:~# docker stop  smeon_ubuntu
    smeon_ubuntu
    root@ubuntu:~# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                               NAMES
    dd1ee14b8f14        ubuntu              "/bin/bash"              9 minutes ago       Exited (0) 5 seconds ago                                        smeon_ubuntu
    dae666724601        ubuntu              "/bin/bash"              40 minutes ago      Exited (0) 22 minutes ago                                       heuristic_poincare
    8b7fa227bca2        mysql               "docker-entrypoint.s…"   17 hours ago        Up 17 hours                 33060/tcp, 0.0.0.0:3307->3306/tcp   second_mysql
    df6e780fb24a        mysql               "docker-entrypoint.s…"   17 hours ago        Up 17 hours                 0.0.0.0:3306->3306/tcp, 33060/tcp   first-mysql
    •  第十条命令:attach 命令
    root@ubuntu:~# docker attach  heuristic_poincare
    root@dae666724601:/# 

    这里需要注意的是:如果容器时停止的,attach 的时候会失败。

    • 第十一条命令:创建一个守护式容器。上面我们创建的是一个交互式的容器
    root@ubuntu:~# docker run --name daemon_ubuntu -d ubuntu /bin/bash -c "while true; do echo hello world;sleep 1; done"
    6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69

    -d 参数是一个后台运行的参数

    -c 参数是一直循环输出hello world,直到容器或进程停止。

    问题来了:怎么能看到上一条命令的输出呢?这需要下一条命令:

    • 第十二条命令 : docker logs daemon_ubuntu(ctr +c 可以退出日志查看)
    root@ubuntu:~# docker logs daemon_ubuntu
    hello world
    hello world
    hello world
    hello world
    hello world
    ...

    如果不想查看所有日志,只需要追踪最新的logs日志,有没有向tail  -f 一样的参数呢?大难是肯定的。

    docker logs --tail 10 -f daemon_ubunt 使用参数 --tail 即可以查看最近10条的日志。

    • 第十三条命令 :查看容器内的进程
    root@ubuntu:~# docker top daemon_ubuntu
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                13148               13131               0                   10:13               ?                   00:00:00            /bin/bash -c while true; do echo hello world;sleep 1; done
    root                13996               13148               0                   10:21               ?                   00:00:00            sleep 1
    •  第十四条命令:在容器内运行进程。
    root@ubuntu:~# docker exec  -d smeon_ubuntu touch /home/config_file.conf
    root@ubuntu:~# docker restart smeon_ubuntu
    smeon_ubuntu
    root@ubuntu:~# docker attach  smeon_ubuntu
    root@dd1ee14b8f14:/# ls
    bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@dd1ee14b8f14:/# cd home/
    root@dd1ee14b8f14:/home# ls
    config_file.conf

    -d 参数 表明要运行一个后台进程

    -d之后是指明容器的名字,以及需要执行的命令。这里创建一个空的配置文件。

    通过docker exec 命令可以在正在运行的容器中进行维护,监控和管理任务。

    再举一个例子:在start 或restart的一个容器的时候不会进入到对应的容器内。也就是不会进入到交互式界面,这时候可以使用docker exec 来进入shell交互式界面。

    root@ubuntu:~# docker exec -i -t  smeon_ubuntu /bin/bash
    root@dd1ee14b8f14:/# 
    • 第十五条命令:自动重启容器。
    root@ubuntu:~# docker run --restart=always --name  daemon_ubuntu -d ubuntu /bin/bash -c "while true; echo hello world; sleep 1 ; done"
    docker: Error response from daemon: Conflict. The container name "/daemon_ubuntu" is already in use by container "6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69". You have to remove (or rename) that container to be able to reuse that name.
    See 'docker run --help'.

    注意这个--resatrt参数是只有run 命令才有的,start 和restart没有该参数。run 会创建新的容器。

    • 第十六条命令:除了docker ps 来获取容器的信息外,深入获取容器信息。
    root@ubuntu:~# docker inspect daemon_ubuntu
    [
        {
            "Id": "6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69",
            "Created": "2020-05-28T02:13:05.496480088Z",
            "Path": "/bin/bash",
            "Args": [
                "-c",
                "while true; do echo hello world;sleep 1; done"
            ],
            "State": {
                "Status": "exited",
                "Running": false,
                "Paused": false,
                "Restarting": false,
                "OOMKilled": false,
                "Dead": false,
                "Pid": 0,
                "ExitCode": 137,
                "Error": "",
                "StartedAt": "2020-05-28T02:22:28.858219855Z",
                "FinishedAt": "2020-05-28T02:52:01.914573489Z"
            },
            "Image": "sha256:1d622ef86b138c7e96d4f797bf5e4baca3249f030c575b9337638594f2b63f01",
            "ResolvConfPath": "/var/lib/docker/containers/6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69/resolv.conf",
            "HostnamePath": "/var/lib/docker/containers/6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69/hostname",
            "HostsPath": "/var/lib/docker/containers/6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69/hosts",
            "LogPath": "/var/lib/docker/containers/6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69/6b2bd21daf3362e1b7cc75ede26eaf691f1d09926fa3fb5f99c1309a01f69f69-json.log",
            "Name": "/daemon_ubuntu",
         ...
        }
    ]

    inspect命令返回的参数比较多,可以通过--format参数来输出指定的配置信息。例如:

    root@ubuntu:~# docker inspect --format='{{.State.Status}}' daemon_ubuntu
    exited
    • 第十七条命令:删除容器:docker rm 容器名字/唯一短ID/唯一长ID
    root@ubuntu:~# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS                               NAMES
    6b2bd21daf33        ubuntu              "/bin/bash -c 'while…"   45 minutes ago      Exited (137) 6 minutes ago                                       daemon_ubuntu
    dd1ee14b8f14        ubuntu              "/bin/bash"              About an hour ago   Up 26 minutes                                                    smeon_ubuntu
    dae666724601        ubuntu              "/bin/bash"              2 hours ago         Exited (0) 53 minutes ago                                        heuristic_poincare
    8b7fa227bca2        mysql               "docker-entrypoint.s…"   18 hours ago        Up 18 hours                  33060/tcp, 0.0.0.0:3307->3306/tcp   second_mysql
    df6e780fb24a        mysql               "docker-entrypoint.s…"   18 hours ago        Up 18 hours                  0.0.0.0:3306->3306/tcp, 33060/tcp   first-mysql
    root@ubuntu:~# docker rm heuristic_poincare
    heuristic_poincare
    root@ubuntu:~# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS                               NAMES
    6b2bd21daf33        ubuntu              "/bin/bash -c 'while…"   46 minutes ago      Exited (137) 7 minutes ago                                       daemon_ubuntu
    dd1ee14b8f14        ubuntu              "/bin/bash"              About an hour ago   Up 26 minutes                                                    smeon_ubuntu
    8b7fa227bca2        mysql               "docker-entrypoint.s…"   18 hours ago        Up 18 hours                  33060/tcp, 0.0.0.0:3307->3306/tcp   second_mysql
    df6e780fb24a        mysql               "docker-entrypoint.s…"   18 hours ago        Up 18 hours                  0.0.0.0:3306->3306/tcp, 33060/tcp   first-mysql
    root@ubuntu:~# 

     各位至此,docker的入门基本已经结束,欢迎收藏+推荐

    作者:first_semon
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题,欢迎交流
  • 相关阅读:
    灵活的JavaScript(一)
    菜鸟快飞之JavaScript对象、原型、继承(三)
    菜鸟快飞之JavaScript对象、原型、继承(二)
    菜鸟快飞之JavaScript对象、原型、继承(一)
    undo清理 &redo 持久化
    mysql执行计划分析
    mysql5.6的统计信息
    pt-online-schema-change原理分析
    校验主从数据并修复
    使用伪master+binlog恢复数据
  • 原文地址:https://www.cnblogs.com/first-semon/p/12978178.html
Copyright © 2020-2023  润新知