docker的了解、安装与使用笔记

docker 基本了解与使用
镜像:Docker 镜像(lmage),就相当于是 一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container): 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository): 仓库可看成一个代码控制中心,用来保存镜像。
镜像和容器的关系: 我们创建容器就必须要有镜像
docker 安装
请根据 docker 官网的信息进行安装:https://www.docker.com/
安装后记得执行这条命令让 docker 能够开机自启:
sudo systemctl start docker
sudo systemctl enable docker如果是 debian,可以去这里按照教程按照:Install Docker Engine on Debian | Docker Docs
docker 服务相关命令
- 启动 docker 服务
sudo systemctl start docker- 停止 docker 服务
sudo systemctl stop docker- 重启 docker 服务
sudo systemctl restart docker- 查看 docker 服务状态
sudo systemctl status docker- 设置 docker 开机自启服务(如果是服务器的话建议开启)
sudo systemctl enable docker- 其他相关命令
docker info查看 docker 相关信息docker volume ls查看 volume 列表docker network ls查看网络列表
修改相关配置文件
修改镜像源
由于在国内访问 docker 仓库速度太慢,这时我们需要修改为国内的镜像源地址。 常用的镜像源:
https://github.com/DaoCloud/public-image-mirror
编辑 /etc/docker/daemon.json 这个文件,如果不存在请自行创建。加入以下内容(这里我以中国科技大学镜像站来作为演示):
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}然后重启 Docker 即可:
sudo systemctl daemon-reload
sudo systemctl restart docker在命令行执行 docker info ,如果从结果中看到了如下内容,说明配置成功。
Registry Mirrors:
https://docker.m.daocloud.io更换文件存储位置
默认情况下 docker pull images 存储在/var/lib/docker/ 目录下,但因为 docker images 的大小一般较大,安装较多容易导致我们这个位置的存储空间不足,所以我们需要将其改到其他目录下。(一般有多个分区的才需要修改,如果是整个 linux 系统就存在一个分区,也就是"/",那么就可以不用更改了)
编辑 /etc/docker/daemon.json 这个文件,在修改镜像源的基础上加入如下配置:
{
"registry-mirrors": ["https://docker.m.daocloud.io"],
"data-root": "/home/var-lib-docker/docker"
}我们这里更改镜像位置到了 /home/var-lib-docker/docker 目录下,大家可以按照自己的实际位置修改。
然后重启 Docker 即可:
sudo systemctl daemon-reload
sudo systemctl restart docker再执行命令 docker info ,如果从结果中看到了如下内容,说明配置成功。
Docker Root Dir: /home/var-lib-docker/dockerdocker 镜像和容器的相关命令
这是最重要的部分,我们用得最多。
更多更详细命令请看菜鸟教程:docker菜鸟
镜像相关命令
查看镜像
docker images
docker images -q # 查看所有镜像id查看我们本机安装的镜像
搜索镜像
我们有两种方式搜索我们需要的镜像,一种是用代码方式搜索,如下:
docker search <images>images 填入镜像名。

