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
- https://yeasy.gitbooks.io/docker_practice/image/build.html
- https://yeasy.gitbooks.io/docker_practice/image/dockerfile/copy.html
- https://docs.docker.com/config/containers/start-containers-automatically/