Linux容器-Docker镜像与容器的基本操作

镜像和容器的关系

        镜像和容器就像    与  对象实例  的关系,容器是以镜像为模板而创建的实例,
        可以使用同一个镜像创建多个容器实例。
  
  

镜像与容器的基本使用

        查看镜像列表    docker images

walker@LAPTOP-IHP7E9GG:~$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
ubuntu        latest    f643c72bc252   2 months ago    72.9MB
hello-world   latest    bf756fb1ae65   13 months ago   13.3kB

  
        获取新镜像  docker pull [镜像文件]

walker@LAPTOP-IHP7E9GG:~$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

  
        使用某个镜像,启动一个容器docker run -it centos

walker@LAPTOP-IHP7E9GG:~$ docker run -it centos bash
[root@0ced667255ee /]#

        参数说明:
                -i:  交互式操作
                -t:  终端
                -d:  可指定为后台运行
                centos:  centos  镜像
                bash:放在镜像名后的是命令,这里我们希望有个交互式  Shell,因此用的是  bash
        退出终端:输入  exit
  
        启动容器并指定后台运行  docker run -itd centos bash

walker@LAPTOP-IHP7E9GG:~$ docker run -itd centos bash
1d9751d8885da796b3788535fef348fa935545b1198b83914d4e860acbeb72fb

  
        可使用同一镜像,启动多个不同的容器,使用命令查看所有实例化过的容器docker ps -a

walker@LAPTOP-IHP7E9GG:~$ docker ps -a
CONTAINER ID   IMAGE         COMMAND       CREATED              STATUS                          PORTS     NAMES
97d55661a7d2   ubuntu        "bash"        About a minute ago   Exited (0) About a minute ago             vigorous_robinson
e50724ae44f1   ubuntu        "bash"        46 hours ago         Exited (0) 46 hours ago                   lucid_blackburn
abe3d6db3db9   ubuntu        "/bin/bash"   46 hours ago         Exited (0) 46 hours ago                   peaceful_brattain

        字段说明:
                CONTAINER ID:  容器的ID
                STATUS:  容器的状态
  
  
        查看容器或镜像的信息,  可使用  docker inspect <容器名/容器ID/镜像名:tag/镜像ID>

