Docker笔记
Docker概括
Docker简介
(1)Docker是一个开源的应用容器引擎,解决了依赖兼容问题、解决了操作系统环境差异
(2)分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署,环境不一定一致,会遇到各种问题
Docker和虚拟机的区别
| 对比 | Docker容器 | 虚拟机(VM) |
|---|---|---|
| 操作系统 | 与宿主机共享OS,系统的进程 | 宿主机OS上运行虚拟机OS,操作系统中的操作系统 |
| 存储大小 | 镜像小,便于存储与传输 | 镜像庞大(vmdk、vdi等) |
| 运行性能 | 几乎无额外性能损失 | 操作系统额外的CPU、内存消耗 |
| 移植性 | 轻便、灵活、适应于linux | 笨重、与虚拟化技术耦合度高 |
| 硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
| 部署速度 | 快速,秒级 | 较慢,10S以上 |
| 系统支持 | 单机支持上千个容器 | 一般几十个 |
Docker架构
| 概念 | 说明 |
|---|---|
| Docker 镜像(Images) | 容器镜像是轻量级的、可执行的独立软件包,包含软件运行所需要的所有内容(代码、运行时环境、系统工具、系统库和设置) 相当于是一个root文件系统,用于创建 Docker 容器的只读模板,一个镜像可以创建很多容器 |
| Docker 容器(Container) | 容器是独立运行的一个或一组应用,镜像中的应用程序,运行后形成的进程就是容器,是镜像运行时的实体可以把容器看做是一个简易版的 Linux 环境(root用户权限、进程空间、网络空间等)和运行在其中的应用程序 Docker会给容器进程做隔离,对外不可见,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等 |
| Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK 与 Docker 的守护进程通信。 |
| Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
| Docker 仓库(Registry) | Docker镜像的托管平台,用来保存镜像,类似于Maven仓库仓库分为公开仓库(Public)和私有仓库(Private)两种形式 最大的公开仓库是 Docker Hub(https://hub.docker.com/) 国内也有类似于DockerHub 的公开服务,如网易云镜像服务、阿里云镜像库等。 |
| Docker 命令行工具(Machine) | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行,即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
Docker安装与使用
准备工作
(1)Docker 分为 CE 和 EE 两大版本,Docker 必须部署在linux内核的系统上
| 版本 | 区别 |
|---|---|
| CE | 社区版,免费,支持周期 7 个月,分为 stable test 和 nightly 三个更新频道 |
| EE | 企业版,强调安全,付费使用,支持周期 24 个月 |
(2)CentOS 仅发行版本中的内核支持 Docker,Docker 运行在CentOS 7 (64-bit)上,要求系统为64位、Linux系统内核版本为 3.8以上,使用如下命令查看自己的内核,打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)
1 | # 查看自己的内核 |
Docker卸载(可选)
1 | yum remove docker \ |
Docker CE安装
1 | #(1)安装yum工具,yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 |
配置阿里云镜像加速器
(1)默认情况下,将从docker hub上下载docker镜像,由于太慢所以一般都会配置镜像加速器
(2)进入阿里云官网,注册账号或使用淘宝账号登录
(3)点击镜像服务

(4)查看操作文档

(5)复制到linux运行
1 | sudo mkdir -p /etc/docker |

(6)查看是否成功
1 | cat /etc/docker/daemon.json |

