关于Docker,你真正知道多少(一)

新学期开学,采用线上教学的方式,也算是体验了一下自我学习的乐趣(haowuliao)。老师让我们到一个实训平台去学习关于Docker的基础知识,猛的发现很有趣,以后陆续会和大家分享一下学习Docker的个人的体会,大家有更好的学习平台也可以评论分享给我~谢啦!

Docker的基本介绍

Docker是一款轻量级虚拟化容器的管理引擎,有两个基本概念需要掌握:

  • 镜像
    可以理解为一个打包了运行环境的特殊文件系统,它包含了容器启动运行所需的所有信息,包括运行程序和配置数据等。镜像不包含任何动态数据,其内容在构建之后也不会改变。在命令行中我们使用docker pull命令拉取一个镜像,可以看到镜像的新建过程。
root@evassh-1070092:~# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
423ae2b273f4: Pull complete
de83a2304fa1: Pull complete
f9a83bce3af0: Pull complete
b6b53be908de: Pull complete
Digest: sha256:04d48df82c938587820d7b6006f5071dbbffceb7ca01d2814f81857c631d44df
Status: Downloaded newer image for ubuntu:latest
root@evassh-1070092:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              72300a873c2c        7 days ago          64.2MB
root@evassh-1070092:~# docker pull busybox:1.27
1.27: Pulling from library/busybox
0ffadd58f2a6: Pull complete
Digest: sha256:bbc3a03235220b170ba48a157dd097dd1379299370e1ed99ce976df0355d24f0
Status: Downloaded newer image for busybox:1.27
root@evassh-1070092:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              72300a873c2c        7 days ago          64.2MB
busybox             1.27                6ad73

从上面可以看到我们拉取镜像的常用的两种方式,docker pull <仓库名> 默认获取仓库中最新版本的镜像;docker pull <仓库名>:<标签> 可以根据所需要的版本拉取镜像。可以使用docker images查看当前系统存在的所有镜像。

  • 容器
    镜像和容器的关系,类似于面向对象程序设计中的类和实例一样,镜像是静态的定义,而容器是镜像运行时的实体,可以看成是一个具备某个运行环境的非常轻量的虚拟机。容器可以被创建、启动、停止和删除等。在创建容器时,需要显示地为容器指定镜像。指定镜像之后,容器就具备了镜像中保存的运行环境了。
root@evassh-1070092:~# docker run --name first_docker ubuntu:latest echo "Hello Docker"
Hello Docker

同样创建完容器后我们可以使用命令docker container -a查看当前存在的所有容器信息。
以上是两个基本概念的介绍,接下来针对不同的docker命令进行研究。

启动容器
  • docker run 创建并启动一个容器
    以下命令行分别是常用的三种创建并启动容器的方法:
  • dcoker run ubuntu echo “Hello”:新建并启动一个最新版本的有ubuntu运行环境的容器(标签名为空时默认最新版本)并输出Hello,这里的echo “Hello” 为启动命令(指容器在创建后执行的命令,命令伴随着容器的启动);
  • docker run --name chl ubuntu echo “chl”:新建并启动一个具有最新版本ubuntu运行环境的容器并命名为chl;
  • docker run -it --name lgl ubuntu /bin/bash:新建并启动一个具有伪终端(/bin/bash)的容器,启动命令为“/bin/bash”,在创建容器后进入终端运行容器。
root@evassh-1070092:~# docker run ubuntu echo "Hello"
Hello
root@evassh-1070092:~# docker run --name chl ubuntu echo "chl"
chl
root@evassh-1070092:~# docker run -it --name lgl ubuntu /bin/bash
root@211d4d32c07b:/# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
   11 pts/0    00:00:00 ps
root@211d4d32c07b:/# exit
root@evassh-1070092:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
211d4d32c07b        ubuntu              "/bin/bash"         35 seconds ago      Exited (0) 7 seconds ago                       lgl
3e67b9f74b24        ubuntu              "echo chl"          2 minutes ago       Exited (0) 2 minutes ago                       chl
4da0fd8279f2        ubuntu              "echo Hello"        2 minutes ago       Exited (0) 2 minutes ago                       focused_gates
  • docker start 启动一个已经终止的容器
root@evassh-1070092:~# docker start chl
chl
root@evassh-1070092:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS            PORTS               NAMES

注意到的小伙伴可能会发现,我们使用docker start 命令启动一个容器后,再使用docker ps却没有看到应该在运行的chl容器,这是为什么呢?docker start 启动容器,相当于我们唤醒了一个sh主进程,除了使用docker stop强制终止一个容器外,当容器的启动命令终结时,主进程没有命令继续执行也会自动的终止。要注意到我们创建chl容器时使用的语句是docker run --name chl ubuntu echo “chl”,也就是说,当创建并启动容器chl后,容器自动执行echo "chl"输出chl后启动命令就完成了,自动终止了该容器,所以我们使用docker ps查看时仍然没有看到该容器在运行状态中。

查看容器信息
  • docker ps 查看运行中的容器
root@evassh-1070092:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS            PORTS               NAMES
  • docker ps -a 查看所有容器
root@evassh-1070092:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                         PORTS NAMES
702ef66c4986        busybox:1.27        "sh"                56 seconds ago       Exited(0) 55 seconds ago lgl
5ffee7cf9382        ubuntu              "/bin/bash"         About a minute ago   Exited(0) About a minute ago chl
  • docker ps -a -q 查看所有容器的序列号
root@evassh-1070092:~# docker ps -a -q
702ef66c4986
5ffee7cf9382
停止一个容器
  • docker stop停止一个正在运行的容器
    在这里 -t 参数可以指定等待一定时间后停止容器。
