目录
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 总结
1. docker基础
1. 1 docker介绍
-
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
-
收费的, 企业版
-
-
1.2 docker架构与核心组件
-
docker架构
-
客户端
-
linux终端, 用来操作docker指令
-
-
docker服务器
-
守护进程 -> 有一个应用程序, 没有操作终端
-
不能和用户进行交互
-
输入
-
输出
-
-
在后台周期性的执行某些操作
-
-
管理docker容器和docker镜像
-
-
docker镜像
-
一些操作系统磁盘文件
-
nginx镜像
-
有一个操作系统, 上边安装了nginx
-
-
ubuntu镜像
-
redis镜像
-
用户可以自己制作, 也可以从官方下载
-
-
docker容器
-
通过docker操作命令可以磁盘上的docker镜像启动, 启动之后就是docker容器
-
容器中运行的是一个操作系统
-
-
-
镜像仓库
-
docker hub -> 官方提供的镜像仓库
-
-
1.3 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-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安装完成之后, 启动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.4 权限问题
$ 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
1.5 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: 会不会启动一些脚本之类的程序
-
获取镜像
# 下载远程仓库(如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
2.2 镜像别名/删除
-
镜像别名
$ docker tag 现在的名字:tag 别名:tag # 不同的名字对应的镜像ID相同 # 镜像并没有复制, 只是多了一个名字
-
删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...] - IMAGE: 镜像名/镜像ID # 如果镜像有别名, 只能够安照 镜像名:tag 进行删除, 不能根据ID进行删除 # 如果镜像有多个名字, 删除任意一个名字, 名字会删除, 镜像还在 # 当镜像只剩下一个名字的时候, 对其进行删除, 镜像就被删除了
2.3 镜像的导入导出
-
镜像导出 -> 镜像备份和分发
# 将本地仓库中的镜像导出的磁盘目录 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 < 镜像文件的名字
2.4 镜像的历史和详细信息
-
查看镜像的历史信息
# 制作镜像的时候的操作步骤 docker history
-
查看镜像的详细信息
# 镜像的属性信息, 以json格式输出的 # https://yq.aliyun.com/articles/230067 docker inspect 镜像名/镜像ID
2.6 总结
3. docker容器管理
docker将镜像文件启动, 得到一个容器, 一个容器可以被看做一个操作系统
3.1 容器的查看/创建/启动
-
容器查看
# 命令, 只能看到正在运行的容器的状态 # 启动的每个容器都是一个进程 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: 手动指定容器的名字
-
3.2 容器的暂停/重启
-
暂停
docker pause CONTAINER [CONTAINER...]
-
取消暂停
docker unpause CONTAINER [CONTAINER...]
-
重启
docker restart [OPTIONS] CONTAINER [CONTAINER...] Options: -t, --time int: 延时时间, 默认10s
3.3 容器的关闭/终止/删除
-
关闭
# 从running -> exited 状态, 容器还在, 有延时 docker stop [OPTIONS] CONTAINER [CONTAINER...] Options: -t, --time int: 延时时间, 默认10s
-
终止
# 从running -> exited 状态, 容器还在, 直接关闭, 没有延时 docker kill [OPTIONS] CONTAINER [CONTAINER...] Options: -s, --signal string: 指定发出的信号, 一般不用
-
删除
-
删除未运行的容器 -> 状态 非 running(up)
docker rm 容器名/容器ID
-
删除运行的容器
docker rm 容器名/容器ID -f -f: 强制删除容器
-
批量删除容器
docker rm $(docker ps -aq) -f docker rm `docker ps -aq` -f
-
3.4 容器的进入/退出
-
进入容器
-
创建并进入 - 使用频率低
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
3.5 容器的日志/信息/端口/重命名
-
查看容器的日志信息
# 容器运行一段时间之后, 会生成log日志, 如果没有生成, 是看不到的 docker logs 容器名/容器ID
-
查看容器的详细信息
# https://yq.aliyun.com/articles/230067 # 查看镜像的详细信息 docker inspect 容器名/容器ID
-
查看容器的端口信息
# 查看本机和容器的端口映射 docker port 容器名/容器ID
-
容器重命名
docker rename CONTAINER NEW_NAME
3.6 基于容器的镜像导入导出
镜像的导出
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导入镜像: 镜像名是可以修改的