1 Docker 基础
1.1 Docker 简介:
Docker 是一个开源的应用容器引擎,是直接运行在宿主操作系统之上的一个容器,使用沙箱机制完全虚拟出一个完整的操作,容器之间不会有任何接口,从而让容器与宿主机之间、容器与容器之间隔离的更加彻底。每个容器会有自己的权限管理,独立的网络与存储栈,及自己的资源管理能,使同一台宿主机上可以友好的共存多个容器。
1.2 Docker 与 虚拟机 差在哪?
如果物理机是一幢住宅楼,虚拟机就是大楼中的一个个套间,而容器技术就是套间里的一个个隔断。
应用场景不同
虚拟机更擅长于彻底隔离整个运行环境。如: 云服务提供商通常采用虚拟机技术隔离不同的用户。
Docker通常用于隔离不同的应用,例如前端,后端以及数据库。
资源的使用率不同
虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。
1.3 Docker 版本信息....了解
Docker-CE -> 社区版
- Stable 版
稳定版
一个季度更新一次
- Edge 版
非稳定版
一个月更新一次
Docker-EE
收费的, 企业版
1.4 Docker架构与核心组件
客户端 -> linux终端
执行对应的命令, 完成对应的功能
docker服务器 -> 后台守护进程
不与用户交互
没有输入输出
docker 镜像
有了镜像之后才能启动一个容器
只占用磁盘空间
来源:
自己制作
从官方下载 -> 命令
一个镜像对应的是一个操作系统
redis镜像
一个操作系统, 里边安装了redis
ubuntu镜像
一个ubuntu操作系统
容器
镜像 启动之后就叫容器
容器占用cpu, 内存资源, 不占硬盘资源
容器启动之后相当于操作系统启动了
镜像仓库
官方的镜像仓库 -> docker hub
1.5 Docker 安装 和 卸载
安装 :
# 1. 安装基本软件
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common lrzsz -y
# 2. apt仓库添加并阿里云的docker软件包
# 把下载的key添加到本地trusted数据库中。
$ sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 3. 升级软件源
$ sudo apt-get update
# 4. 安装docker
$ sudo apt-get install docker-ce -y
# 5. 测试docker
$ docker version
卸载 :
# 卸载软件
sudo apt remove docker-ce ------- 只删除安装程序
sudo apt purge docker-ce ------- 删除安装程序和对应配置文件
# 删除一下目录
/etc/docker
/var/lib/docker
- 镜像
- 挂载的数据卷目录等
# 命令, 删除root用户目录
sudo rm -rf 目录名
docker加速器设置 -> 可选 :
# docker安装完成之后, 启动docker容器需要镜像, 镜像需要从官方下载, 可以通过配置加速器, 提高下载速度
# 访问 https://dashboard.daocloud.io 网站,登录 daocloud 账户
# 提交下载镜像的速度
# 打开加速页面, 拷贝下边的命令到linux终端, 执行
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
# 可以去 /etc/docker/daemon.json
这个文件中添加了一句话:
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
# 重启docker服务
sudo systemctl restart docker
1.6 权限问题
$ docker version
Client:
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:49:01 2018
OS/Arch: linux/amd64
Experimental: false
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/version: dial unix /var/run/docker.sock: connect: `permission denied`
# 解决方案1: 在docker命令前加sudo
# 解决方案2: 只需要操作一次
1. 将当前用户加入到docker组中
sudo gpasswd -a 用户名 用户组 ---> sudo gpasswd -a go docker
表示当前用户: $USER
2. 将当前用户切换到docker组中
newgrp - docker
# 第三种解决方案: 只要docker服务重启, 就需要重新设置一次
cd /var/run
sudo chmod 666 docker.sock
1.7 Docker 服务相关操作命令
# 启动
sudo systemctl start docker
# 关闭
sudo systemctl stop docker
# 重启
sudo systemctl restart docker
# 查看状态
sudo systemctl status docker
2 Docker 镜像管理
2.1 镜像的搜索/获取/查看
镜像搜索 :
# 查看docker中的所有指令
docker --help
# 搜索镜像
docker search 镜像名
# 头
NAME: 镜像名
DESCRIPTION: 镜像描述
STARS: 下载量
OFFICIAL: 是不是官方制作的镜像
AUTOMATED: 镜像是不是自动生成的 (Dockerfile)
获取镜像 :
# 载远程仓库(如Docker Hub)中的镜像
docker pull 镜像名
# 镜像下载到本地之后, 存储在什么地方?
/var/lib/docker
查看镜像 :
# 命令
# 查看的是本地镜像
# 查看所有本地镜像
docker images == docker image ls
# 查看某个指定的镜像
docker image ls 镜像名
# 头信息
REPOSITORY:镜像名
TAG: 镜像的版本, 默认是latest
IMAGE ID: 镜像的ID, 这是唯一的
CREATED: 创建时间
SIZE: 镜像大小
# 细节:
表示镜像的时候有两种方式:
- 名字
- 如果镜像的tag==latest, 表示镜像的时候tag可以省略
- 如果镜像的tag不等于latest, 表示名字的时候 => 镜像名:tag
- 镜像ID
2.2 镜像别名/删除
镜像别名:
# 命令
docker tag 原来的镜像名:[tag] 新的名字[:TAG]
# 别名只是名字不同, 镜像的同一个, 不会复制
删除镜像 :
# 命令
docker rmi == docker image rm
docker rmi [OPTIONS] IMAGE [IMAGE...]
参数:
OPTIONS: -f, --force: 强制删除镜像
IMAGE: 要删除的镜像的名字/ID
# 细节:
- 镜像有别名 -> 只能根据名字删除
- 如果有三个名字, 删除一个还是两个, 再删剩一个, 再删没有(镜像就被删除了)
- 镜像没有别名 -> 只有一个名字
可以根据ID, 镜像名删除
2.3 镜像的导入删除
镜像导出 -> 镜像备份和分发 :
# 将本地仓库中的镜像导出的磁盘目录
docker save [OPTIONS] IMAGE [IMAGE...]
Options:
-o, --output 导出的镜像名(随便起名) 写一个文件, 替换标准输入出
IMAGE: 要导出的镜像(ID/名字)
镜像导入 :
# 将外部镜像, 导入到本地的镜像仓库中
docker load [OPTIONS]
Options:
-i, --input string 要导入的镜像的磁盘文件
docker load < 镜像文件名
2.4 镜像的历史和详情信息
查看镜像的历史信息 :
# 制作镜像的时候的操作步骤
docker history
查看镜像的详细信息 :
# 镜像的属性信息, 以json格式输出的
docker inspect 镜像名/镜像ID
2.5 总结图
3. docker容器管理
docker将镜像文件启动, 得到一个容器, 一个容器可以被看做一个操作系统1
3.1 容器的查看/创建/启动
容器查看
容器创建
容器启动
启动创建的容器
创建新容器并启动