Docker
该笔记是根据B站视频学习编写
1. 什么是Docker
Docker 是一个用于构建、部署和管理容器化应用的开源平台。这些容器是标准化的可执行组件,结合了应用源代码以及在任何环境中运行该代码所需的操作系统 (OS) 库和依赖项。
Docker的作用:
- 轻量级的虚拟化:Docker 容器提供了一种轻量级的虚拟化方式,相较于传统的虚拟机,Docker 容器启动速度更快,占用资源更少
- 环境一致性:Docker 可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,这样就可以确保应用在不同环境中的一致性
- 提高资源利用率:开发人员使用容器在硬件上运行的应用副本数量是使用虚拟机的数倍。这可以减少云支出
- 提高开发效率:Docker 容器化应用可以“一次编写,随处运行”。与虚拟机相比,容器的部署、配置和重启过程更迅速且更简单
- 快速交付软件:Docker 可以让你将应用程序与基础架构分开,从而可以快速交付软件。你可以大大减少编写代码和在生产环境中运行代码之间的延迟
2. 安装Docker
卸载旧版
1 | |
配置Docker的yum库
安装一个yun工具
1 | |
安装完毕后,执行命令,配置Docker的yum源
1 | |
安装Docker
1 | |
启动和校验
1 | |
3. 快速入门
使用Docker来安装MySQL,先停掉Linux中的MySQL
安装MySQL的指令
1 | |
可以通过本机电脑连接到虚拟机的MySQL

当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器
Docker官网维护的公共镜像仓库:Docker Hub Container Image Library | App Containerization
命令解读
1 | |
- docker run :创建并运行一个容器,**-d**是让容器在后台运行
- –name mysql :给容器起一个名字,必须唯一
- -p 3306:3306 :设置端口映射,前面是主机端口,后面是容器端口
- -e KEY=VALUE : 设置环境变量,不同的容器需要不同的环境变量,可以在Docker的镜像仓库查看有容器哪些环境变量
- mysql :指定运行的镜像名字,镜像名称一般由两部分组成:[repository]:[tag]
- repository是镜像名
- tag是版本号
- 如果没有版本号则默认是最新版本的镜像
4. 常见命令
Docker最常见的命令就是操作镜像和容器,详情见官方文档
- docker pull:从镜像仓库拉取或更新指定镜像
- docker pull:把本地镜像推送到远程镜像仓库中去
- docker images:列出本地存储的所有docker镜像
- docker rmi:从主机节点中删除一个或多个镜像,-f是强制删除
- docker build:根据DockerFile和context来自定义docker镜像
- docker save:把打包好的镜像以压缩包的形式保存到本地
- docker load:把压缩文件加载在本地镜像中
- docker run:创建一个新的容器并运行
- docker stop:停止容器
- docker start:启动容器
- docker logs:获取容器的日志
- docker exec:通过这个命令可以在不需要进入容器的情况下直接与容器内的环境进行交互
- docker ps:列出正在运行的docker容器,-a是显示所有容器包括未运行的
- docker rm:删除一个或多个容器,添加-f可以强制删除正在运行的容器
5. 数据卷挂载
数据卷是一种用于持久化存储容器数据的机制,它是一个可供一个或多个容器使用的特殊目录,绕过了联合文件系统,有很多特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新不会影响镜像
- 数据卷默认会一直存在,即使容器被删除、
数据卷挂载是将宿主机的数据卷挂载到Docker容器中的目录中(/var/lib/docker/volumes),数据卷目录由Docker管理。这样做的好处是容器可以直接访问和使用这些数据,而且这些数据在容器之间是可以共享的
Docker提供了两种挂载方式,-v和-mount
数据卷是容器内目录和宿主机目录之间映射的桥梁
| 命令 | 说明 |
|---|---|
| docker volume create | 创建数据卷 |
| docker volume ls | 查看所有数据卷 |
| docker volume rm | 删除指定数据卷 |
| docker volume Inspect | 查看某个数据卷的详情 |
| docker volume prune | 清除数据卷 |
通过案例——利用Nginx容器部署静态资源来实现数据卷的挂载
需求:
- 创建Nginx容器,修改nginx容器内的html目录下的index.html文件内容
- 将静态资源部署到nginx的html目录
当容器创建时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
在执行docker run命令时,使用**-v 数据卷:容器内目录**可以完成数据卷挂载