OFFICIAL 标签下为 [ok] 的为官方镜像,我们一般都使用这个。
另一种方式是在 dockerhub 中搜索,网站:docker
拉取镜像
docker pull <images>这里的 images 填入镜像名,默认安装 latest 版本,也就是最新的版本,当然我们也可以指定版本安装,如下:
docker pull redis:3.2安装 redis 的 3.2 版本。
删除镜像
docker rmi id这里的 id 是 docker images 的 id,我们可以通过查看镜像命令看到 id。
容器相关命令
查看容器
查看正在运行的容器:
docker ps查看正在运行的和已经关闭的容器:
docker ps -a创建容器
首先要保证我们电脑里要有 images 才能创建容器。
docker run ... <images> [command]这里的 ... 代表着还有其他的参数,几个常用参数介绍如下:
- i:保持一直运行-d:后台运行- t:给容器分配一个伪终端-P: 随机端口映射,容器内部端口随机映射到主机的端口-p: 指定端口映射,格式为:主机(宿主)端口:容器端口--name=c1:给容器一个名字,这里我们把名字设置为 c1
[command] 是创建容器时的初始化指令,可以不写。
如下,我们这样创建一个 centos7 的容器,并进入其终端:
docker run -it --name=cen centos:7 /bin/bash进入与退出容器
创建后才能进入容器。
docker exec -it <name> <command>name 是我们上面创建容器时所指定的, command 是初始化命令。
退出容器:
exit注意: 如果创建容器时没有加 -d 参数,那么退出后容器将关闭,加了的话就不会关闭。
启动容器
docker start <name>停止容器
docker stop <name>删除容器
docker rm <name/id>注意: 我们只能删除已经停止的容器,正在运行的容器不允许删除。
查看容器信息
docker inspect <name>这里的信息很多,不太方便记录与讲解,自己实际去看才能有所体会。
docker 容器的数据卷
对于 docker 容器有这几个特性:
- docker 容器删除后数据也消除
- docker 容器与外部机器之间不能相互传输文件,必须要经过宿主机(也就是 docker 容器所在的那个机器)
为了解决这些问题,我们引入了数据卷,那什么是数据卷呢?
- 数据卷是宿主机中的一个目录,想让其成为数据卷就要将其挂载到 docker 中
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以同时挂载多个数据卷
数据卷的作用
- 容器数据持久化
- 外部机器和容器间接通
- 容器之间数据交换
配置数据卷
创建容器时,使用 -v 参数设置数据卷
docker ... -v 宿主机目录/文件:容器内目录/文件注意事项:
- 目录必须为绝对路径
- 如果目录不存在则会自动创建
- 可以挂载多个数据卷
案例:MySQL 部署
- 拉取 MySQL 的镜像
docker pull mysql:5.6- 在/root 目录下创建 mysql 目录用于存储 mysql 数据信息
mkdir ~/mysql
cd ~/mysql- 创建容器,设置端口映射、目录映射
docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456! \
mysql:5.6参数说明:
-p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。由于 docker 容器不能访问外部数据,所以我们需要将 MySQL 的 3306 端口映射到主机的 3307 端口上。-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 用户的密码。
dockerfile
DockerFile 是用来构建 Docker 镜像的构建文件,是由一系列命令参数构成的脚本。
linux 的系统组成
docker 一般是基于 linux 或 windows 安装的,而且内部组成有些类似 linux,所以我们先来了解下 Linux 的系统组成。

Linux 文件系统由 bootfs 和 rootfs 两部分组成
- bootfs: 包含 bootloader (引导加载程序) 和 kernel (内核)
- rootfs: root 文件系统,包含的就是典型 Linux 系统中的/dev, /proc,/bin,/etc 等标准目录和文件
- 不同的 linux 发行版,bootfs 基本一样,而 rootfs 不同,如 ubuntu , centos 等
Docker 镜像原理

