Docker学习(二)

本文详细介绍了Docker的镜像和容器操作,包括如何获取和删除镜像,查看和创建容器,以及容器的启动、停止、重启等管理。重点讲述了Dockerfile的使用来创建镜像,还探讨了镜像的存储位置和如何修改存储位置。此外,文章还讨论了如何进入和管理容器,如使用attach和exec命令,以及容器的暂停、删除和导入导出操作。
摘要由CSDN通过智能技术生成

Chapter 2 Docker镜像与容器

本次Docker学习基于Datawhale开源地址:https://github.com/datawhalechina/team-learning-program/tree/master/Docker

学习目的

-使用Docker镜像
-操作Docker容器

一、Docker镜像

1、获取镜像

从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:

$ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

Docker Registry官方默认地址是 Docker Hub(docker.io)

$ docker pull ubuntu:19.10
19.10: Pulling from library/ubuntu
3f2411103a12: Pull complete 
4da04088b2c2: Pull complete 
ab1184837b6f: Pull complete 
354c6da61dcc: Pull complete 
Digest: sha256:f332c4057e21ec71cc8b20b05328d476104a069bfa6882877e0920e8140edcf0
Status: Downloaded newer image for ubuntu:19.10
docker.io/library/ubuntu:19.10

如果官方地址下载缓慢可以配置镜像加速。

2、查看镜像

查看已有镜像列表,使用 docker image ls 命令。

$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
ubuntu        18.04     3339fde08fc3   2 weeks ago     63.3MB
hello-world   latest    d1165f221234   5 weeks ago     13.3kB
ubuntu        19.10     2f6c85efea61   10 months ago   72.9MB

列表中包含了 仓库名标签镜像 ID创建时间 以及 占用空间

IMAGE ID 是镜像的唯一标识,一个镜像可以对应多个 TAG。因此,在上面的例子中,我们可以看到 ubuntu:18.04ubuntu:bionic 拥有相同的 ID,因为它们对应的是同一个镜像。

3、删除镜像

如果要从本地删除镜像,使用 docker image rm 命令,其格式为:

$ docker image rm [选项] <镜像1> [<镜像2> ...]

其中,<镜像> 可以是 镜像短ID镜像长ID镜像名 或者 镜像摘要

镜像短ID删除 ubuntu:18.04 镜像。

$ docker image rm 3339
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:122f506735a26c0a1aff2363335412cfc4f84de38326356d31ee00c2cbe52171
Deleted: sha256:3339fde08fc3ae453e891ba0211cccec19e1f278f5a4599549740c1fd32572ed
Deleted: sha256:2e679ff6214ca6f0705826d1b1704fab0f425395026d7f4d7667347628323a8e
Deleted: sha256:79fff99f20dcbfcb7ba63073d1c8f60b8224257628064af867ec7b5cfa58e957
Deleted: sha256:030309cad0ba82b098939419dcb5e0a95c77d2427d99c44a690ecab59f80a487

最精确的是用 镜像摘要 删除镜像。

$ docker image ls --digests
REPOSITORY    TAG       DIGEST                                                                    IMAGE ID       CREATED         SIZE
hello-world   latest    sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24   d1165f221234   5 weeks ago     13.3kB
ubuntu        19.10     sha256:f332c4057e21ec71cc8b20b05328d476104a069bfa6882877e0920e8140edcf0   2f6c85efea61   10 months ago   72.9MB

注意:镜像的唯一标识是其 ID 和摘要,而一个镜像可以有多个标签。因此当我们使用上面命令删除镜像的时候,实际上是在要求删除某个标签的镜像。所以首先需要做的是将满足我们要求的所有镜像标签都取消,这就是我们看到的 Untagged 的信息。因为一个镜像可以对应多个标签,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像,如果是这种情况,那么 Delete 行为就不会发生。当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。

4、创建镜像

创建镜像主要有三种方式:基于已有镜像容器创建基于本地模板导入基于Dockerfile创建。其中基于Dockerfile是最基础的创建方式
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
例如:在一个空白目录中,建立一个文本文件,并命名为 Dockerfile。(先进入root模式)

