Docker
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
Docker容器与虚拟机的区别
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。
而容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱 |
系统支持量 | 单机支持上千个容器 | 一般是几十个 |
Docker的用途
- 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境
- 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
- 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
Docker的基本概念
Image(镜像)
Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。Docker把应用程序及其依赖打包在images文件里面,通过这个文件进行docker容器的生成。
Container(容器)
image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。可以把镜像看成是一个类,而容器就是一个实例。
Repository(仓库)
Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行。
但是, 如果需要在其他服务器上使用这个镜像,就需要一个集中的存储、分发镜像的服务,Docker Registry(仓库注册服务器)就是这样的服务。
一个 Docker Registry 中可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应着一个镜像。
Docker的使用
创建镜像
- 从无到有开始创建镜像
- 下载并使用别人创建好的现成的镜像
- 在现有镜像上创建新的镜像
查看所有镜像:
docker images
删除镜像
docker rmi imageName/image Id
从Docker hub中获取已有的镜像
例如:从Docker Hub中下载最新版本的node
docker pull node:latest
也可以下载指定版本,把latest改成对应版本号就可以了
下载后就可以使用了,例如创建一个容器,运行node命令
docker run -it node:latest node
参数说明:
-i
:交互式操作
-t
:终端
node:latest
使用最新版本的node镜像来运行容器
node
放在镜像后边的是命令,希望有个交互式的node
Dockerfile文件创建镜像
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
FROM node
MAINTAINER leopord
ADD ./package.json /home/leo/package.json
ADD ./index.js /home/leo/index.js
RUN mkdir -p /home/leo
WORKDIR /home/leo
RUN npm set registry https://registry.npm.taobao.org/
RUN npm install
EXPOSE 3002
CMD ["node","index.js"]
Dockerfile基本的语法:
- 使用#来注释
- FROM 指令告诉Docker使用哪个镜像作为基础
- MAINTAINER 维护者的信息
- ADD 复制指令,从上下文目录中复制文件或者目录到容器里指定路径
- RUN 用于执行后边跟着的命令
- WORKDIR 指定工作目录,用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
- EXPOSE 声明端口
- CMD 类似RUN命令,用于运行程序,二者运行的时间点不同,CMD是在docker run时执行,RUN是在docker build执行。
使用docker build
创建image文件
进入根目录
docker build -t imageName .
imageName为创建的镜像名
.
最后面还有个点,用于指定上下文路径
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
修改已有镜像
使用docker commit
命令提交修改
docker commit -m 'update message' -a "user leo" 8a0ba440f776 node:latest
其中, -m 来指定提交的说明信息,跟我们使用的版本控制工具一样; -a 可以指定更新的用户信息;
之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像
的 ID 信息
启动容器
docker run -it --name ContainerName node:latest node
containerName 可定义容器名
命令:
查看所有的容器
docker ps -a
查看所有启动的容器:
docker ps
重启一个停止的容器
docker restart containerName/container Id
停止容器
docker stop containerName/container Id
在启动容器时后台运行,添加-d
如
docker run -it -d --name node_container node:latest node
删除容器
如果容器在运行中,需要先停止在删除,或者添加-f
强制停止
docker rm containerName/container Id
docker rm -f containerName/container Id
添加端口映射
-P
大写P表示随机映射,-p
小写p需要设置本机端口映射容器的端口 -p ip port: container port
docker run -it -d --name node_container -p 12317:3002 node:latest node
docker run -it -d --name node_container -P node:latest node
通过 docker port containerName/ container Id
可以查看端口映射。
进入容器
在使用 -d
参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
-
docker attach
-
docker exec:推荐使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
查看容器日志
docker logs containerName / container Id