- Docker 镜像是由特殊的文件系统叠加而成
- 最底端是 bootfs,并使用宿主机的 bootfs
- 第二层是 root 文件系统 rootfs,称为 base image
- 然后再往上可以叠加其他的镜像文件
- 统一文件系统 (Union File System) 技术能够将不同的 层整合成一个文件系统,为这些层提供了一个统一的视角 ,这样就隐藏了多层的存在,在用户的角度看来,只存在 一个文件系统。
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称 为父镜像,最底部的镜像成为基础镜像。
- 当从一个镜像启动容器时,Docker 会在最顶层加载一个读、写文件系统作为容器
由此可知 Docker 镜像的本质是一个分层的文件系统,各层之间的镜像文件可以复用 以节约空间。
Docker 镜像制作
1. 容器转为镜像
这种是基于容器来制作的,经常是把一个他人的镜像修改后用 docker 重新打包而成的。 注意: 我们挂载的容器卷在制作镜像时会被忽略,也就是镜像中不会存在我们挂载的目录。
docker commit 容器id 镜像名称:版本号当转为镜像后我们不方便传播到其他计算机上,所以我们要对其进行压缩。压缩完成后默认在当前目录生成文件。
docker save -o 压缩文件名称.tar 镜像名称:版本号现在我们可以把这个镜像发送给其他的地方,使用以下命令就可以还原出我们的镜像了。
docker load -i 压缩文件2. dockerfile
我们一般使用 dockerfile 来制作我们的镜像,而容器转镜像技术不太常用。
- Dockerfile 是一个文本文件
- 包含了一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员: 可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过 Dockerfile 文件 构建一个新的镜像开始工作了
- 对于运维人员:在部署时,可以实现应用的无缝移植
学习这个的最简单方法就是去dockerhub上看一下他们是怎么写的,在 docker 里找一个项目,让后在这个页面点进去就可以查看 dockerfile 文件了。
一些 dockerfile 的关键字
| 关键字 | 作用 | 备注 |
| FROM | 指定父镜像 | 指定 dockerfile 基于哪个 image 构建 |
| MAINTAINER | 作者信息 | 用来标明这个 dockerfile 谁写的 |
| LABEL | 标签 | 用来标明 dockerfile 的标签 可以使用 Label 代替 Maintainer 最终都是在 docker image 基本信息中可以查看 |
| RUN | 执行命令 | 执行一段命令,默认是 /bin/sh 格式: RUN command 或者 RUN ["command", "param1","param2"] |
| CMD | 容器启动命令 | 提供启动容器时候的默认命令,和 ENTRYPOINT 配合使用。格式 CMD command param1 param2 或者 CMD [“command” , “param1”,”param2”] |
| ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
| COPY | 复制文件 | build 的时候复制文件到 image 中 |
| ADD | 添加文件 | build 的时候添加文件到 image 中,不仅仅局限于当前 build 上下文,也可以来源于远程服务 |
| ENV | 环境变量 | 指定 build 时候的环境变量,可以在启动的容器的时候通过-e 覆盖,格式 ENV name=value |
| ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有 ENV 那么 ENV 的相同名字的值始终覆盖 arg 的参数 |
| VOLUME | 定义外部可以挂载的数据卷 | 指定 build 的 image 那些目录可以启动的时候挂载到文件系统中,启动容器的时候使用 -v 绑定,格式 VOLUME [“目录”] |
| EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p 来绑定暴露端口 |
| WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定 / 使用的是绝对地址 如果不是/开头那么是在上一条 workdir 的路径的相对路径 |
| USER | 指定执行用户 | 指定 build 或者启动的时候 用户 在 RUN CMD ENTRYPONT 执行的时候的用户 |
| HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令,基本上没用,因为很多时候应用本身有健康监测机制 |
| ONBUILD | 触发器 | 当存在 ONBUILD 关键字的镜像作为基础镜像的时候,当执行 FROM 完成之后,会执行 ONBUILD 的命令,但是不影响当前镜像用处也不怎么大 |
| STOPSIGNAL | 发送信号量到宿主机 | 该 STOPSIGNAL 指令设置将发送到容器的系统调用信号以退出 |
| SHELL | 指定执行脚本的 shell | 指定 RUN CMD ENTRYPOINT 执行命令的时候使用的 shell |
用 dockerfile 构建镜像的方法
首先要编写好 dockerfile 文件(dockerfile 文件没有后缀,命名为Dockerfile),然后通过以下命令构建:
docker build -f dockerfile文件路径 -t 镜像名称:版本 .docker compose
Docker Compose 是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建 ,启动和停止。使用步骤:
- 利用 Dockerfile 定义运行环境镜像
- 使用 docker-compose.yml 定义组成应用的各服务
- 运行
docker-compose up启动应用
Docker Compose 安装使用
Compose 目前已经完全支持 Linux、Mac OS 和 Windows,在我们安装 Compose 之前,需要先安装 Docker。下面我们以编译好的二进制包方式安装在 Linux 系统中。
具体可以查看 docker 官方的安装文档:docker-compose
#这是linux的安装脚本
curl -SL https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose --version如果有版本号输出则安装成功
卸载 Docker Compose
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose运行 docker compose 文件
在有 docker-compose.yml 的文件的目录下,执行
docker-compose up -d-d 指的是让容器后台运行。 docker-compose 中的很多命令与 docker 中的一样,大家可以自己去研究研究。
案例
使用docker compose编排nginx+springboot项目
创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose编写 docker-compose.yml 文件,这是一个固定的文件名。
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"因为上面规定了数据卷,所以这里要创建 ./nginx/conf.d 目录
mkdir -p ./nginx/conf.d在 ./nginx/conf.d 目录下编写 demo.conf 文件。这是nginx的配置文件。
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080;
}
}在 ~/docker-compose 目录下使用 docker-compose 启动容器
docker-compose up -d