【Docker】Docker - image 常用命令

Posted by 西维蜀黍 on 2020-05-23, Last Modified on 2022-04-10

Introduction

**Docker 把应用程序及其依赖,打包在 image 文件里面。**只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

# 查看当前本机有的镜像
$ docker image ls

# 将 image 文件从仓库抓取到本地
$ docker image pull [image_name]

# 删除镜像
$ docker rmi [image id]
# Or
$ docker image rm [image_name]

image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。

为了方便共享,image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库。此外,出售自己制作的 image 文件也是可以的。

Demo - hello world

首先,运行下面的命令,将 image 文件从仓库抓取到本地。

$ docker image pull library/hello-world

上面代码中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world是 image 文件的名字。

由于 Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略。因此,上面的命令可以写成下面这样。

$ docker image pull hello-world

抓取成功以后,就可以在本机看到这个 image 文件了。

$ docker image ls

现在,运行这个 image 文件。

$ docker container run hello-world

docker container run命令会从 image 文件,生成一个正在运行的容器实例。

注意,docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。因此,前面的docker image pull命令并不是必需的步骤。

如果运行成功,你会在屏幕上读到下面的输出。

$ docker container run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

... ...

输出这段提示以后,hello world就会停止运行,容器自动终止。

使用 Dockerfile 定制镜像

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

在一个空白目录中,建立一个文本文件,并命名为 Dockerfile

$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile

Dockerfile文件:

FROM debian:jessie

RUN buildDeps='gcc libc6-dev make' \
    && apt-get update \
    && apt-get install -y $buildDeps \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
    && mkdir -p /usr/src/redis \
    && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
    && make -C /usr/src/redis \
    && make -C /usr/src/redis install \
    && rm -rf /var/lib/apt/lists/* \
    && rm redis.tar.gz \
    && rm -r /usr/src/redis \
    && apt-get purge -y --auto-remove $buildDeps

共享docker镜像

方法1 - 打成镜像.tar包,复制该.tar到其他主机

通过镜像创建并运行一个容器

我们运行一个centos镜像,TAG为7

[root@docker-86-106 ~]# docker run -it --name my-centos centos:7 /bin/bash

在容器中构建我们的应用软件

这里用一个构建python web程序为例

[root@7d3f82b5c6a5 /]# yum install python-setuptools
[root@7d3f82b5c6a5 /]# easy_install tornado

写一个hello world

[root@6f49802c677c /]# cat hello.py 
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

测试容器中进程使用没问题之后,我们就可以打包镜像了

将容器打包镜像

查看我们运行的容器

fanuxdeMacBook-Air:~ fanux$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
6f49802c677c        centos:7            "/bin/bash"         About an hour ago   Up About a minute                       my-centos

将my-centos容器发布成镜像,由于我们运行了一个hello world业务,且将镜像名称叫作hello-world:v1.0

fanuxdeMacBook-Air:~ fanux$ docker commit my-centos hello-world:v1.0
sha256:395d614063e13e6e1d0d2820f817995f385b443ef43b1f3f050ddebfb2ff6db4

再查看一下本机的镜像列表,可以看到多出来的hello-world镜像:

fanuxdeMacBook-Air:~ fanux$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         v1.0                395d614063e1        21 seconds ago      293.4 MB
ubuntu              my                  b2e21aa53afb        2 days ago          124.8 MB
centos              7                   970633036444        11 days ago         196.7 MB
ubuntu              latest              42118e3df429        2 weeks ago         124.8 MB
# 打包一个特定容器成一个image
$ docker commit my-centos hello-world:v1.0
# 将一个image打包成一个文件
$ sudo docker save -o demo.tar hello-world:v1.0
# 导入image到其他主机
$ sudo docker load < demo.tar
$ docker run -it --name -p 8888:8888 hello-world-container hello-world:v1.0 /bin/bash

方法2 - docker export/import

方法3 - 使用docker hub

docker image history <image>

  • Show the history of an image
$ docker history 9873176a8ff5
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
9873176a8ff5   3 weeks ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      3 weeks ago   /bin/sh -c #(nop) ADD file:920cf788d1ba88f76…   72.7MB

Refer to https://docs.docker.com/engine/reference/commandline/image_history/

Reference