$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile

输入内容:

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

FROM 指定基础镜像, RUN执行命令。Docker 存在一个特殊的镜像,名为 scratch。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。每一个 RUN 的行为,就新建立一层,在其上执行这些命令,执行结束后,commit 这一层的修改,构成新的镜像。

5、储存位置

在操作系统中(Linux),默认情况下 Docker 容器的存放位置在 /var/lib/docker 目录下面,可以通过命令查看

$ docker info | grep "Docker Root Dir"
 Docker Root Dir: /var/lib/docker

我们使用docker pull 下载的镜像,都会存在这个目录下,当下载的镜像过多,或容器运行过程中产生大量数据导致存储容量不足时,可以修改镜像储存的位置。修改方法很多,这里简要介绍一种使用软链接修改docker默认储存位置方法。

#stop docker
$ sudo systemctl stop docker
#move docker
$ mv /var/lib/docker /data/docker
#ln docker
$ ln -sf /data/docker /var/lib/docker

移动整个 /var/lib/docker 目录到空间比较大的目的路径/data/docker。这时候启动 Docker 时发现存储目录依旧是 /var/lib/docker 目录,但是实际上是存储在数据盘 /data/docker 上了。

二、Docker容器

不同于虚拟机,由于Docker 的容器非常轻量级,很多时候我们可以随时删除和新创建容器。

1、创建容器

主要命令为 docker run

$ docker run ubuntu:18.04 /bin/echo 'Hello world'
Hello world

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从registry下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

2、启动容器

利用 docker container start 命令,直接将一个已经终止(exited)的容器启动运行。

3、停止容器

利用docker stop命令可以停止运行的容器。如果想要快速停止容器,可使用docker kill命令。

4、重启容器

对于已经处于停止状态的容器,可以通过docker start重新启动。

注意:docker start会保留容器的第一次启动时的所有参数。docker restart可以重启容器,其作用就是依次执行docker stop和docker start。对于服务类容器,通常希望它能够自动重启。启动容器时设置--restart就可以达到效果。--restart=always意味着无论容器因何种原因退出(包括正常退出),都立即重启;

$ docker run -it ubuntu:15.10 /bin/echo --restart=always -d "Hello world"
--restart=always -d Hello world

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
ad0723ad8383        ubuntu:15.10        "/bin/echo --restart…"   9 seconds ago       Exited (0) 8 seconds ago                       gracious_chatelet
2a545c90e593        ubuntu:15.10        "/bin/echo -d 'Hello…"   6 minutes ago       Exited (0) 6 minutes ago                       blissful_leakey
bdf593fda8be        ubuntu:15.10        "/bin/bash"              25 minutes ago      Up 13 minutes                                  cranky_mclaren

5、后台运行

通过添加 -d 参数来实现。例如:

$ docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a

6、进入容器

在使用 -d 参数时,容器启动后会进入后台,启动完容器之后会停在host端;某些时候需要进入容器进行操作,包括使用 docker attach 命令或 docker exec 命令。

docker attach 命令:

$ docker run -dit ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia

$ docker attach 243c
root@243c32535da7:/#

exec 命令:

$ docker run -dit ubuntu
69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
69d137adef7a        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           zealous_swirles

$ docker exec -i 69d1 bash
ls
bin
boot
dev
...

attach和exec的区别:
(1)attach直接进入容器启动命令的终端,不会启动新的进程;
(2)exec则是在容器中打开新的终端,并且可以启动新的进程;
(3)如果想直接在终端中查看命令的输出,用attach,其他情况使用exec;

7、暂停容器

利用:docker pause命令。

8、删除容器

利用 docker container rm 命令

9、导出容器

利用 docker export 命令将导出容器快照到本地文件。

10、导入容器

利用 docker import 从容器快照文件中再导入为镜像。

总结

  • 镜像和容器有很多种操作和使用方法,只有想不到,没有做不到,遇到问题多查查。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值