Docker 理念:一次构建,到处运行
Docker 核心概念:
- 镜像:类似于虚拟机的镜像,可以理解为只读的模板,包含了文件系统。一个镜像可以创建多个容器(镜像和容器类似于 Java 中 Class 类和其实例对象)。
- 容器:容器是从镜像创建的实例,可以将其启动、开始、停止、删除。容器都是相互隔离、互不可见的(Docker 容器是基于 Linux Containers,简称 LXC)。
- 仓库:集中存放镜像文件的地方。如 maven 的中央仓库集中存放 jar 包,GitHub 集中存放代码。Docker 官方提供的仓库叫 DockerHub,当然也有第三方仓库。
Docker 工作模式:
- Docker 是一个 Client-Server 结构的系统。Docker 守护进程运行在主机上, 客户端通过 Socket 连接访问,守护进程从客户端接受命令并管理运行在主机上的容器。
- Docker 不需要 Hypervisor 实现硬件资源虚拟化,直接使用实际物理机的硬件资源。
- Docker 利用的是宿主机的内核,不需要 Guest OS(即不需要重新加载一个操作系统内核)。
一、帮助命令
# 版本 docker version # 信息 docker info # 帮助 docker --help
二、镜像命令
# 查看本地镜像 docker images # 常用参数 # -a:列出本地所有的镜像(含中间映像层) # -q:只显示镜像ID。 # --digests:显示镜像的摘要信息 # --no-trunc:显示完整的镜像信息
# 搜索仓库镜像 docker search xxxxxx # 常用参数 # --no-trunc:显示完整的镜像描述 # --filter=stars=100:列出收藏数不小于指定值的镜像 # --filter=is-automated=true:只列出 automated build 类型的镜像 # --filter=is-official=true:显示官方镜像
这里可以看到镜像的详细信息和历史版本:https://hub.docker.com/
# 下载 mysql 镜像最新版 docker pull mysql docker pull mysql:latest # 下载 mysql 镜像 5.7.27 版 docker pull mysql:5.7.27 # 删除 mysql 镜像最新版 docker rmi mysql docker rmi mysql:latest # 删除 mysql 镜像 5.7.27 版 docker rmi mysql:5.7.27 # 强制删除 docker rmi -f 镜像ID # 删除多个 docker rmi -f mysql:latest mysql:5.7.27 # 删除全部 docker rmi -f $(docker images -qa)
三、容器命令
# 下载一个最新的 centos 镜像 docker pull centos # 新建并启动容器,格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...] docker run --name="test" -it centos /bin/bash # 常用 OPTIONS:有些是一个减号,有些是两个减号 # --name="xxx":为容器指定一个名称; # -d:后台运行容器,并返回容器 ID,即启动守护式容器; # -i:以交互模式运行容器,通常与 -t 同时使用; # -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用; # -P:(大写)随机端口映射; # -p:(小写)指定端口映射,有四种格式: # ip:hostPort:containerPort # ip::containerPort # hostPort:containerPort # containerPort
可以看到 shell 已经进入到容器内
关于 -d 参数:
Docker 容器后台运行,就必须有一个前台进程。
容器运行的命令如果不是那些一直挂起的命令(比如运行 top,tail),就会自动退出。
例如 docker run -d centos,然后使用 docker ps -a 进行查看, 会发现容器已经退出。
# 容器停止退出
exit
# 容器不停止退出
ctrl + P + Q
# 查看容器 docker ps # 常用参数 # -a:列出当前所有正在运行的容器 + 历史上运行过的。 # -l:显示最近创建的容器。 # -n:显示最近n个创建的容器。 # -q:静默模式,只显示容器编号。 # --no-trunc:不截断输出。
管理容器
# 启动容器 docker start 容器ID或容器名 # 重启容器 docker restart 容器ID或容器名 # 停止容器 docker stop 容器lD或容器名 # 强制停止容器 docker kill 容器ID或容器名 # 删除已停止的容器 docker rm 容器ID # 删除多个容器 docker rm -f $(docker ps -a -q) docker ps -a -q l xargs docker rm
查看容器日志
# 新建容器并运行 docker run -d centos /bin/sh -c "while true;do echo hello zzyy;sleep 2;done" # 查看最后十条日志 docker logs -f -t --tail 10 容器ID # -t:是加入时间戳 # -f:跟随最新的日志打印 # --tail 数字:显示最后多少条
其它命令
# 查看容器内运行的进程 docker top 容器ID # 查看容器详情信息 docker inspect 容器ID # 容器开机自启动 docker update --restart=always 容器ID # 修改容器名字 docker rename 容器ID 新名称 # 进入正在运行的容器并以命令行交互 docker exec -it 容器ID /bin/bash docker attach 容器ID # attach:直接进入容器启动命令的终端,不会启动新的进程 # exec:是在容器中打开新的终端,并且可以启动新的进程 # 从容器内拷贝文件到主机上,格式:docker cp 容器ID:容器内路径 目的主机路径 docker cp 960f553ed428:/tmp/abc.txt tmp/def.txt
https://docs.docker.com/engine/reference/commandline/docker/