Docker相关学习笔记

记录一下初略学习如何使用Docker的过程,没有很深入的去学习了解,至少先学会使用它吧~ (:з」∠)

Docker是什么

Docker解决的是环境配置的难题,虚拟机(virtual machine)是带环境安装的一种解决方案,Docker和虚拟机的区别是,虚拟机是携带操作系统,Docker是不携带操作系统的,本身很小的应用程序因为携带了操作系统而变得非常大,很笨重,所以Docker不携带操作系统的应用就非常的轻巧。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

Docker安装

安装完成后,运行下面的命令,验证是否安装成功。

 $ docker version
 # 或者
 $ docker info

Docker三个基本概念

  • Docker 镜像(Image)

    Docker 把应用程序及其依赖,打包在 image 文件里面。

    Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。

  • Docker 容器(Container)

    Docker 根据 image 文件生成容器的实例。

    镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。

  • Docker 仓库(Registry)

    镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

    一个 Docker Registry 中可以包含多个仓库Repository);每个仓库可以包含多个标签Tag);每个标签对应一个镜像。

Docker 常用命令

# 列出本机的所有 image 文件。
$ docker image ls

# 删除 image 文件
$ docker image rm [imageName]

# 列出本机正在运行的容器
$ docker container ls
# 或者
$ $ docker ps

# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all

# 删除容器
$ docker container rm [containerID]

# 新建并启动容器
$ docker container run

# 启动已经生成、已经停止运行的容器
$ docker container start [containerID]

# 终止容器运行
$ docker container kill
# 或者
$ docker container stop [containerID]

实例:制作 Docker 容器

首先要了解一下Dockerfile 文件,它是一个文本文件,用来配置 image。Docker 根据该文件生成二进制的 image 文件。

编写 Dockerfile 文件

在项目的根目录下,新建一个文本文件.dockerignore,写入下面的内容

.git
node_modules
npm-debug.log

上面代码表示,这三个路径要排除,不要打包进入 image 文件。如果没有路径要排除,这个文件可以不新建。

然后,在项目的根目录下,新建一个文本文件 Dockerfile,写入下面的内容

FROM node:8.4
COPY . /app
WORKDIR /app
RUN ["npm", "install"]
EXPOSE 3000/tcp
CMD npm start

上面代码一共六行,含义如下。

  • FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。
  • COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
  • WORKDIR /app:指定接下来的工作路径为/app
  • RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
  • EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。
  • 表示容器启动后自动执行 npm start

RUN命令与CMD命令的区别是RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。

注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。

创建 image 文件

有了 Dockerfile 文件以后,就可以使用docker image build命令创建 image 文件了。

$ docker image build -t apiserver .
# 或者
$ docker image build -t apiserver:0.0.1 .

上面代码中,-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。

如果运行成功,就可以看到新生成的 image 文件apiserver了,通过下列命令查看

$ docker image ls

生成容器

使用以下命令生成容器

$ docker container run --rm -p 8000:3000 -it apiserver:0.0.1

上面命令的各个参数含义如下:

  • --rm 参数:在容器终止运行后自动删除容器文件。
  • -p参数:容器的 3000 端口映射到本机的 8000 端口。
  • -it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
  • apiserver:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。

启动容器

前面的docker container run命令是新建容器,每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。如果希望重复使用容器,就要使用docker container start命令,它用来启动已经生成、已经停止运行的容器文件。

 $ docker container start [containerID]

停止容器

docker container kill命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。而docker container stop命令也是用来终止容器运行,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。

# 在本机的另一个终端窗口,查出容器的 ID
$ docker container ls

# 停止指定的容器运行
$ docker container kill [containerID]
# 或者
$ bash container stop [containerID]

这两个信号的差别是,应用程序收到 SIGTERM 信号以后,可以自行进行收尾清理工作,但也可以不理会这个信号。如果收到 SIGKILL 信号,就会强行立即终止,那些正在进行中的操作会全部丢失。

ps: 启动nginx神句

docker run --rm -it -v "$(pwd)":/usr/share/nginx/html -p 8081:80 nginx

参考学习资料

阮一峰 Docker 入门教程

wuming Docker入门,看这篇就够了

yeasy Docker——从入门到实践