- 通过docker run -d –name nginx -p 180:180 -v html:/usr/share/nginx/html nginx 创建并运行一个容器,并挂载数据卷
- html:/usr/share/nginx/html html容器名, /usr/share/nginx/html要挂载的容器中的目录
- docker volume ls 查看所有数据卷
- docker volume inspect html 查看html数据卷的详细信息
- Mountpoint 挂载在宿主机中的位置
这时候想修改nginx容器中的html目录下的文件只需要在宿主机中对应的文件中(MountPoint)修改就可以了
6. 本地目录挂载
本地目录挂载是指将设备文件中的顶级目录连接到Linux跟目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。这个过程称为“挂载”
并不是根目录下任何一个目录都可以作为挂载点,由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录
- 在执行docker run 命令时,使用**-v 本地目录:容器内目录**可以完成本地目录挂载
- 本地目录必须以
/或./开头,如果直接以名称开头会被识别为数据卷而非本地目录- -v mysql:/var/lib/mysql会被识别为一个名为mysql的数据卷
- -v /mysql:/var/lib/mysql会被识别为当前目录下的mysql目录
7. 自定义镜像
镜像结构
镜像中包含了应用程序所需要的运行环境、函数库、配置、以及应用本身等各种文件,这些文件分层打包
DockerFile
DockerFile是一个文本文件,其中包含一个个的指令,用来说明要执行什么操作来构建镜像
| 指令 | 说明 | 示例 |
|---|---|---|
| FROM | 指定基础镜像 | FROM centos:7 |
| ENV | 设置环境变量 | ENV key value |
| COPY | 拷贝本地文件到镜像的指定目录 | COPY ./jrell.tar.gz /tmp |
| RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN tar -zxvf /tmp/jrell.tar.gz && EXPORTS path=/tmp/jrell:$path |
| EXPOSE | 指定容器运行时监听的端口 | EXPOSE 8080 |
| ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
案例
基于JDK为基础镜像,省略前面步骤
1 | |
自定义镜像
当编写好DockerFile,可以利用下面命令来构建镜像:
1 | |
- -t :是给镜像起名,格式是repository:tag的格式,不指定tag时,默认为latest
- . :是指定Docker所在目录,如果就在当前目录,则指定为”.”
8. Docker网络
Docker网络是Docker容器之间以及容器和宿主机之间的网络连接的一种机制。在Docker中,每个容器都可以有自己的网络栈,包括网络接口、IP地址和网络配置。Docker网络提供了一种简单、可扩展的方式来组织和管理容器,使得它们可以在同一个网络中进行通信。Docker提供了几种网络模式,包括bridge、host、none和container。
- Bridge模式:在该模式中,Docker守护进程创建了一个虚拟以太网桥docker0,新建的容器会自动桥接到这个接口,附加在其上的任何网卡之间都能自动转发数据包。
- Host模式:采用host网络模式的Docker容器,可以直接使用宿主机的IP地址与外界进行通信。
- None模式:none网络模式即不为Docker容器创建任何的网络环境,容器内部就只能使用loopback网络设备。
- Container模式:处于这个模式下的Docker容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信
默认情况下、所有容器都是以bridge方式连接到Docker的一个虚拟网桥上
默认分配的容器ip地址是不固定的,服务器重启或者其它操作都有可以是容器的ip地址发生变化,所以需要加入自定义网络
加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下:
| 命令 | 说明 |
|---|---|
| docker network create | 创建一个网络 |
| docker network ls | 查看所有网络 |
| docker network rm | 删除指定网络 |
| docker network prune | 清除未使用的网络 |
| docker network connect | 使指定容器连接加入某网络 |
| docker network disconnect | 使指定容器连接离开某网络 |
| docker network inspect | 查看网络详细信息 |
创建一个自定义网络
把mysql容器加入自定义网络中
1 | |
通过docker inspect mysql查看mysql容器的网络
可以看见已经把容器添加到自定义网络中了
在创建容器时就加入自定义网络
1 | |
然后就这两个容器就可以通过名字互相ping了