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的入门基本已经结束,欢迎收藏+推荐

posted @ 2020-05-28 08:23  first_semon  阅读(208)  评论(0编辑  收藏  举报