Docker学习笔记(一)
Docker简介
Docker理念
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
Docker特点
更快速的应用交付和部署:传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。
更便捷的升级和扩缩容:随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。
更简单的系统运维:应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的bug。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。
更高效的计算资源利用:Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。
Docker的基本组成
***镜像(images)***:Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。
容器(container):可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
仓库(repository):集中存放镜像文件的场所。Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等
Linux安装Docker-CE
Centos官方源安装教程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #安装一些系统必要的工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 #添加软件源信息 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 查/etc/yum.repos.d/docker-ce.repo 中的ur[地址是不是都是阿里云的] vi /etc/yum.repos.d/docker-ce.repo # 如果不是,那么把download-stage.docker.com全部替换为mirrors。aliyun.com/docker-ce/
#更新并安装Docker-CE sudo yum makecache fast sudo yum -y install docker-ce
#使用docker version可以看到client端的信息 docker version
#启动服务器再次使用docker version 就可以看到服务器端和客户端的docker信息了 systemctl start docker
|
Ubuntu安装
1 2 3 4 5 6 7 8 9 10 11 12
| #安装必要的一昨系统工周 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common #安装GPG证书 curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - #写入软件源信息 sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" #更新并安装Docker-CE sudo apt-get -y update sudo apt-get -y install docker-ce #开启Docker服务 sudo service docker start
|
卸载
1 2 3 4
| systemctl stop docker yum remove docker-ce docker-ce-cli containerd.io rm -rf /var/lib/docker rm -rf /var/lib/containerd
|
帮助类命令
1 2 3
| 查看docker概要信息: docker info 查看docker总体帮助文档: docker --help 查看docker命令帮助文档: docker 具体命令 --help
|
Docker加速器的地址
阿里云镜像加速,登录阿里云,进入控制台在产品服务中选择[容器]->[容器镜像服务]->[镜像工具]->[镜像加速器]。找到镜像加速地址。下方有各类操作系统的操作方式。如果没有信息,去实力列表中去创建一个个人实例,个人实例允许创建300个仓库和3个命名空间。

