记录一下初略学习如何使用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——从入门到实践