Docker简介和体系结构
- Docker Engine:Docker引擎,是一个C/S架构的应用程序,它包含了一系列的命令行工具,比如docker、dockerd、docker-compose、docker-machine、docker-swarm等。
- Docker Client:Docker客户端,是一个命令行工具,用来发送命令给Docker引擎,比如docker run、docker pull、docker build等。
- Docker Daemon:Docker守护进程,是一个后台进程,用来接收并处理来自Docker客户端的请求,然后将结果返回给Docker客户端。
- Docker Compose:Docker组合,是一个命令行工具,用来定义和运行由多个容器组成的应用程序。
- Docker swarm:是管饭提供的一个容器编排和集群管理工具,用来管理多个Docker主机,通过Swarm可以将多个Docker主机抽象为一个Docker主机,实现负载均衡和容器高可用等功能。
Docker的几个重要概念
- Docker镜像(Image):镜像是一个只读的模板,可以用来创建容器;
- Docker容器(Container):容器是镜像的运行实例,它是一个独立的环境,可以在这个环境中运行应用程序,一个镜像可以创建多个容器;
- Docker仓库(Repository):Docker仓库是用来存储Docker镜像的地方,比如DockerHub,我们可以在这里下载各种镜像,也可以将自己的镜像上传到这里。
镜像相关
检索镜像
1 | docker search [image] |
拉取镜像
1 | docker pull [image] |
上传镜像
1 | docker push [image] |
列出镜像
1 | docker images |
从Dockerfile构建镜像
1 | docker build -t [image]:[tag] [PATH] |
导出镜像
1 | docker save [image] -o FILE |
从文件导入镜像
1 | docker load -i FILE |
查看镜像历史
1 | docker history [image] |
删除镜像
1 | docker rmi [image] |
删除不再使用的镜像(dangling images)
1 | docker image prune |
将文件系统导入为镜像
1 | docker import [URL/FILE] |
从容器创建镜像
1 | docker commit [container] [image] |
容器管理
创建容器(仅创建,不运行)
1 | docker create [image] |
创建并运行容器
1 | docker run [image] |
启动容器
1 | docker start [container] |
停止容器
1 | docker stop [container] |
重启容器
1 | docker restart [container] |
列出正在运行的容器
1 | docker ps |
列出所有容器
1 | docker ps -a |
进入容器
1 | # 以交互模式进入容器 |
导出容器
1 | docker export [container] -o FILE |
导入容器快照
1 | docker import FILE |
查看容器日志
1 | docker logs [container] |
删除容器
1 | docker rm [container] |
查看容器端口映射
1 | docker port [container] |
显示容器内进程
1 | docker top [container] |
复制本地文件到容器内的指定路径
1 | docker cp [FILE] [container]:[PATH] |
显示容器内的变化
1 | docker diff [container] |
显示容器资源使用情况
1 | docker stats [container] |
容器运行
docker run
命令的各种参数
1 | docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
以下是一些常用的docker run
命令示例:
创建,运行,并命名一个容器
1 | docker run --name [name] [image] |
创建一个容器并后台运行
1 | docker run -d [image] |
创建一个容器并指定端口映射
1 | docker run -p [hostPort]:[containerPort] [image] |
创建一个容器并指定端口映射(随机分配)
1 | docker run -P [image] |
创建一个容器并指定环境变量
1 | docker run -e [key=value] [image] |
创建一个容器并指定工作目录
1 | docker run -w [PATH] [image] |
创建一个容器并指定容器名称
1 | docker run --name [name] [image] |
创建一个容器并在容器中执行命令
1 | docker run [image] [COMMAND] |
创建一个容器并在容器中执行命令(交互模式)
1 | docker run -it [image] [COMMAND] |
创建一个容器并在容器中执行命令(交互模式,终端)
1 | docker run -it [image] [COMMAND] /bin/bash |
创建一个容器并在容器中执行命令(交互模式,终端,退出后删除容器)
1 | docker run -it --rm [image] [COMMAND] /bin/bash |
创建一个容器并指定容器名称,后台运行,端口映射,环境变量,工作目录
1 | docker run -d -p [hostPort]:[containerPort] -e [key=value] -w [PATH] --name [name] [image] |
网络管理
Docker默认会创建三个网络,分别是bridge、host、none。
网络模式:
- bridge:桥接网络,Docker默认使用的网络模式,使用docker run命令创建容器时如果不指定网络模式,那么就会使用bridge模式。
- host:主机网络,使用宿主机的网络,容器将不会获得一个独立的网络命名空间,配置和宿主机共享,容器将不会隔离宿主机网络,使用宿主机的IP和端口。
- none:无网络、禁用网络,容器拥有自己的网络命名空间,但是并不为容器进行任何网络配置,这个网络模式的容器只适合于只进行数据处理,没有任何网络的应用场景。
- container:容器网络,使用其他容器的网络,指定使用其他容器的网络栈。
- overlay:跨主机网络,用于跨多个Docker守护进程的容器通信,Docker 1.9版本中增加的功能。
- macvlan:通过MAC地址绑定来实现容器访问外部网络,Docker 1.12版本中增加的功能。
- ipvlan:通过IP地址绑定来实现容器访问外部网络,Docker 1.12版本中增加的功能。
列出可用网络
1 | docker network ls |
查看网络详细信息
1 | docker network inspect [network] |
创建一个新的网络
1 | docker network create [network] |
删除一个网络
1 | docker network rm [network] |
将容器连接到网络
1 | docker network connect [network] [container] |
将容器从网络断开
1 | docker network disconnect [network] [container] |
数据管理
数据卷
数据卷(Data Volumes)是一个可供一个或多个容器使用的特殊目录,它绕过了UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
- 数据卷会一直存在,直到没有容器使用
Docker Volume本质上是容器与主机之间共享的目录或者文件,这样Docker Volume中的数据可以在主机和容器中实时同步。
创建一个数据卷
1 | docker volume create [volume] |
查看数据卷
1 | docker volume ls |
查看数据卷详细信息
1 | docker volume inspect [volume] |
删除数据卷
1 | docker volume rm [volume] |
删除所有未使用的数据卷
1 | docker volume prune |
日常操作
查看Docker系统信息
1 | docker info |
查看Docker版本
1 | docker version |
查看Docker帮助
1 | docker --help |
查看Docker命令帮助
1 | docker [COMMAND] --help |
登录Docker Hub
1 | docker login |
登出Docker Hub
1 | docker logout |
移除所有未被使用的容器、镜像、数据卷和网络
1 | docker system prune |
插件管理
插件是Docker 1.13版本中引入的功能,它可以扩展Docker的核心功能,比如网络、存储、日志等。
安装插件
1 | docker plugin install [plugin] |
启用插件
1 | docker plugin enable [plugin] |
禁用插件
1 | docker plugin disable [plugin] |
列出插件
1 | docker plugin ls |
查看插件详细信息
1 | docker plugin inspect [plugin] |
卸载插件
1 | docker plugin disable [plugin] |
Dockerfile
Dockerfile是一个文本文件,用于自动化构建镜像,Dockerfile中包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
Dockerfile中的指令不区分大小写,但是为了可读性,建议使用大写。
Dockerfile中的指令按照从上到下的顺序执行。
Dockerfile指令
- FROM:指定基础镜像,必须为Dockerfile文件的第一条指令;
1
FROM [base_image]
- MAINTAINER:指定镜像的作者和联系方式;
- ADD:用于将文件拷贝到镜像中,源可以是URL或者本地文件,也可以是一个压缩文件(自动解压);
- COPY:用于将文件拷贝到镜像中,源只能是本地文件;
1
COPY src /app/src
- WORKDIR:用于指定工作目录,可以使用多个WORKDIR指令,如果使用相对路径,则是相对于上一条WORKDIR指令所指定的目录;
1
WORKDIR /app
- ENV:用于设置环境变量;
- RUN:用于执行命令行命令,比如安装软件包;
1
RUN apt-get install -y nginx
- EXPOSE:暴露端口,指定容器运行时监听的端口,但是这个端口只能在容器内部访问,外部无法访问;
1
EXPOSE 80
- CMD:用于指定默认的容器主进程,每个Dockerfile中只能有一条CMD指令,如果有多条,则只有最后一条会生效;
1
CMD ["node", "/app/index.js"]
- ENTRYPOINT:用于指定默认的容器主进程,每个Dockerfile中只能有一条ENTRYPOINT指令,如果有多条,则只有最后一条会生效;
- VOLUME:用于指定持久化目录,Docker容器中的数据不会保存在镜像中,当容器删除时,数据也会随之删除;
- USER:用于指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT指令都会使用该用户;
- HEALTHCHECK:用于指定检查容器健康状况的命令,如果检查结果不是0,则认为容器不健康,从而终止容器运行;
- ONBUILD:用于指定当构建一个被继承的Dockerfile时需要运行的命令,父镜像在被子继承后,父镜像中的ONBUILD指令会被执行;
- LABEL:用于为镜像添加元数据,可以使用多个LABEL指令。
- STOPSIGNAL:用于指定停止容器时发送的系统调用信号;
- SHELL:用于指定默认的SHELL类型,可以使用多个SHELL指令。
- ARG:用于指定构建参数,构建参数可以在构建时使用–build-arg
= 来指定。 - EXPORT:用于导出镜像,这个指令已经被废弃,不建议使用。
Dockerfile编写完成后,就可以使用docker build
命令来构建镜像了。
1 | docker build -t [image]:[tag] [PATH] |
Docker Compose
Docker Compose是由Docker官方开源的项目,用于定义和运行多个Docker容器应用程序的工具。(Defining and running multi-container Docker applications)比如我们如果想要搭建一个网站的话,可能会用到前端、后端、数据库、甚至缓存和负载均衡等多个服务,这些服务都是独立的,但是它们之间又是有关联的,需要相互配合工作,比如后端需要连接数据库,前端需要连接后端,这些服务之间的关联关系就是Compose要解决的问题。它通过一个单独的docker-compose.yml配置文件来将这一组相互管理的容器组合在一起。
Docker Compose安装
从Docker 1.13版本开始,Docker Compose已经被集成到了Docker Engine中,因此我们只需要安装Docker就可以了。
Docker Compose YAML文件
Docker Compose使用一个命名为docker-compose.yml
的YAML文件来配置应用程序的服务,YAML文件中包含了应用程序的配置信息,比如服务、网络、卷等。
启动一个应用程序时,只需要运行docker-compose up
命令,Docker Compose就会自动去查找当前目录下的docker-compose.yml
文件,并根据这个文件来启动应用程序的所有服务。
当你不再需要这个应用程序时,只需要运行docker-compose down
命令,Docker Compose就会停止并删除所有容器、网络、卷等。
Docker Swarm
Docker Swarm是Docker官方的容器集群管理工具,用于管理多个Docker主机,还可以用来实现容器编排、服务发现、负载均衡和容器高可用、可视化等功能。
官方文档:https://docs.docker.com/swarm/
Docker Swarm安装
Docker Swarm从Docker 1.12版本开始已经集成到了Docker Engine中,因此我们只需要安装Docker就可以了。
Kubernetes
Kubernetes是Google开源的容器集群管理工具,用于管理多个Docker主机,还可以用来实现容器编排、服务发现、负载均衡和容器高可用等功能。
官方文档:https://kubernetes.io/