Docker常用命令
服务相关命令
| 命令 | 作用 |
|---|---|
| systemctl start docker | 启动Docker服务 |
| systemctl stop docker | 停止Docker服务 |
| systemctl restart docker | 重启Docker服务 |
| systemctl status docker | 查看Docker服务状态 |
| systemctl enable docker | 开启自启动Docker服务 |
镜像相关命令
| 命令 | 作用 |
|---|---|
| docker images [-q/-a] | 查看镜像 参数-a:列出本地所有的镜像(含历史映像层) 参数-q:只显示镜像ID |
| docker search [–limit N] 镜像名称 | 搜索镜像,从网络中查找需要的镜像 参数–limit N:只列出N个镜像,默认25个 |
| docker pull 镜像名称:版本号 | 拉取镜像,从Docker 仓库下载镜像到本地,不指定版本号则是最新版本 如果不知道镜像版本,可以去https://hub.docker.com/搜索对应镜像查看 |
| docker save 镜像名 > xxx.tar | 导出镜像,将镜像导出到磁盘为tar包 |
| docker load -i xxx.tar | 加载镜像,从一个存储文件或一个标准输入流中加载一个镜像 |
| docker rmi 镜像id或镜像名称:版本号 [-f/-q] | 删除镜像,删除本地镜像 参数-f:删除多个镜像 参数-q:删除所有本地镜像 |
容器相关命令
| 命令 | 作用 |
|---|---|
| docker ps [-a] | 查看正在运行的容器 参数-a:列出当前所有正在运行的容器+历史上运行过的 参数-l:显示最近创建的容器 参数-n:显示最近n个创建的容器 参数-q:静默模式,只显示容器编号 |
| docker run [参数] 镜像名或id:版本号 /bin/bash | 创建容器,有镜像才能创建容器 参数-i:以交互模式运行容器,通常与-t同时使用 参数-t:为容器重新分配一个伪输入终端,通常与-i同时使用 参数-d:创建一个容器以守护模式运行容器(后台运行) 参数-v:本地工作目录:docker工作目录 参数-P:随机端口映射,大写P 参数-p:指定端口映射,小写p 参数-it:创建交互式容器,退出容器后,容器自动关闭 参数-id:创建守护式容器,退出容器后,容器不会关闭 参数–net:网桥名字 参数–ip:分配各容器的IP 参数–name:为创建的容器命名 参数–restart:重启的策略,在容器退出时总是重启容器 参数–runtime=nvidia:使用显卡就添加,不用可以不添加 |
| docker exec -it 容器名称或id /bin/bash | 进入容器(退出容器中的,容器不会关闭) |
| docker stop 容器名称或id | 停止容器 |
| docker kill 容器ID或容器名 | 强制停止容器 |
| docker start 容器名称或id | 启动容器 |
| docker rm 容器名称或id | 删除已经停止的容器,容器运行状态会删除失败,需要停止容器才能删除 |
| docker inspect 容器名称或id | 查看容器信息 |
| docker cp 容器ID:容器内路径 目的主机路径 | 从容器内拷贝文件到主机上 |
| cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 | 从tar包中的内容创建一个新的文件系统再导入为镜像 |
| docker export 容器ID > 文件名.tar | 导出容器的内容留作为一个tar归档文件 |
| exit | 退出容器,容器停止 |
| ctrl+p+q | 退出容器,容器不停止 |
端口映射
容器内的网络服务和外部机器不能直接通信,但是外部机器和宿主机可以直接通信,宿主机和容器可以直接通信,当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上,外部机器访问宿主机的端口,从而间接访问容器的服务,这种操作称为端口映射,端口映射通过-p参数设置

