目录
1. docker基础
1. 1 docker介绍
1.2 docker架构与核心组件
1.3 docker安装和卸载
安装
卸载
docker加速器设置 -> 可选
1.4 权限问题
1.5 docker服务相关操作命令
2. docker镜像管理
2.1 镜像的搜索/获取/查看
镜像搜索
2.2 镜像别名/删除
2.3 镜像的导入导出
2.4 镜像的历史和详细信息
2.6 总结
3. docker容器管理
3.1 容器的查看/创建/启动
3.2 容器的暂停/重启
3.3 容器的关闭/终止/删除
3.4 容器的进入/退出
3.5 容器的日志/信息/端口/重命名
3.6 基于容器的镜像导入导出
3.6 总结
docker是什么 ?
Docker 是一个开源的应用容器引擎,是直接运行在宿主操作系统之上的一个容器,使用沙箱机制完全虚拟出一个完整的操作,容器之间不会有任何接口,从而让容器与宿主机之间、容器与容器之间隔离的更加彻底。每个容器会有自己的权限管理,独立的网络与存储栈,及自己的资源管理能,使同一台宿主机上可以友好的共存多个容器。
docker与虚拟机对比
如果物理机是一幢住宅楼,虚拟机就是大楼中的一个个套间,而容器技术就是套间里的一个个隔断。
虚拟化技术不同
VMware Workstation、VirtualBoX
硬件辅助虚拟化:(Hardware-assisted Virtualization)是指通过硬件辅助支持模拟运行环境,使客户机操作系统可以独立运行,实现完全虚拟化的功能。
Docker
操作系统层虚拟化:(OS-level virtualization)这种技术将操作系统内核虚拟化,可以允许使用者空间软件实例被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。这个软件实例,也被称为是一个容器(containers)、虚拟引擎(Virtualization engine)、虚拟专用服务器(virtual private servers)。每个容器的进程是独立的,对于使用者来说,就像是在使用自己的专用服务器。
以上两种虚拟化技术都属于软件虚拟化,在现有的物理平台上实现对物理平台访问的截获和模拟。在软件虚拟化技术中,有些技术不需要硬件支持;而有些软件虚拟化技术,则依赖硬件支持。
应用场景不同
虚拟机更擅长于彻底隔离整个运行环境。如: 云服务提供商通常采用虚拟机技术隔离不同的用户。
Docker通常用于隔离不同的应用,例如前端,后端以及数据库。
资源的使用率不同
虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。
docker的版本
Docker-CE -> 社区版
Stable 版
稳定版
一个季度更新一次
Edge 版
非稳定版
一个月更新一次
Docker-EE
收费的, 企业版
客户端
linux终端, 用来操作docker指令
docker服务器
守护进程 -> 有一个应用程序, 没有操作终端
不能和用户进行交互
输入
输出
在后台周期性的执行某些操作
管理docker容器和docker镜像
docker镜像
一些操作系统磁盘文件
nginx镜像
有一个操作系统, 上边安装了nginx
ubuntu镜像
redis镜像
用户可以自己制作, 也可以从官方下载
docker容器
通过docker操作命令可以磁盘上的docker镜像启动, 启动之后就是docker容器
容器中运行的是一个操作系统
镜像仓库
docker hub -> 官方提供的镜像仓库
# 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-get purge docker-ce
- 删除对用的信息文件+应用程序
sudo apt-get remove docker-ce
- 只删除应用程序
# 删除目录
/etc/docker -> 身份认证目录
/var/lib/docker -> 存储镜像的
$ sudo rm /etc/docker /var/lib/docker -r
# 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
$ 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 -> 在指令前添加sudo
sudo docker version
# 解决方案2 -> 只需要设置一次, 以后就都OK了
# 将当前用户, 添加到docker组中
# 检测docker组是否存在
/etc/group, 在这个文件中搜索 docker 关键字
# 将当前用户添加到docker组中
sudo gpasswd -a 当前用户 要添加到的组
sudo gpasswd -a go docker
# 如果不行, 执行下边的命令, 进行组的切换
newgrp - docker
# 重启docker服务器服务
sudo systemctl restart docker
# 解决方案3 -> 电脑重启一次需要设置一次
修改/var/run目录下的docker.sock文件权限
sudo chmod 666 docker.sock
# 启动
sudo systemctl start docker
# 关闭
sudo systemctl stop docker
# 重启
sudo systemctl restart docker
# 查看状态
sudo systemctl status docker
# 查看docker中的所有指令
docker --help
# 命令
$ docker search 镜像名
# 字段关键字
NAME: 镜像的名字
DESCRIPTION: 镜像的描述
STARS: 镜像的下载量
OFFICIAL: 是不是官方的出品的镜像
AUTOMATED: 会不会启动一些脚本之类的程序
获取镜像
# 下载远程仓库(如Docker Hub)中的镜像
$ docker pull 镜像名(search时得到的name字段)
# 下载完成之后, 就存储到了本地的镜像仓库 -> 本地目录
/var/lib/docker
# 重置root用户密码
sudo passwd root
查看镜像
# 命令
# 查看所有的镜像
$ docker images
$ docker image ls
# 查看某个镜像
$ docker images 镜像名
$ docker image ls 镜像名字
# 字段关键字
REPOSITORY: 镜像的名字
TAG: 镜像的版本
IMAGE ID: 镜像ID(==身份证号, 是唯一的)
CREATED: 创建时间
SIZE: 镜像的大小
# 细节
通常在描述一个镜像的时候:
镜像名:tag -> nginx:latest
如果tag的值为latest, 那么latest可以省略不写
nginx == nginx:latest
镜像别名
$ docker tag 现在的名字:tag 别名:tag
# 不同的名字对应的镜像ID相同
# 镜像并没有复制, 只是多了一个名字
删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
- IMAGE: 镜像名/镜像ID
# 如果镜像有别名, 只能够安照 镜像名:tag 进行删除, 不能根据ID进行删除
# 如果镜像有多个名字, 删除任意一个名字, 名字会删除, 镜像还在
# 当镜像只剩下一个名字的时候, 对其进行删除, 镜像就被删除了
镜像导出 -> 镜像备份和分发
# 将本地仓库中的镜像导出的磁盘目录
docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS:
-o, --output string Write to a file, instead of STDOUT
docker save -o 导出之后镜像名字(自己起名) 镜像名
IMAGE: 要导出的镜像
镜像导入
# 将外部镜像, 导入到本地的镜像仓库中
docker load [OPTIONS]
OPTIONS:
-i, --input string
docker load -i 镜像文件的名字
$ docker load < 镜像文件的名字
查看镜像的历史信息
# 制作镜像的时候的操作步骤
docker history
查看镜像的详细信息
# 镜像的属性信息, 以json格式输出的
# https://yq.aliyun.com/articles/230067
docker inspect 镜像名/镜像ID
docker将镜像文件启动, 得到一个容器, 一个容器可以被看做一个操作系统
容器查看
# 命令, 只能看到正在运行的容器的状态
# 启动的每个容器都是一个进程
docker ps
# 相关的头介绍
CONTAINER ID: 容器启动之后的ID, 是唯一的
IMAGE: 当前容器是基于那个镜像启动的
COMMAND: 容器启动之后, 默认执行了什么命令
CREATED: 容器的创建时间
STATUS: 容器当前状态,
created: 容器被创建, 但是不能使用
runing: 运行状态
pause: 暂停状态
exited: 容终止运行, 但是容器还在
PORTS: 映射的端口, 主机和容器直接的端口映射
NAMES: 容器启动之后的名字, 如果没有指定, 会随机生成一个, 这个名字不能重复
参数:
-a, --all: 显示所有容器, 默认只显示running状态的
-q, --quiet: 只显示容器ID
容器创建
# 容器被创建, 但是还不能使用, 需要启动
$ docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS:
-a, --attach list 给容器关联 STDIN, STDOUT or STDERR
-t, --tty: 给容器绑定终端
-i, --interactive: 关联标准输入
--rm: 容器终止运行的时候, 自动被删除
--name string: 手动指定容器的名字
IMAGE: 基于哪个镜像启动容器
COMMAND: 可以不写, 或许写个bash
ARG...: shell命令的参数
容器启动
启动创建的容器
$ docker start [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS:
-a, --attach Attach STDOUT/STDERR and forward signals
-i, --interactive Attach container's STDIN
CONTAINER: 容器名或者容器ID
创建新容器并启动
# 通过一个命令创建容器, 并且启动
# docker run == docker create + docker start
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS:
-d, --detach: 以守护进程的形式运行
-a, --attach list 给容器关联 STDIN, STDOUT or STDERR
-t, --tty: 给容器绑定终端
-i, --interactive: 关联标准输入
--rm: 容器终止运行的时候, 自动被删除
--name string: 手动指定容器的名字
暂停
docker pause CONTAINER [CONTAINER...]
取消暂停
docker unpause CONTAINER [CONTAINER...]
重启
docker restart [OPTIONS] CONTAINER [CONTAINER...]
Options:
-t, --time int: 延时时间, 默认10s
关闭
# 从running -> exited 状态, 容器还在, 有延时
docker stop [OPTIONS] CONTAINER [CONTAINER...]
Options:
-t, --time int: 延时时间, 默认10s
终止
# 从running -> exited 状态, 容器还在, 直接关闭, 没有延时
docker kill [OPTIONS] CONTAINER [CONTAINER...]
Options:
-s, --signal string: 指定发出的信号, 一般不用
删除
进入容器
创建并进入 - 使用频率低
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
$ docker run -it --rm --name myxx ubuntu bash
手动进入
# 创建并启动容器
$ docker run -itd --rm --name myxx ubuntu bash
# 手动进入容器中
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS:
-i, --interactive Keep STDIN open even if not attached
-t, --tty Allocate a pseudo-TTY
CONTAINER: 容器名字/容器ID
COMMAND: shell指令 -> bash
[ARG...]: shell命令的参数
退出容器
# 第一种方式
在终端输入: exit
# 第二种方式: ctrl+D
查看容器的日志信息
# 容器运行一段时间之后, 会生成log日志, 如果没有生成, 是看不到的
docker logs 容器名/容器ID
查看容器的详细信息
# https://yq.aliyun.com/articles/230067
# 查看镜像的详细信息
docker inspect 容器名/容器ID
查看容器的端口信息
# 查看本机和容器的端口映射
docker port 容器名/容器ID
容器重命名
docker rename CONTAINER NEW_NAME
镜像的导出
docker export [OPTIONS] CONTAINER
Options:
-o, --output string: 导出的镜像文件的名字
docker export 容器名/容器ID > 导出的镜像的名字(自己起)
镜像的导入 -> 导入到本地的镜像仓库中
docker import
cat 要导入的镜像文件 | docker import - 新的镜像名:tag
对比
save 和 export
- 使用save导出镜像, 不能对镜像进行修改
- export通过容器导出, 原始镜像可以通过启动容器进行修改
- 通过export导出镜像, 会丢失镜像的历史记录
如果没有通过容器对进行做任何修改, export导出的镜像小
load 和 import
- 都是将导出的镜像导入到本地镜像仓库
- 如果使用load进行导入: 镜像名无法修改
- import导入镜像: 镜像名是可以修改的