Docker 解决的问题:开发环境和部署环境存在差异性。
虚拟机虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。
缺点:
- 资源占用多:虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了
- 冗余步骤多:虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录
- 启动慢:启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行
Linux 容器(Linux Containers,缩写为 LXC),不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
由于容器是进程级别的,相比虚拟机有很多优势:
- 启动快:容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程
- 资源占用少:容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源
- 体积小:容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多
docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
- 提供一次性的环境:比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境
- 提供弹性的云服务:因为 docker 容器可以随开随关,很适合动态扩容和缩容
- 组建微服务架构:通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构
| 概念 | 说明 |
|---|---|
| docker 镜像(Images) | docker 镜像是用于创建 docker 容器的模板,比如 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 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 docker容器。image 文件可以看作是容器的模板。docker根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。
image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。
为了方便共享,image 文件制作完成后,可以上传到网上的仓库。docker 的官方仓库 docker Hub 是最重要、最常用的 image 仓库。此外,出售自己制作的 image 文件也是可以的。
容器文件image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。
终止运行的容器文件,依然会占据硬盘空间。
docker 有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面的介绍都针对社区版。
Windows 安装
Ubuntu 安装
Mac 安装
安装完成之后,可以运行下面的命令查看是否安装成功:
sudo docker version # 或者 sudo docker info
docker 需要用户具有 sudo 权限,为了避免每次命令都输入 sudo,可以把用户加入 docker 用户组 Ref:
sudo usermod -aG docker $USER
测试:
docker image pull library/hello-world docker container run hello-world配置阿里云镜像加速
登录阿里云,搜索:“容器镜像服务”。
执行:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
可以通过 docker info 命令查看 Registry Mirrors 配置是否生效。
docker 常用命令 基本命令# 启动 docker systemctl start docker # 停止 docker systemctl stop docker # 重启 docker systemctl restart docker # docker 设置随服务启动而自启动 systemctl enable docker # 查看 docker 运行状态 systemctl status docker # 查看 docker 版本号信息 docker version docker info # docker 帮助命令 docker --help # docker 查看具体某个命令 docker pull --help镜像相关的命令
# 查看自己服务器中 docker 镜像列表 docker images # 搜索镜像 docker search 镜像名 docker search --filter=STARS=9000 mysql # 搜索 STARS >9000的 mysql 镜像 # 拉取镜像 docker pull 镜像名 docker pull 镜像名:tag # 运行镜像 docker run 镜像名 docker run 镜像名:Tag # 删除镜像:当前镜像没有被任何容器使用才可以删除 ## 删除单个镜像 docker rmi -f 镜像名/镜像ID ## 删除多个,其镜像ID或镜像用用空格隔开即可 docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID ## 删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID docker rmi -f $(docker images -aq) ## 强制删除镜像 docker image rm 镜像名称/镜像ID # 保存镜像:保存为 tar 压缩文件 这样方便镜像转移和保存 docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字 # 加载镜像:任何装 docker 的地方加载镜像保存文件,使其恢复为一个镜像 docker load -i 镜像保存文件位置docker 容器命令
docker run 镜像 产生一个该镜像具体容器实例。
# 查看正在运行容器列表 docker ps # 查看所有容器:包含正在运行 和已停止的 docker ps -a # 运行容器 # -it 表示 与容器进行交互式启动 -d 表示可后台运行容器 (守护式运行) --name 给要运行的容器 起的名字 /bin/bash 交互路径 docker run -it -d --name 要取的别名 镜像名:Tag /bin/bash # 容器端口与服务器端口映射 docker run -itd --name 容器名称 -p 宿主机端口:容器端口 镜像名称:Tag /bin/bash # 进入容器 docker exec -it 容器名/容器ID /bin/bash docker attach 容器名/容器ID # 从容器内退出到自己服务器中 ## 直接退出:未添加 -d (持久化运行容器) 时执行此参数的容器会被关闭 exit ## 优雅提出:无论是否添加 -d 参数 执行此命令容器都不会被关闭 Ctrl + p + q # 停止容器 docker stop 容器ID/容器名 # 重启容器 docker restart 容器ID/容器名 # 启动容器 docker start 容器ID/容器名 # kill 容器 docker kill 容器ID/容器名 # 容器文件拷贝:无论容器是否开启 都可以进行拷贝 ## 从容器内 拷出 docker cp 容器ID/名称: 容器内路径 容器外路径 ## 从外部 拷贝文件到容器内 docker cp 容器外路径 容器ID/名称: 容器内路径 # 查看容器日志 docker logs -f --tail=要查看末尾多少行 默认all 容器ID # 更换容器名 docker rename 容器ID/容器名 新容器名 # 从容器创建一个新的镜像 docker commit -a :提交的镜像作者 -c :使用 Dockerfile 指令来创建镜像 -m :提交时的说明文字 -p :在commit时,将容器暂停 容器 仓库名:Tagdocker 运维命令
# 查看docker工作目录
sudo docker info | grep "Docker Root Dir"
# 查看 docker磁盘占用总体情况
du -hs /var/lib/docker/
# 查看 docker 磁盘占用总体情况
du -hs /var/lib/docker/
# 查看 docker 的磁盘使用具体情况
docker system df
# 删除无用的容器和镜像
## 删除异常停止的容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'`
## 删除名称或标签为none的镜像
docker rmi -f `docker images | grep '' | awk '{print $3}'`
# 清除所有无容器使用的镜像:此命令只要是镜像无容器使用(容器正常运行)都会被删除,包括容器临时停止
docker system prune -a
# 查找大文件
find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr
# 查找指定docker使用目录下大于指定大小文件
find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr |grep '/var/lib/docker/overlay2/*' ## 查找 /var/lib/docker/overlay2/* 开头的且大于100M 的文件



