docker 是为了统一环境、配置、依赖问题而诞生的方案。
历史背景
为了统一环境、配置、依赖问题,曾经出现过虚拟机方案,但虚拟机方案有以下问题:
- 资源占用多
- 操作步骤复杂
- 需要完整地运行一个操作系统
- 启动慢
在虚拟机方案上再做升级之后,出现这样 linux 容器的概念,一种虚拟化技术,对进程进行隔离。
docker就是 linux 容器的封装,提供操作 linux 容器的接口,还将容器状态以版本(镜像)的方式管理。
认识 docker
docker 是服务端/客户端架构,通常服务端是一个服务进程,与客户端运行在同一主机上,可使用如下命令查看 docker 服务进程是否运行:
docker version
这个命令当然也可以查看版本,docker 的版本信息,如果无法查看版本,则说明服务进程没有运行。
docker 用途
- 一次性环境
- 弹性云服务
- 微服务架构
镜像与容器
镜像(image)是指只读层的重叠,就像代码版本一样,可以被复制、分享,它是「环境的版本」,将应用程序和依赖打包在一起;
容器实例(container)是指一堆层的统一视角,与镜像的区别在于最上面的「可读写层」,可对容器进行更改写入,生成新的镜像,而一个镜像,也可以生成一个新的运行时容器。
另外,镜像和容器本质上都是文件,如果关闭容器,只是停止容器运行,文件仍然存在,仍然占据空间。
镜像市场
hub.docker.com
docker 专门设立的镜像市场,可以直接从镜像市场上得到你想要的镜像。
但是官方镜像市场是外国服务器,中国访问非常缓慢,国内也有镜像市场,是对官方镜像市场的拷贝。
常用命令
- docker search name
从市场搜索镜像 - docker pull library/image
下载镜像,如果是 docker 的官方镜像,则可省略 library - docker run image [command]
根据 image 运行一个容器实例, command 指运行该容器实例后,在容器内运行的命令
此命令有如下注意点:- 如果本地没有该 image ,会自动从镜像市场下载;
- 该命令运行结束后,会自动停止该容器,但对容器做的改动,不会丢失;
- 有些需要运行服务的容器,不会自动停止,比如ubuntu、nginx、apache等
- 如果在 docker run 后面加上 –it ,则可将当前 cli 窗口映射到容器的 cli 窗口,可实现与容器交互,如 docker run –it ubuntu bash
- docker ps
获得容器列表 - docker commit id name
根据当前容器生成一个镜像, id 为 container id - docker inspect name
查看容器信息 - docker push library/name
发布镜像到市场 - docker image ls
列出镜像列表 - docker image rm name
删除镜像 - docker kill containerID
终止运行中的容器 - docker container ls
列出所有容器,同docker ps - docker container ls –all
列出停止的容器 - docekr container rm containerID
删除容器文件 - docker container start ID
启动已停止的容器 - docker container stop ID
停止容器,与 kill 比起来,会先收尾,再关闭,而 kill 则直接关闭 - docker container logs ID
查看该容器的命令行输出,如 run 时没加 –it - docker container exec –it ID bash
进入容器 shell - docker container cp ID:/path/file
将容器内的文件拷贝到本机 - docker run –d
「–d」指容器启动成功后,在后台运行
创建 image
新建 .dockerignore
此文件排除不需要打包进 image 的路径及文件,类似于 .gitignore 。
.git
vendor
新建 Dockerfile
FROM node:8.4 // 代表此镜像继承于官方的 node 8.4 镜像
COPY . /app // 将当前 . 目录的内容拷贝进容器的 /app 目录,除 .dockerignore 指定的以外
WORKDIR /app // 指定接下来的工作目录在 /app 下
RUN npm install // 在 /app 下执行 npm install 命令,安装好的依赖也会被打包进镜像中
EXPOSE 3000 // 开放 3000 端口允许外部连接
CMD node demo/1.js // 在该此镜像被生成容器运行后,自动执行此命令
Dockerfile 是一个文本文件,用于配置 image ,docker 根据此文件生成 image 文件
生成镜像
docker image build -t name:version
version 不指定时默认为 latest
运行容器
docker container run –p 8000:3000 –it bash
以该 image 生成容器实例并运行,并将本机的 8000 端口映射到容器的 3000 端口
CMD 与 RUN 的区别:
- RUN 可以有多个, CMD 只能有一个
- RUN 的执行结果会被打包进 image ,也就是在打包之前执行;CMD 则在 image 创建成功,且被生成容器运行后,才会在容器中执行
- 有 CMD 之后,docker run 的时候就不能加入 –it 和 bash了,否则会CMD 不会再执行
发布 image 到市场
在 hub.docker.com 注册账号后,执行以下命令:
docker login
docker image tag imagename username/library:version
docker image push library/name:version
docker 编排工具
docker compose 是多个 docker 容器组成一个应用的关联工具,docker-compose.yml 中写好多个容器之间的联系
网友评论