在/etc/docker/daemon.json文件中加入一下内容
1 2 3
| { "registry-mirrors":["https://3703jm2d.mirror.aliyuncs.com"] }
|
或直接使用一下命令
1 2 3 4 5 6 7 8 9
| sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://3703jm2d.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
|
docker比VM虚拟机快的原因
1、docker有着比虚拟机更少的抽象层
由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
2、docker利用的是宿主机的内核,而不需要加载操作系统OS内核
当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引导、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。
Docker核心技术【镜像】
基本概念
镜像是一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等。通过镜像可以创建一个或多个容器
镜像管理
镜像搜索 :docker search,作用搜索Docker Hub(镜像仓库)上的镜像。还不如直接去docker镜像官网直接搜索更加直观。https://hub.docker.com/
1 2 3 4 5 6 7 8
| #命令格式 docker search[OPTIONS] imagename #命令参数 -f, --filter filter #根据提供的格式筛选结果 --format string #利用Go语言的format格式化输出结果 --limit int #展示最大的结果数,默认25个 --no-trunc #内容全部显示 docker search centos
|
镜像查看:docker images/docker image ls,作用列出本地镜像。
1 2 3 4 5 6 7 8
| #命令格式:. docker images[OPTIONS][REPOSITORY[:TAG]] 或者 docker image ls [OPTIONS][REPOSITORY[:TAG]] #命令参数(OPTIONS): -a,--all #展示所有镜像(默认隐藏底层的镜像) --no-trunc #不缩略显示 -q,--quiet #只显示镜像ID
docker images ubuntu #理解镜像名字是Ubuntu的镜像 【同样支持模糊匹配】
|
镜像拉取:docker pull ,作用下载远程仓库(如Docker Hub )中的镜像。
1 2 3 4 5
| #命令格式: docker pull [OPTIONS] NAME[:TAG@DIGEST] #命令参数(OPTIONS): -a,--all-tags #下载所有符合给定tag的镜像 docker pull nginx:latest
|
镜像删除:docker rmi/docker image rm,作用将本地的一个或多个镜像删除。
1 2 3 4 5 6 7 8 9 10
| #命令格式: docker rmi[OPTIONS] IMAGE[IMAGE...]或者 docker image rm [OPTIONS]IMAGE[IMAGE...] #命令参数(OPTIONS): -f,--force #强制删除
docker rmi [image_id/imagename] #ps 生产环境别乱执行删除命令 docker rmi -f 镜像ID #删除单个 docker rmi -f 镜像名1:tag 镜像名2:tag #删除多个 docker rmi -f $(docker images -qa) #删除全部
|
查看镜像/容器/数据卷所占的空间:docker system df
1 2 3 4 5
| #命令格式 docker system df [OPTIONS] #命令参数(OPTIONS): --format #格式化输出 -v #显示空间使用的详细情况
|
docker虚悬镜像:仓库名、标签都是的镜像,俗称虚悬镜像dangling image
Docker核心技术【容器】
基本操作
新建+启动容器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #命令格式 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] #OPTIONS说明(常用):有些是一个减号,有些是两个减号 --name="容器新名字" #为容器指定一个名称; -d: #后台运行容器并返回容器ID,也即启动守护式容器(后台运行); -i:#以交互模式运行容器,通常与 -t 同时使用; -t:#为容器重新分配一个伪输入终端,通常与 -i 同时使用;也即启动交互式容器(前台有伪终端,等待交互); -P: #随机端口映射,大写P -p: #指定端口映射,小写p #例: docker run -it centos /bin/bash #参数说明: -i: #交互式操作。 -t: #终端。 centos:centos镜像。 /bin/bash:#放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。要退出终端,直接输入 exit:
|
列出当前所有正在运行的容器:
1 2 3 4 5 6 7
| #命令格式 docker ps [OPTIONS] #OPTIONS说明(常用): -a: #列出当前所有正在运行的容器+历史上运行过的 -l: #显示最近创建的容器。 -n: #显示最近n个创建的容器。 -q: #静默模式,只显示容器编号。
|
退出容器的两种方法:
exit: run进去容器,exit退出,容器停止
ctrl+p+q: run进去容器,ctrl+p+q退出,容器不停止
容器启停操作
1 2 3 4
| docker start 容器ID或者容器名 #启动已停止运行的容器 docker restart 容器ID或者容器名 #重启容器 docker stop 容器ID或者容器名 #停止容器 docker kill 容器ID或容器名 #强制停止容器
|
删除容器(生产环境谨慎操作):
1 2 3 4 5
| docker rm 容器ID #正在运行中的容器不可删除。 #一次性删除多个容器实例 docker rm -f $(docker ps -a -q) docker ps -a -q | xargs docker rm
|
案例
有镜像才能创建容器,这是根本前提(下载一个Redis6.0.8镜像)
启动守护式容器(后台服务器):在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的后台运行模式。
很重要一点: Docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即停止因为他觉得他没事可做了。
前台交互式启动:
1
| docker run -it redis:6.0.8
|
后台守护式启动
1
| docker run -d redis:6.0.8
|
查看容器日志
查看容器内运行的进程
查看容器内部细节
进入正在运行的容器并以命令行交互
1 2
| docker exec -it 容器ID bashShell 重新进入docker attach 容器ID
|
上述两者的区别
attach 直接进入容器启动命令的终端,不会启动新的进程用exit退出,会导致容器的停止。
exec 是在容器中打开新的终端,并且可以启动新的进程用exit退出,不会导致容器的停止。
推荐使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。
进入redis服务
1 2
| docker exec -it 容器ID /bin/bash docker exec -it 容器ID redis-cli
|
一般用-d后台启动的程序,再用exec进入对应容器实例。
从容器内拷贝文件到主机上
1 2
| #容器→主机 docker cp 容器ID:容器内路径 目的主机路径
|
导入和导出容器
1 2 3 4 5 6
| export #导出容器的内容留作为一个tar归档文件[对应import命令] import #从tar包中的内容创建一个新的文件系统再导入为镜像[对应export] docker export 容器ID > 文件名.tar cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 docker save -o <文件名> <镜像名>:<标签> docker load -i 文件名.tar
|
通过导入导出和拷贝命令,可以对容器内数据经行备份。save和load是一组命令,export和import是一组命令,不要混用.
常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| attach # 当前 shell 下 attach 连接指定运行镜像 build # 通过 Dockerfile 定制镜像 commit # 提交当前容器为新的镜像 cp #从容器中拷贝指定文件或者目录到宿主机中 create # 创建一个新的容器,同 run,但不启动容器 diff # 查看 docker 容器变化 events # 从 docker 服务获取容器实时事件 exec # 在已存在的容器上运行命令 export # 导出容器的内容流作为一个 tar 归档文件[对应 import ] history # 展示一个镜像形成历史 images # 列出系统当前镜像 import # 从tar包中的内容创建一个新的文件系统映像[对应export] info # 显示系统相关信息 inspect # 查看容器详细信息 kill # kill 指定 docker 容器 load # 从一个 tar 包中加载一个镜像[对应 save] login # 注册或者登陆一个 docker 源服务器 logout # 从当前 Docker registry 退出 logs # 输出当前容器日志信息 port # 查看映射端口对应的容器内部源端口 pause # 暂停容器 ps # 列出容器列表 pull # 从docker镜像源服务器拉取指定镜像或者库镜像 push # 推送指定镜像或者库镜像至docker源服务器 restart # 重启运行的容器 rm # 移除一个或者多个容器 rmi # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除] run # 创建一个新的容器并运行一个命令 save # 保存一个镜像为一个 tar 包[对应 load] search # 在 docker hub 中搜索镜像 start # 启动容器 stop # 停止容器 tag # 给源中镜像打标签 top # 查看容器中运行的进程信息 unpause # 取消暂停容器 version # 查看 docker 版本号 wait # 截取容器停止时的退出状态值
|