Docker常见应用部署
MySQL部署
(1)搜索、下载镜像
1 | #(1)搜索MySQL镜像 |
(2)创建容器,设置端口映射、目录映射
1 | docker run -id \ |
| 参数 | 简介 |
|---|---|
| -p 3307:3306 | 宿主机端口:容器端口,将宿主机的3307端口与容器的3306端口映射,实际开发要映射3306端口 |
| $PWD | 表示执行了pwd获取到了当前路径 |
| –v $PWD/conf:/etc/mysql/conf.d | 将主机当前目录下的conf/my.cnf挂载到容器/etc/mysql/my.cnf配置目录 |
| -v $PWD/logs:/logs | 将主机当前目录下的logs目录挂载到容器的/logs目录日志 |
| -v $PWD/data:/var/lib/mysql | 将主机当前目录下的data目录挂载到容器的/var/lib/mysql数据目录 |
| -e MYSQL_ROOT_PASSWORD=123456 | 初始化root 用户密码 |
(3)进入容器登录MySQL
1 | # 进入容器 |
Tomcat部署
(1)搜索、下载镜像
1 | #(1)搜索Tomcat镜像 |
(2)创建容器,设置端口映射、目录映射
1 | docker run -id \ |
| 参数 | 简介 |
|---|---|
| -p 8080:8080 | 宿主机端口:容器端口,将宿主机的8080端口与容器的8080端口映射 |
| $PWD | 表示执行了pwd获取到了当前路径 |
| -v $PWD:/usr/local/tomcat/webapps | 将主机中当前目录挂载到容器的webapps |
(3)创建dist目录,目录下创建index.html
1 | [root@linux tomcat]# mkdir dist |
(4)使用外部机器访问tomcat:http://192.168.10.100:8080/dist/index.html
Nginx部署
(1)搜索、下载镜像
1 | #(1)搜索Tomcat镜像 |
1 | user nginx; |
(2)回到nginx目录,创建容器,设置端口映射、目录映射
1 | docker run -id \ |
| 参数 | 简介 |
|---|---|
| -p 80:80 | 宿主机端口:容器端口,将宿主机的80端口与容器的80端口映射 |
| $PWD | 表示执行了pwd获取到了当前路径 |
| -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf | 将主机当前目录下的/conf/nginx.conf挂载到容器的:/etc/nginx/nginx.conf配置目录 |
| -v $PWD/html:/usr/share/nginx/html | 将主机当前目录挂载到容器的/val/log/nginx日志目录 |
(3)进入html目录,创建index.html
1 | [root@linux nginx]# cd html/ |
(4)使用外部机器访问nginx:http://192.168.10.100:80/index.html
Redis部署
(1)搜索、下载镜像
1 | #(1)搜索Tomcat镜像 |
(2)创建容器,设置端口映射、目录映射
1 | docker run -id \ |
| 参数 | 简介 |
|---|---|
| -p 6379:6379 | 宿主机端口:容器端口,将宿主机的6379端口与容器的6379端口映射 |
| $PWD | 表示执行了pwd获取到了当前路径 |
(3)使用外部机器连接redis
Dockerfile镜像脚本化
Dockerfile简介
Dockerfile 是用来构建Docker镜像的文本文件,包含了一条条构建镜像所需的指令(Instruction),每一条指令构建一层Layer,基于基础镜像,最终构建出一个新的镜像
Dockerfile脚本示例
1 | 定义父镜像 |
执行 Dockerfile 文件构建镜像的命令
1 | docker build -t <镜像名称>:<标签> <Dockerfile所在目录路径> |
Dockerfile关键字
| 关键字 | 作用 | 语法 |
|---|---|---|
| FROM | 指定基础镜像(父镜像) | FROM <镜像> |
| MAINTAINER | 作者信息 | MAINTAINER <名字> |
| LABEL | 标签 | LABEL <键>=<值> <键>=<值> … |
| RUN | 执行命令 | RUN [“<命令>”, “<参数1>”, “<参数2>”…] |
| CMD | 容器启动命令 | CMD [“<命令>”, “<参数1>”, “<参数2>”…] |
| ENTRYPOINT | 入口 | ENTRYPOINT [“<命令>”, “<参数1>”, “<参数2>”…] |
| COPY | 复制文件 | COPY <源路径> <目标路径> |
| ADD | 添加文件 | ADD <源路径> <目标路径> |
| ENV | 环境变量 | ENV <键> <值> |
| ARG | 构建参数 | ARG <键> <默认值> |
| VOLUME | 定义外部可以挂载的数据卷 | VOLUME <路径> |
| EXPOSE | 暴露端口 | EXPOSE <端口号> |
| WORKDIR | 工作目录 | WORKDIR <路径> |
| USER | 指定执行用户 | USER <用户名> |
| HEALTHCHECK | 健康检查 | HEALTHCHECK [选项] CMD <命令> |
| ONBUILD | 触发器 | ONBUILD <命令> |
| STOPSIGNAL | 发送信息量到宿主机 | STOPSIGNAL <信号> |
| SHELL | 指定执行脚本的shell | SHELL [“ |
DockerCompose服务编排
Docker Compose 简介
Docker Compose 是 Docker 官方提供的一个工具,用于简化容器编排过程。它通过编写 YAML 文件来定义和管理多个 Docker 容器,并可以在多个容器间进行链接、通信和数据共享
Docker Compose 安装
(1)在官网上下载最新版本的 Docker Compose
1 | # 注意将 {VERSION} 替换为最新版本号,也可以通过官方网站直接下载二进制文件并安装 |
(2)赋予执行权限
1 | sudo chmod +x /usr/local/bin/docker-compose |
(3)验证是否安装成功
1 | docker-compose -version |
如果出现类似以下输出,则说明已经成功安装
1 | docker-compose version 1.29.0, build 07737305 |
Docker Compose常用命令
| 命令 | 描述 |
|---|---|
docker-compose up | 创建并启动所有容器 |
docker-compose up -d | 在后台创建并启动所有容器 |
docker-compose down | 停止并删除所有容器 |
docker-compose stop | 停止所有容器 |
docker-compose start | 启动所有容器 |
docker-compose restart | 重启所有容器 |
docker-compose ps | 显示当前项目中正在运行的容器 |
docker-compose logs | 显示日志信息 |
docker-compose exec | 在容器内执行命令 |
docker-compose build | 构建镜像 |
docker-compose push | 将构建的镜像发布到 Docker Hub 或其他容器仓库 |
docker-compose config | 检查和显示 compose 文件的语法 |
Docker Compose使用案例
目录结构
1 | └──redis # Redis 目录 |
Redis配置文件
1 | 开启 AOF 持久化 |
配置docker-compose-redis.yml文件
1 | version: '3' # Docker Compose 版本 |
启动Redis容器
1 | docker-compose -f docker-compose-redis.yml -p redis up -d |
测试连接Redis
1 | docker exec -it redis redis-cli -a 123456 # 密码为123456 |





