Docker的基本概念
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是相当于类,容器是镜像运行时的实例对象。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看作一个代码控制中心,用来保存镜像。
Docker 容器是通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板(好比Java对象是由类创建的),比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker 仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,则默认标签是 latest 。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
常用命令
docker run
用于创建一个新的容器并运行一个命令,语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
-
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-
-d: 后台运行容器,并返回容器ID;
-
-i: 以交互模式运行容器,通常与 -t 同时使用;
-
-P: 随机端口映射,容器内部端口随机映射到主机的高端口;
-
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口;
-
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-
--name="nginx-lb": 为容器指定一个名称,不指定名称时,会随机生成一个名称;
-
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
-
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-
-h "mars": 指定容器的hostname;
-
-e username="werewolf": 设置环境变量;
-
--env-file=[]: 从指定文件读入环境变量;
-
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-
-m :设置容器使用内存最大值;
-
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
-
--link=[]: 添加链接到另一个容器;
-
--expose=[]: 开放一个端口或一组端口;
-
--volume , -v: 绑定一个卷,将宿主机的目录映射到容器的目录,格式为:宿主机目录:容器的目录
IMAGE说明:<仓库名>:<标签>,不指定标签时默认使用latest标签
示例
runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
各个参数解析:
-
docker: Docker 的二进制执行文件。
-
run: 与前面的 docker 组合来运行一个容器。
-
ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。其中15.10是镜像的版本号,未指定版本号时默认使用版本号是latest的镜像。
-
/bin/echo "Hello world": 在启动的容器里执行的命令。
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
其它示例:
# 后台模式启动一个容器,并将容器命名为mynginx,容器内监听的端口映射到宿主机随机的端口号
# -it 以交互模式启动一个容器
docker run -it --name mynginx -P -d nginx:latest
# 将容器的80端口映射到宿主机的8081端口,主机的/usr/data目录映射到容器内的/data目录
docker run -p 8081:80 -v /usr/data:/data -d nginx:latest
# 将容器的8080端口的tcp协议映射到宿主机127.0.0.1的80端口
docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
docker start/stop/restart
启动一个或多个已经被停止的容器,语法:
docker start [OPTIONS] CONTAINER [CONTAINER...]
停止一个运行中的容器,语法:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明:
-t, --time: 在停止容器之前等待停止的秒数(默认为10秒)
重启容器:
docker restart [OPTIONS] CONTAINER [CONTAINER...]
docker kill
杀掉一个运行中的容器:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明:
-s :向容器发送一个信号,默认指是KILL
docker rm
删除一个或多少容器,语法:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明:
-
-f :通过SIGKILL信号强制删除一个运行中的容器
-
-l :移除容器间的网络连接,而非容器本身
-
-v :-v 删除容器并删除与容器关联的卷
示例:
# 强制删除container1和container2
docker rm -f container1 container2
# 删除连接名为db的网络连接,不是删除容器
docker rm -l db
# 删除名为container1的容器,并删除与之关联的存储卷
docker rm -v container1
docker ps
runoob@runoob:~$ docker ps
CONTAINER ID IMAGE COMMAND ...
5917eac21c36 ubuntu:15.10 "/bin/sh -c 'while t…" ...
输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
- created(已创建)
- restarting(重启中)
- running(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。