06-Docker镜像与容器的使用

还以以我比较喜欢的Archlinux为例,正好它也提供了轻量级的docker镜像
首先我们要把镜像拉取到本地

拉取镜像

$ sudo docker pull archlinux
Using default tag: latest
latest: Pulling from library/archlinux
cb935d5e7494: Pull complete 
0db807cf654f: Pull complete 
ea1144bdd5f5: Pull complete 
e029eb9f912a: Pull complete 
4a944e1bfce9: Pull complete 
ac07c34e00d1: Pull complete 
Digest: sha256:55d38aa4a7da0af27d3a949a551e81fdb30f26fe241135e2024711fd2a5676d4
Status: Downloaded newer image for archlinux:latest
docker.io/library/archlinux:latest

执行完等待下载就会看到上面的结果,拉取成功

查看拉取的镜像

$ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jenkins/jenkins     lts                 f669140ba6ec        13 days ago         711MB
archlinux           latest              90aeadc1688f        6 weeks ago         418MB
hello-world         latest              bf756fb1ae65        9 months ago        13.3kB

通过镜像运行一个容器

$ sudo docker run -it --name archlinux 90aeadc1688f /bin/bash
[root@2d834e925afb /]#

看到容器已经启动了,命令提示符也转到了新的容器上面,接着执行的命令就是容器中的archlinux中执行
那怎么退出archlinux容器呢,exit就好了
那上面执行的这个命令所有的参数都是什么意思呢:

  • -i 启动交互式容器的命令
  • -t 启动一个终端
  • --name 指定容器的名字,不可重复,如果不指定docker会贴心的给指定一个名字,我看了好几个名字,都是一个形容词加一个名人的姓,一看都知道是谁,比如determined_torvalds,哈哈linux内核缔造者Linus Torvalds,名言:Talk is cheap,show me your code.
  • 90aeadc1688f 镜像的ID,也可以写成镜像名字archlinux,推荐使用名字,清晰
  • /bin/bash 跟在镜像名或者ID后面的是命令,因为是一个交互式的终端,所以我们指定一个/bin/bash也可以不指定,默认是/usr/bin/bash
    多说一点,docker命令可以进行聚合,如上面所示的,完整写法应该是 sudo docker run -i -t ...

查看所有启动过的容器

$ sudo docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                              NAMES
f67d9581fcbc        archlinux           "/usr/bin/bash"          11 seconds ago      Exited (1) 8 seconds ago                                                      archlinux
2d834e925afb        90aeadc1688f        "/bin/bash"              3 hours ago         Up 2 hours                                                                    confident_varahamihira
88f0c81fffa6        f669140ba6ec        "/sbin/tini -- /usr/…"   19 hours ago        Up 2 hours                 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   jenkins
a6d06bdacfb7        hello-world         "/hello"                 4 days ago          Exited (0) 4 days ago                                                         beautiful_shockley
a07b1c26eba8        hello-world         "/hello"                 4 days ago          Exited (0) 4 days ago                                                         eloquent_shirley
101da06ce0c1        hello-world         "/hello"                 7 days ago          Exited (0) 7 days ago                                                         determined_torvalds
3db0e6cfc853        hello-world         "/hello"                 7 days ago          Exited (0) 7 days ago                                                         charming_ardinghelli

启动一个已经停止的容器

当我们使用docker run命令时,每次都是启动一个全新容器
那怎么启动一个停止的容器呢,docker start
比如上面我们看到NAMEarchlinuxCONTAINER IDf67d9581fcbc的容器

$ sudo docker start archlinux # 既可以是容器名,也可以是容器ID
archlinux
[king@coder ~]$ 

哎,等等,我们看到容器启动后没有进入容器的命令行,这是怎么回事呢
其实很简单,你可以用sudo docker container ls -a或者sudo docker ps -a查看容器是否启动
你会发现容器是启动了的,docker start会让容器默认在后台运行,这个docker startdocker run一样想要进入交互式,就要带上-i参数
那你该问了,如果我刚始没有使用-i参数启动了容器,怎么办?
Emmm……,关掉容器,重新使用正确的指令进入呗
开玩笑了,怎么可能呢,参见下个小章节吧!

如何进入后台运行的容器

有两个命令:docker attachdocker exec
有什么区别呢?
前者进入容器使用exit会停止运行的容器,后者则不会
具体的验证您可以进入容器再退出后,使用docker ps -a查看对应容器的启动状态
两个命令都该怎么用演示如下:

  • docker attach 一个参数,容器名或者容器ID
$ sudo docker attach archlinux 
[root@f67d9581fcbc /]# 

我们看到已经进入了容器的可交互终端

  • docker exec 该命令需要两个参数,第一个容器名,第二个执行的命令,跟docker run类似
$ sudo docker exec archlinux /bin/bash
[king@coder ~]$ 

哎,我们发现,没有进入到交互式终端,举一反三

$ sudo docker exec -it archlinux /bin/bash
[root@f67d9581fcbc /]# uptime
 06:33:39 up  3:57,  0 users,  load average: 0.12, 0.21, 0.15

停止和重启容器

命令扔在这儿,不用试了吧,都是一个参数,容器名或者容器ID

  • 停止 docker stop docker kill跟我们在Linux中执行kill -5kill -9差不多
  • 重启 docker restart

删除容器

  • docker rm 一个参数,容器名或者ID,可跟多个

查看删除镜像

  • 查看 docker image ls
  • 删除docker rmi -f 一个参数,镜像ID,使用-f表示强制删除,因为镜像被容器所依赖

你可能感兴趣的:(06-Docker镜像与容器的使用)