目录
docker pull : 从镜像仓库中拉取或者更新指定镜像
docker search : 从Docker Hub查找镜像
docker system df 查看镜像/容器/数据卷所占的空间
3.3.1 docker run创建一个新的容器并运行一个命令
6.3.1 docker hub上拉取redis镜像到本地标签为6.0.8
9.2通过dockerfile发布微服务部署到docker容器
1.Docker介绍
1.1 简介:
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”
解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术。
1.2 Docker的应用场景
Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
1.3 Docker 的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
1.4 Docker 架构
Docker包括三个基本概念:
- 镜像(Image):
Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):
仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker和虚拟机区别:
作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有如下显著优势:
Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式(数分钟)要快得多;
Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器(在IBM服务器上已经实现了同时运行10K量级的容器实例);
Docker通过类似Git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新;
Docker通过Dockerfile支持灵活的自动化创建和部署机制,以提高工作效率,并标准化流程。
Docker容器除了运行其中的应用外,基本不消耗额外的系统资源,在保证应用性能的同时,尽量减小系统开销。传统虚拟机方式运行N个不同的应用就要启用N个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker只需要启动N个隔离得“很薄的”容器,并将应用放进容器内即可。应用获得的是接近原生的运行性能。
使用Docker容器技术与传统虚拟机技术的各种特性,可见容器技术在很多应用场景下都具有巨大的优势(如下图所示)
2.Docker安装
2.1 CentOS Docker 安装
Docker 支持以下的 64 位 CentOS 版本:
CentOS 7
CentOS 8
更高版本...
2.2卸载旧版本
较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine |
2.3设置仓库
安装所需的软件包。yum-utils 提供了 yum-config-manager
yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 |
设置稳定的仓库。
使用官方源地址(比较慢)
yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo |
阿里云
yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
清华大学源
yum-config-manager \ --add-repo \ https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo |
2.4安装Docker
安装最新版docker
yum install docker-ce docker-ce-cli containerd.io |
docker-ce 容器引擎-服务器端
docker-ce-cli docker客户点命令行
containerd.io 底层用来启动容器的
安装指定版本Docker
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io |
2.5启动docker
开机自启动
systemctl enable docker |
启动docker
systemctl start docker |
HelloWorld程序
docker run hello-world |
查看版本
docker version |
2.6卸载docker
删除安装包:
yum remove docker-ce |
删除镜像、容器、配置文件等内容:
rm -rf /var/lib/docker |
2.7 docker镜像加速
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
科大镜像:https://docker.mirrors.ustc.edu.cn/
网易:https://hub-mirror.c.163.com/
阿里云:https://<你的ID>.mirror.aliyuncs.com
七牛云加速器:https://reg-mirror.qiniu.com
当配置某一个加速器地址之后,若发现拉取不到镜像,请切换到另一个加速器地址。国内各大云服务商均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务。
请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):
{"registry-mirrors":["https://reg-mirror.qiniu.com/"]} |
之后重新启动服务:
$ sudo systemctl daemon-reload $ sudo systemctl restart docker |
3.Docker常用命令
3.1帮助启动类命令
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 –help
3.2镜像命令
docker images : 列出本地镜像
docker pull : 从镜像仓库中拉取或者更新指定镜像
docker rmi : 删除本地一个或多个镜像。
docker search : 从Docker Hub查找镜像
docker system df 查看镜像/容器/数据卷所占的空间
docker commit: 从容器创建一个新的镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker push: 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker push [OPTIONS] NAME[:TAG]
3.3容器命令
有镜像才能创建容器, 这是根本前提(下载一个CentOS或者ubuntu镜像演示)
docker pull centos
docker pull ubuntu
3.3.1 docker run创建一个新的容器并运行一个命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] |
OPTIONS说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷
示例: 使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it centos /bin/bash |
参数说明: -i: 交互式操作。 -t: 终端。 centos : centos 镜像。 /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。 要退出终端,直接输入 exit: |
3.3.2 docker ps 列出当前所有正在运行的容器
docker ps [OPTIONS]
OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
退出容器:
两种退出方式
exit
run进去容器,exit退出,容器停止
ctrl+p+q
run进去容器,ctrl+p+q退出,容器不停止
3.3.4启动已停止运行的容器
docker start 容器ID或者容器名
3.3.5重启容器
docker restart 容器ID或者容器名
3.3.6停止容器
docker stop 容器ID或者容器名
3.3.7强制停止容器
docker kill 容器ID或容器名
3.3.8删除已停止的容器
docker rm 容器ID
3.3.9一次性删除多个容器实例
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
3.3.10重要
启动守护式容器(后台服务器)
在大部分的场景下,我们希望 docker 的服务是在后台运行的, 我们可以过 -d 指定容器的后台运行模式
docker run -d 容器名
redis 前后台启动演示
前台交互式启动
docker run -it redis:6.0.8
后台守护式启动
docker run -d redis:6.0.8
3.3.11查看容器日志
docker logs 容器ID
3.3.12查看容器内运行的进程
docker top 容器ID
3.3.13查看容器内部细节
docker inspect 容器ID
3.3.14进入正在运行的容器并以命令行交互
docker exec -it 容器ID bashShell
docker attach 容器ID
exec和attcah区别
attach 直接进入容器启动命令的终端,不会启动新的进程 用exit退出,会导致容器的停止。
exec 是在容器中打开新的终端,并且可以启动新的进程 用exit退出,不会导致容器的停止
推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止
用之前的redis容器实例进入试试
进入redis服务
docker exec -it 容器ID /bin/bash
docker exec -it 容器ID redis-cli
一般用-d后台启动的程序,再用exec进入对应容器实例
3.3.15从容器内拷贝文件到主机上
- 容器→主机
docker cp 容器ID:容器内路径 目的主机路径
- 主机→容器
docker cp 目的主机路径 容器ID:容器内路径
3.3.16导入和导出容器
导出:如果要导出本地某个容器,可以使用 docker export 命令。
docker export 1e560fca3906 > ubuntu.tar
docker export 容器ID > 文件名.tar |
导入:可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 |
4.Docker镜像
4.1镜像是什么?
镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
4.2分层的镜像
4.3Docker镜像commit
docker commit提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
案例演示ubuntu安装vim
1.从Hub上下载ubuntu镜像到本地并成功运行
2.原始的默认Ubuntu镜像是不带着vim命令的
3.外网连通的情况下,安装vim,docker容器内执行上述两条命令
4.安装完成后,commit我们自己的新镜像
docker commit -m="add vim cmd" -a="xxxxx" 容器ID 要创建的目标镜像名:[标签名]
5.启动我们的新镜像并和原来的对比
官网是默认下载的Ubuntu没有vim命令
自己commit构建的镜像,新增加了vim功能,可以成功使用。
4.4总结:
Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承于一个Base基础类,自己再按需扩展。
新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层
4.5镜像推送远程仓库
4.5.1本地镜像发布到阿里云
4.5.2私有仓库创建
Docker Registry
Docker Registry是官方提供的工具,可以用于构建私有镜像仓库
下载镜像Docker Registry
docker pull registry
运行私有库Registry,相当于本地有个私有Docker hub
docker run -d -p 5000:5000 -v /home/myregistry/:/var/lib/registry --privileged=true
--name myregistry registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调
上传本地镜像到私有仓库
curl验证私服库上有什么镜像
curl -XGET http://hostIp:5000/v2/_catalog
将镜像修改符合私服规范的Tag
按照公式: docker tag 镜像:Tag Host:Port/Repository:Tag
使用命令 docker tag xxxx:1.2 这个镜像修改为hostIP:5000/zzzz:1.2
修改配置文件使之支持http
vim /etc/docker/daemon.json
添加红色部分内容,hostIP注意修改为正确的ip
{ "registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"], "insecure-registries": ["hostIP:5000"] } |
docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====> 修改完后如果不生效,建议重启docker
push推送到私服库
docker push hostIP:5000/zzzzz:1.2
再次验证仓库内容
curl -XGET http://hostIp:5000/v2/_catalog
私有仓库web页面
Harbor 依赖类似redis、mysql、pgsql等很多存储系统,所以它需要编排很多容器协同起来工作,因此在部署和使用时,需要借助于Docker的单机编排工具(Docker compose)来实现。
5.Docker容器数据卷
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
将docker容器内的数据保存进宿主机的磁盘中
运行一个带有容器卷存储功能的容器实例
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
5.1作用
将应用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能保存数据在docker中我们使用卷
5.2特点
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接实时生效,爽
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
5.3案例
5.3.1宿主vs容器之间映射添加容器卷
命令:
docker run -it -v /宿主机目录:/容器内目录 ubuntu /bin/bash
查看数据卷是否挂载成功
docker inspect 容器ID
5.3.2容器和宿主机之间数据共享
1: docker修改,主机同步获得
2: 主机修改,docker同步获得
3: docker容器stop,主机修改,docker容器重启看数据是否同步。
5.3.3读写规则映射添加说明
读写(默认)-rw
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
只读-ro
容器实例内部被限制,只能读取不能写
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
5.3.4卷的继承和共享
第一步:容器1完成和宿主机的映射
docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu
第二步:容器2继承容器1的卷规则
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
第三步:验证
- 宿主机修改——》容器1和容器2都变化
- 容器1修改——》宿主机和容器2都变化
- 容器2修改——》宿主机和容器1都变化
- 容器1删除——》宿主机和容器2如何变化
6.Docker常规安装
6.1安装tomcat
查找 Docker Hub 上的 Tomcat 镜像:
此外,我们还可以在控制台使用 docker search tomcat 命令来查看可用版本:
6.1.1拉取官方镜像
docker pull tomcat
查看本地镜像
docker images|grep tomcat
6.1.2使用 tomcat 镜像运行容器
docker run --name tomcat -p 8080:8080 -v /usr/local/tomcat:/usr/local/tomcat -d tomcat |
-p 8080:8080: 将主机的 8080 端口映射到容器的 8080 端口。
-v /usr/local/tomcat:/usr/local/tomcat:将主机目录挂载到容器目录。
查看容器启动情况
docker ps
访问tomcat首页:
使用-P
-P 大写,随机分配端口