walker@LAPTOP-IHP7E9GG:~$ docker ps -a
CONTAINER ID   IMAGE           COMMAND                  CREATED        STATUS          PORTS                    NAMES
ad3a444aac22   new_python:v1   "bash"                   22 hours ago   Up 6 hours                               xenodochial_hoover
3538926a9526   halohub/halo    "/bin/sh -c 'java -X…"   29 hours ago   Up 44 minutes   0.0.0.0:8090->8090/tcp   halo
walker@LAPTOP-IHP7E9GG:~$ docker inspect ad3a444aac22
[
    {
        "Id": "ad3a444aac2258bb6274cafb4eb7be84ef305ea9de48524972bbf9a362d1e4a7",
        "Created": "2021-02-15T11:34:44.5427533Z",
        "Path": "bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
        ......

  
  

容器的更多操作

  
        根据容器ID启动、停止、删除容器:
                启动操作  start  docker start <容器ID>
                重启操作  restart  docker restart <容器ID>
                停止操作  stop  docker stop <容器ID>
                删除操作  rm  -f    docker rm -f <容器ID>

walker@LAPTOP-IHP7E9GG:~$ docker start 97d55661a7d2
97d55661a7d2

                检查是否启动:

walker@LAPTOP-IHP7E9GG:~$ docker ps -a | grep 97d55661a7d2
97d55661a7d2   ubuntu        "bash"        8 minutes ago    Up 37 seconds                           vigorous_robinson

  
        根据容器ID进入正在运行的容器
                docker attach <容器ID>:  可以进入容器,但退出时会导致容器停止,不推荐使用
                docker exec -it <容器ID> bash:  同样可以进入容器,退出时不会导致容器停止,推荐使用

walker@LAPTOP-IHP7E9GG:~$ docker exec -it 97d55661a7d2 bash
root@97d55661a7d2:/#

  
        根据容器ID导出容器,  并使用导出文件导入成新镜像
                导出容器:  docker export 容器ID > 导出名.tar

walker@LAPTOP-IHP7E9GG:~$ docker export abcb7f35e236 > test_export_centos.tar
walker@LAPTOP-IHP7E9GG:~$ ls test_ex*
test_export_centos.tar

  
                导入容器,  成为新镜像  docker import 文件名/URL 新镜像名:TAG名
  
                以本地归档文件方式导入

walker@LAPTOP-IHP7E9GG:~$ docker import ./test_export_centos.tar new_centos:v1
sha256:d0a26340c261ecaac932ee8f379d95ec26e5fe09fbd832c1ac8dd408153016ec
 
walker@LAPTOP-IHP7E9GG:~$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
new_centos    v1        d0a26340c261   16 seconds ago   209MB
centos        latest    300e315adb2f   2 months ago     209MB
ubuntu        latest    f643c72bc252   2 months ago     72.9MB
hello-world   latest    bf756fb1ae65   13 months ago    13.3kB

  
                以远程文件,URL方式  导入

sudo docker import http://example.com/exampleimage.tgz

  
  

镜像的更多操作

        前面已经讲述了镜像的拉取,  使用镜像创建容器,导出容器快照成为一个新镜像,  下面讲述镜像的其他操作
  
        删除镜像  docker rmi <镜像名/ID>
                与删除容器不一样,删除镜像使用  rmi,  如删除  hello-world  镜像

walker@LAPTOP-IHP7E9GG:~$ docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:31b9c7d48790f0d8c50ab433d9c3b7e17666d6993084c002c2ff1ca09b96391d
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc973ba3b1686355f221c38a36978ac63

  
        定制镜像
        当镜像仓库中的镜像不足以满足我们的需求时
                1、可以使用  已创建的容器,将其作为新模板,提交更新镜像版本,  可覆盖旧版本,也可创建为新镜像
                2、也可以使用  Dockerfile  指令新建一个更加符合需求的镜像
  
  
        使用已创建的容器  覆盖/创建新镜像
  
                当前的容器和镜像列表

walker@LAPTOP-IHP7E9GG:~$ docker images
REPOSITORY     TAG       IMAGE ID       CREATED        SIZE
halohub/halo   latest    17bf41d57c55   8 days ago     328MB
ubuntu         latest    f643c72bc252   2 months ago   72.9MB
 
walker@LAPTOP-IHP7E9GG:~$ docker ps -a
CONTAINER ID   IMAGE           COMMAND                  CREATED        STATUS                       PORTS                    NAMES
ad3a444aac22   new_python:v1   "bash"                   40 hours ago   Exited (255) 2 minutes ago                            xenodochial_hoover

  
                提交覆盖镜像:  容器ad3a444aac22,  是已经更改过了的,下面使用  commit
                以该容器作为新版本,提交覆盖镜像new_python:v1

walker@LAPTOP-IHP7E9GG:~$ docker commit -m="load work station" -a="YuJun" ad3a444aac22 new_python:v1
sha256:32834ec58b8932d58857f6858f16c0cc81432ed5cfde2f0d1939e0731057a025
 
walker@LAPTOP-IHP7E9GG:~$ docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
new_python     v1        32834ec58b89   7 seconds ago    955MB
halohub/halo   latest    17bf41d57c55   8 days ago       328MB
ubuntu         latest    f643c72bc252   2 months ago     72.9MB

                参数说明:
                        -m:  提交的描述信息
                        -a:  镜像的作者
                        ad3a444aac22:  容器ID
                        new_python:v1:  要覆盖或创建的目标镜像名
  
                指定新的镜像名,创建成新的镜像

walker@LAPTOP-IHP7E9GG:~$ docker commit -m="load work station" -a="YuJun" ad3a444aac22 new_python:v2
sha256:60100bed6af4d504d873946c980e92de94ed2c852cbf5f8988eb7f7ebc3277a6
walker@LAPTOP-IHP7E9GG:~$ docker images
REPOSITORY     TAG       IMAGE ID       CREATED         SIZE
new_python     v2        60100bed6af4   7 seconds ago   955MB
new_python     v1        e64a6ab46b42   40 hours ago    955MB
halohub/halo   latest    17bf41d57c55   8 days ago      328MB
ubuntu         latest    f643c72bc252   2 months ago    72.9MB

  
  
      使用Dockerfile  构建镜像
                DockerFile  是一个包含一组指令的文件,这组指令描述了应该怎么创建镜像,在编写好  DockerFile  后,
                使用  docker  build  执行这些指令来创建镜像。