root@evassh-1070092:~# docker stop chl
chl
root@evassh-1070092:~# docker stop -t 10 chl
chl
  • 其他终止容器的情况
root@evassh-1070092:~# docker start chl
chl
root@evassh-1070092:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
211d4d32c07b        ubuntu              "/bin/bash"         29 minutes ago      Exited (0) 28 minutes ago                       lgl
3e67b9f74b24        ubuntu              "echo chl"          31 minutes ago      Exited (0) 2 seconds ago                        chl
4da0fd8279f2        ubuntu              "echo Hello"        31 minutes ago      Exited (0) 16 minutes ago                       focused_gates

当使用docker start chl 唤醒容器chl后容器执行输出操作,执行完后会自动终止容器。从docker pa -a 可看出第二个容器(chl)在2秒前终止程序,也就是在我们刚唤醒后执行完命令就自动终止了。

如何使容器启动后不立即终止

前面已经说过,我们唤醒一个容器其实是唤醒一个以sh的主进程,当主进程不停止这样容器就不会终止。这里就需要我们修改启动命令为死循环,并使用-d参数使命令在后台运行使之永远不会执行完(方法一)。或者将启动命令设置为启动一直运行的子进程/bin/bash,启动后进入到子进程中(方法二)

  • 方法一:将启动命令设置为死循环
root@evassh-1070092:~# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
61045d8a2d6bf1094a86cbd681df766301911f6f3411356752e112eac47a69ca
root@evassh-1070092:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS             PORTS               NAMES
61045d8a2d6b        ubuntu              "/bin/sh -c 'while t…"   31 seconds ago      Up 31 seconds                           agitated_sinoussi
  • 方法二:将启动命令设置为启动一直运行的子进程
root@evassh-1070092:~# docker run --name first_container -itd ubuntu /bin/bash
adda55786ad4509cc8b87570697f29dafbb85afde196740d73e645f522d398e1
root@evassh-1070092:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS             PORTS               NAMES
adda55786ad4        ubuntu              "/bin/bash"              9 seconds ago       Up 8 seconds                            first_container
61045d8a2d6b        ubuntu              "/bin/sh -c 'while t…"   4 minutes ago       Up 4 minutes                            agitated_sinoussi
进入一个容器
  • docker attach显示隐藏的伪终端
    在前面已经使用了docker run --name first_container -itd ubuntu /bin/bash的基础上为新建的容器分配了伪终端并隐藏在后台执行,同时我们得到了序列号adda…,一般我们只需要输入序列号的前四位课代表容器即可。
root@evassh-1070092:~# docker attach adda
root@adda55786ad4:/# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
   11 pts/0    00:00:00 ps
  • docker exec 进入容器并执行命令
    与docker attach同样我们需要先建立一个拥有隐藏伪终端的容器(输出序列号),不同的是docker exec命令需要有两个参数,一个为容器序列号(容器名字也可以),另一个为对容器进行的操作。直接把需要执行的命令放在exec的第二个参数中,并随之启动一个新的伪终端执行命令,与我们“启动命令”的终端不是同一个
root@evassh-1070092:~# docker run -itd --nametest_exec ubuntu /bin/bash
9e91fd509b8da9c642b187227c701512e29368961ce8f18f1563fb8d55102889
root@evassh-1070092:~# docker exec test_exec mkdir newdir
root@evassh-1070092:~# docker attach test_exec
root@9e91fd509b8d:/# ls
bin   etc   lib64  newdir  root  srv  usr
boot  home  media  opt     run   sys  var
dev   lib   mnt    proc    sbin  tmp
删除容器
  • docker rm 删除终止状态的程序
    使用docker ps -a 可以查看删除容器前后的变化
root@evassh-1070092:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
9e91fd509b8d        ubuntu              "/bin/bash"         8 minutes ago       Exited (127) 13 seconds ago                       test_exec
adda55786ad4        ubuntu              "/bin/bash"         26 minutes ago      Exited (127) 15 minutes ago                       first_container
root@evassh-1070092:~# docker rm adda
adda
root@evassh-1070092:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
9e91fd509b8d        ubuntu              "/bin/bash"         9 minutes ago       Exited (127) 54 seconds ago                       test_exec
  • docker rm -f 删除正在运行的容器
root@evassh-1070092:~# docker run -itd ubuntu/bin/bash
dc1a1adf5088114258b35bf92d3528bf325d0fced0fa651a3053008e7207b510
root@evassh-1070092:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS        PORTS               NAMES
dc1a1adf5088        ubuntu              "/bin/bash"         9 seconds ago       Up 8 seconds                            flamboyant_payne
root@evassh-1070092:~# docker rm -f dc1a
dc1a
root@evassh-1070092:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS        PORTS               NAMES
  • 删除所有处于终止状态的容器
    前面我们已经使用了很多次docker ps -a命令查看所有容器的信息,当我们只需要查询所有容器的序列号时,可以使用docker ps -a -q。在linux命令中,将命放在$()中会执行命令并返回该命令的执行结果,所以我们结合使用docker rm和docker ps -a -q命令就可以删除所有处于终止状态的容器。
root@evassh-1070092:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
9e91fd509b8d        ubuntu              "/bin/bash"         20 minutes ago      Exited (127) 11 minutes ago                       test_exec
root@evassh-1070092:~# docker rm $(docker ps -a -q)
9e91fd509b8d
root@evassh-1070092:~# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS        PORTS               NAMES

以上是这次Docker基础入门的实训分享,往后会按时更新(虽然每次都这样说)。欢迎大家评论,我们共同进步!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值