前言:
接触 docker 已经有不少时间了,平时有用到,说一下个人感悟:docker 涉及到的常用命令也就20个左右(可以参考 记录Docker容器启动 SpringBoot 应用过程_清泉影月-CSDN博客),部署、实施、运维相关工程师用的会多一些。主要解决的问题是应用部署的环境隔离,尤其是各种应用对底层的资源依赖存在冲突的情况。
一、docker 历史
1. 2010 年若干人在旧金山成立 dotCloud 公司;
2. 2013 年迫于市场和生存压力将 dotCloud 核心引擎开源,该引擎就是 docker;
3. 2016 年国际科技公司,Amazon、Google、IBM、Red Hat、Microsoft 等均支持 docker 技术;
4. 2018年国内互联网公司逐步采用 docker 技术,其中云计算使用最普遍......
二、docker 和虚拟机
虚拟机和 docker 最明显的差别是虚拟机必须要操作系统,而 docker 内不需要安装操作系统;docker 技术不是在 OS 外建立虚拟环境,而是在 OS 内的核心系统层来打造虚拟执行环境,通过共享宿主机 OS 的做法,取代 OS 的功用。
虚拟机从操作系统层下手,目标是建立一个可以用来执行整套操作系统的沙盒独立执行环境。而 docker 则是直接将一个应用所需的相关代码、函式库、环境配置文件都打包起来建立沙盒执行环境。
从隔离上来讲,虚拟机是进行硬件资源划分的完美解决方案,它利用了硬件虚拟技术,通过 Hypervisor 层实现对资源的彻底隔离;而容器则是操作系统级别的虚拟化,利用内核的特性实现,不需要外部辅助。
特性 | docker | 虚拟机 |
磁盘空间 | 小,甚至几十 KB | 大,一般 GB 数量级 |
启动速度 | 秒级别 | 分钟级别 |
运行形态 | 运行于宿主机内核,容器共享宿主机内核 | 运行于Hypervisor 上 |
并发 | 一台宿主机可以启上千个容器 | 两位数数量级 |
资源利用率 | 高 | 低 |
隔离性 | 安全隔离 | 完全隔离 |
三、docker 的几个概念
1. 镜像(image)
Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。甚至可以再一个镜像基础上再加一层配置就可以构建一个新的镜像。
2. 容器
Docker 容器是从镜像启动产生的,可以简单理解为动态的 docker 镜像。容器可以进行一些 linux 操作,可以启动应用,也可以转变成镜像(后话)。
3. 仓库
docker 仓库就是存储镜像的仓库,跟代码仓库类似。
公共 docker 仓库地址:https://hub.docker.com
四、docker 安装
当前 docker 支持的 OS 有 linux、windows、mac os、部分单片机。(以下 linux 为例)
官方有提供 linux 下一键安装 docker 的脚本:
稳定版:
curl -sSL https://get.docker.com/ | sh
测试版:
curl -sSL https://test.docker.com/ | sh
实验版:
curl -sSL https://experimental.docker.com/ | sh
或者在 linux 下执行安装命令:
安装docker
yum install docker-ce
五、docker 命令
如果对命令的参数有需求可以使用 [docker命令] --help 需求帮助。
1. docker 服务
启动docker:
service start docker
重启docker:
service restart docker
停止docker:
service stop docker
docker 状态查看:
service status docker
docker 信息查看:
docker info
docker 版本:
docker version
2. docker 镜像
镜像查询:
docker search 关键字
镜像获取:
docker pull 镜像名
本地镜像查看:
docker images
镜像删除:
docker rmi [镜像ID 或者 镜像名:tag]
查看镜像历史:
docker history [option] 镜像名
导出镜像(文件一般为.tar,偶尔.tar.gz):
docker save -o [文件] [镜像名:tag]
或者
docker save [镜像名:tag] > [文件]
导入镜像:
docker load -i [文件]
或者
docker load < [文件]
构建镜像(从Dockerfile 构建):
docker build [OPTIONS] PATH | URL | -
-c:控制cpu使用
-f:选择Dockerfile
-m:设置构建内存上限
-q:不显示构建过程的信息
-t:为构建镜像打标签
eg:
docker build -f Dockerfile -t centos8-jdk8 .
构建镜像(从容器构建):
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a:添加作者信息
-c:修改 Dockerfile 命令
-m:添加提交信息
-p:暂停 commit 操作
eg:
docker commit -a 'qingquanyingyue' -m '测试' myalpine myalpine:1.0
eg,search 本质上是去 docker hub 上查询
点开 docker hub 的链接可以看到 docker 拉取命令
3. docker 账号
docker 账号是 docker hub 为了方便用户拉取或发布镜像而存在的账号。
登录 docker 账号:
docker login
登出 docker 账号:
docker logout
打tag:
docker tag 需要上传的镜像[:TAG] [docker hub 注册的账号名]/镜像名[:TAG]
推送镜像到 docker hub 仓库:
docker push [docker hub 注册的账号名]/镜像名[:TAG]
账号登录登出操作截图:
打 tag 和推送镜像操作截图:
docker hub 查看推送的镜像:
4. docker 容器
查看宿主机 docker 服务状态:
docker stats
查看活着的容器:
docker ps
查看所有容器:
docker ps -a
创建容器(只创建不启动),参数非常多可通过 docker create --help 查看:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
eg:
docker create --name [容器名字] -it -p [宿主机port]:[容器port] -v [宿主机目录]:[容器目录] [镜像ID]
创建并启动容器,参数非常多可通过 docker run--help 查看:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
eg:
docker run --name [容器名字] -itd -p [宿主机port]:[容器port] -v [宿主机目录]:[容器目录] [镜像ID] /bin/bash
热更新容器(例如,cpu、内存,配置无法更新):
docker update [OPTIONS] CONTAINER [CONTAINER...]
容器重命名:
docker rename [旧名] [新名]
删除容器:
docker rm [容器ID/容器名]
停止容器:
docker stop [容器ID/容器名]
强杀容器(停止容器失效可使用):
docker kill [容器ID/容器名]
启动容器:
docker start [容器ID/容器名]
重启容器:
docker restart [容器ID/容器名]
查看容器正在运行的进程:
docker top [容器ID/容器名]
暂停/恢复容器进程:
docker pause/unpause [容器ID/容器名]
查看端口映射:
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
查看容器详细信息:
docker inspect [容器ID/容器名]
查看容器日志:
docker logs [容器ID/容器名]
进入容器(attach)
注意:attach 退出不可使用exit或者 ctrl+c,会导致容器停止;先使用ctrl+p 再使用 ctrl+q 可避免
docker attach [容器ID/容器名]
进入容器并执行操作:
-d:后台执行
-i:交互模式
-t:分配一个TTY(执行窗口)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
eg:
docker exec -d [容器ID/容器名] sh -c "cd /apps;nohup java -jar test.jar"
复制文件:
容器 -> 宿主机
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
宿主机 -> 容器
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
eg:把宿主机 Dockerfile 文件复制到 myalpine 容器的 /apps/ 下
docker cp Dockerfile myalpine:/apps/
查看容器跟镜像的区别(只显示文件区别):
docker diff [容器ID/容器名]
查看容器事件(显示当前其他服务端的操作,例如镜像/容器创建、停止、启动等):
docker events [OPTIONS]
-f:过滤器
eg:显示所有事件
docker events
eg:查看容器 alpine-glibc 事件
docker events -f container=alpine-glibc
导出容器(跟导出镜像用法类似):
docker export [OPTIONS] CONTAINER
导入容器(跟导入镜像用法类似):
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]