导图社区 docker详细介绍
docker入门到使用详细介绍,从理论到实操都在这张思维导图里。
编辑于2020-09-20 14:48:15docker
介绍
是什么
Docker是基于Go语言实现的云开源项目
通过对应用组件的封装,分发,部署,运行等生命周期的管理,使用户的app(web应用,数据库应用)及其运行环境能够做到"一次封装,到处运行"
将应用运行在docker容器上面,而docker容器在任何操作系统上都是一致的,这就实现了跨平台,跨服务器. 只需要一次配置好环境,换到别的机子上就可以一键部署好,大大的简化了操作.
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
能干嘛
原来的虚拟机技术 软硬件一起模拟 资源占用多 冗余步骤多 启动慢
虚拟机缺点 Linux发展出另一种虚拟化技术 : Linux容器
Linux容器不是模拟一个完整的操作系统,而是对进程进行了隔离. 有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中. 容器与虚拟机不同,不需要捆绑一整套操作系统, 只需要软件工作所需的库资源和设置. 系统因此而变得高效轻量并保证部署在任何环境中的软件都始终如一的运行
Docker和传统虚拟化方式
传统虚拟机技术是虚拟一套硬件后,在其上运行一个完整的操作系统,在该系统上再运行所需应用进程
而容器内的应用进程直接运行于宿主的内核,容器没有自己的内核,而且也没有进行硬件虚拟, 因此容器要比传统虚拟机更为轻便
每个容器之间相互隔离,每个容器有自己的文件系统,容器之间不会相互影响,能区分计算资源
开发/运维(DevOps)
一次构建,随处运行
更快速的应用交付和部署
更快速的升级和扩缩容
更简单的系统运维
更高效的计算资源利用
Why Docker
更轻量
基于容器或虚拟技术,仅包含业务运行所需的runtime环境,CentOS基础镜像仅179M;宿主机可以部署100~1000个容器
更高效
无操作系统虚拟化开销
更敏捷 更灵活
分层的储存和包管理,devops理念
安装
docker基本组成
镜像(image)
对象Java类 是一个只读的模板。镜像可以用来创建docker容器 ,一个镜像可以创建很多容器
容器(container)
对应Java对象 容器是用对象创建的运行实例 他可以被启动 开始 停止 删除。每个容器都是相互隔离的,保证安全的平台
仓库(repository)
仓库是集中存放镜像文件的场所 仓库 和 仓库注册服务器 是有区别的 仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签
总结
docker本身是一个容器运行载体或者称之为管理引擎. 我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个运行环境既是image镜像文件. 只有通过这个镜像文件才能生成docker容器. image文件可以看做是容器的模板. docker根据image文件生成容器实例, 同一个image文件,可以生成多个同时运行的容器实例
image文件生成容器实例,本身也是一个文件 镜像文件
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
仓库 即是放了一堆镜像文件的地方,我们可以把镜像文件发布到仓库中,需要的时候从仓库中拉下来.
架构图
说明
CentOS6.5(64-bit)或更高版本
系统内核版本2.6.32-431或更高版本
uname -r 命令 当前系统相关信息(内核版本 硬件构架 主机名称 操作系统) 2.6.32-642. e16. x86_64
docker run hello-world
run干了什么
安装步骤
CentOS6.8安装
1、yum install -y epel-release
2、yum install -y docker-io
3、安装后配置文件: /etc/sysconfig/docker
CentOS7.0++ 配置文件 :/etc/docker/daemon.json
4、启动docker后台服务: service docker start
5、docker version 验证
阿里云镜像加速
注册自己的阿里云账号
获得加速器地址链接
配置本机docker运行镜像加速器
CentOS6.8版 配置文件 [/etc/sysconfig/docker] other_args="--registry-mirror=加速器地址"
CentOS7.0++版 配置文件[/etc/docker/daemon.json] 粘贴json串 : {"registry-mirrors":["加速器地址"]}
执行 : systemctl daemon-reload
执行 : systemctl restart docker
重新启动docker后台服务: service docker restart
Linux系统下配置完加速器检查是否生效
ps -ef |grep docker
常用命令
帮助命令
docker version
docker info
docker --help
镜像命令
docker images
列出本地主机上的镜像
OPTIONS(参数)说明
-a 列出本地所有镜像(含中间层)
-q 只显示镜像ID
--digests 显示镜像的摘要信息
--no-trunc 显示完整的镜像信息
docker search 镜像名字
网站
命令
docker search [OPTIONS] 镜像名字
OPTIONS说明
--no-trunc 显示完整的镜像描述
-s 列出收藏数不小于指定值得镜像
docker search -s 30 tomcat
--automated(自动构建) 只列出automated build类型的镜像
docker pull 镜像名字
下载镜像 从镜像仓库
docker pull 镜像名字[:TAG]
docker pull tomcat 等同于 docker pull tomcat:latest 最新版
docker rmi 镜像名字ID
删除镜像
docker rmi hello-world 等同于 docker rmi hello-world:latest 最新版
删除单个
docker rmi -f 镜像ID
删除多个
docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部
docker rmi -f $(docker images -qa)
容器命令
有镜像才能创建容器,这是根本前提(下载一个centOS镜像演示)
docker pull centos
新建并启动容器
docker run -it --name myCentOS centos 取别名
docker run [OPTIONS] image名 [COMMAND] [ARG...]
OPTIONS说明
--name="容器新名字" :为容器指定一个名称
-d :后台运行容器.并返回容器ID,也即启动守护式容器
-i :以交互模式运行容器,通常与 -t 同时使用
docker run -it centos 以centos为镜像 创建了个容器 并进入到容器中
-t :为容器重新分配一个伪输入终端,通常与 -i 同时使用
-P :随机端口映射
-p :指定端口映射
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
启动交互式容器
docker run -it -p 8989:8080 tomcat 启动tomcat 会有一堆的日志文件 localhost:8989 可访问页面
docker images #使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。 docker run -it centos /bin/bash
列出当前所有正在运行的容器
docker ps [OPTIONS]
-a 列出当前正在运行的容器+历史上运行过的容器
-l 显示最近创建的容器
-n 显示最近n个创建的容器
docker -n 2
-q 静默模式,只显示容器编号
--no-trunc 不截断输出
退出容器
exit
容器停止退出
Ctrl+P+Q
容器不停止退出
启动容器
docker start 容器ID或容器名
重启容器
docker restart 容器ID或容器名
停止容器
docker stop 容器ID或容器名
强制停止容器
docker kill 容器ID或容器名
删除已停止容器
docker rm 容器ID
一次删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
重要
启动守护式容器
docker run -d -p 6666:8080 tomcat localhost:6666 依旧可访问 没有一堆日志文件 只是返回 个 容器ID (container ID)
docker run -d 容器名
docker容器后台运行,必须有一个前台进程,如果不是那些一直挂起的命令(eg: top ,tail),就会自动退出 所以 搞个前台进程 : docker run -d centos /bin/sh -c "while true; do echo hello;sleep 2; done" 每隔2秒打印hello
#使用镜像centos:latest以后台模式启动一个容器 docker run -d centos 注意:docker ps -a 查看发现容器已经退出 说明:docker容器后台运行,必须有一个前台进程,容器运行的命令如果不是一直挂起的命令(eg:top、tail),就会自动退出 这是docker机制问题,以Nginx为例,通常我们启动服务即可,eg:service nginx start 但是,这样做,Nginx为后台进程模式运行,就会导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀。 所以,最佳的方案是:将你要运行的程序以前台进程的形式运行。
查看容器日志
docker logs -f -t --tail 容器ID
-t 显示时间戳
--tail 数字 显示最后多少条
docker logs -t -f --tail 3 容器ID
-f 动态日志打印
查看容器内运行的进程
docker top 容器ID
查看容器内部细节[返回json格式数据]
docker inspect 容器ID
进入正在运行的容器并以命令行交互
docker exec -it 容器id /bin/bash
docker ps #拿到容器id #容器外边直接执行命令 docker exec -it 容器id ls -l /tmp #先进容器实例,再执行命令 docker exec -it 容器id /bin/bash ls -l /tmp
docker attach 容器id
#进入容器实例中,再执行命令 docker attach 容器id ls -l
区别
exec 进入容器实例中或容器外边打开新的终端,并且可以启动新的进程
attach 直接进入容器实例,启动命令终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
镜像
是什么
镜像是一种轻量级, 可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件
UnionFS(联合文件系统)
一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
docker镜像加载原理
分层的镜像
为什么docker镜像要采用这种分层结构呢?
资源共享
特点
docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”
docker镜像commit操作补充
docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]] 提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
案例:从Hub上下载Tomcat镜像到本地并运行成功
docker run -it -p 8888:8080 tomcat
localhost:8888 就可以访问 Tomcat 欢迎页
-p 主机端口:docker容器端口
-P 随机分配端口
-i 交互
-t 终端
docker run -it -P tomcat
#随机分配端口 docker run -it -P tomcat #查看当前运行的容器【PORTS列 0.0.0.0:32768->8080/tcp】 #外部端口32768,通过该端口访问。 8080容器端口 docker ps
故意删除8888镜像生产tomcat容器的文档(tomcat/webapps下的docs)
1、docker ps #容器id 2、docker exec -it 容器id /bin/bash #进入容器实例 3、cd webapps 4、ls -l 5、rm -rf docs 6、localhost:8888/docs 显示404
即 当前tomcat运行实例是一个没有文档的运行实例,以他为模板commit一个没有docs的tomcat新镜像 wwj/tomcat02
docker ps -l #显示最近创建的容器 docker commit -m="del tomcat dosc" -a="wwj" 容器id wwj/tomcat02:1.2
启动新镜像和原来的对比
新 :docker run -it -p 9999:8080 wwj/tomcat:1.2 没docs
原 :docker run -it -p 8989:8080 tomcat 有docs
容器数据卷
是什么?
docker理念
将运用于运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
容器之间希望有可能共享数据
docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据也就没有了
为了能保存数据在docker中,我们使用卷
能干嘛?
容器的持久化
卷的设计目的就是数据的持久化,完全独立于容器的生命周期,因此docker不会在容器删除时删除其挂载的数据卷
容器间继承+数据共享
特点
数据卷可在容器之间共享或重用数据
卷中的更改可以直接生效
数据卷中的更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止
添加数据卷 -v
容器内添加
直接命令添加
命令
如果没有目录 则自动创建目录 docker run -it -v /myData:/dataContainer centos
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /myData:/dataContainer centos
查看数据卷是否挂载成功[docker inspect 容器ID]
容器和宿主机间数据共享
docker inspect 容器ID
1、docker ps 2、docker inspect 容器id 展示内容: "Volumes":{ "/dataContainer":"/myData" #数据卷挂在成功 } "VolumesRW":{ #可读写操作? "/dataContainer":ture #容器可读写;false:容器只读、没有写,宿主机单方面写 } "HostConfig":{ "Binds":{ "/myData:/dataContainer" #宿主机、容器绑定,数据共享 } }
容器停止退出[exit]后,主机修改的数据是否同步?-->同步
1、容器停止退出 exit 2、宿主机->cd /myData ->echo "hello world" >> a.log #修改a.log文件 3、docker ps -l #显示最近创建的容器 4、docker start 容器id 5、docker attach 容器id #进入到容器实例 6、cd /dataContainer ->cat a.log #a.log文件中多了“hello world”
命令【带权限】
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
ro->read only 只读。 容器只能读,不能写 宿主机单方面 写
dockerFile添加
可在dockerFile中使用volume指令 给镜像添加一个或多个数据卷
VOLUME["dataContainer","dataContainer2","dataContainer3"] 说明: 出于可移植和分享考虑,用 -v 主机目录:容器目录 这种方法不能直接在dockefile中实现 由于宿主机目录是依赖特定宿主机的,并不能保证在所有宿主机上都存在这样特定的目录
根据目录下新建mydocker文件夹并进入
File构建
1、cd mydocker 2、cat dockerfile2 展示: #volume test FROM centos VOLUME["/dataContainer1","/dataContainer2"] CMD echo "finished,------success1" CMD /bin/bash
build后生成镜像
1、cd /mydocker 2、docker build -f /mydocker/dockerfile2 -t zzyy/centos #出现:Successfully built 镜像ID 即是成功了 3、docker images #查看本地主机镜像
eg: docker build -f /mydocker/dockerfile2 -t wwj/centos.
-f: --file可无,默认文件Dockerfile
-t: --tag 可无,自动生成标题名
.: docker守护进程
获得一个新镜像zzyy/centos
run 容器
docker run -it zzyy/centos
以上可以知道容器内卷的目录地址 对应的主机目录呢?
1、命令:docker inspect 容器ID 2、找到 "Volumes":{ "/dataContainer1":"/...", # dataContainer1容器内卷的目录地址,...为宿主机的目录地址 "/dataContainer2":"..." }
备注
docker挂载主机目录docker访问出现cannot open directory.:permission denied
解决 : 在挂载目录后 镜像名前 加 --privileged=true 参数即可
数据卷容器
是什么
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
总体介绍
以上一步新建的镜像zzyy/centos为模板并运行容器dc01/dc02/dc03
他们已经具有容器卷
/dataContainer1
/dataContainer2
容器间传递共享(--volumes-from)
先启动一个父容器dc01
docker run -it --name dc01 zzyy/centos
在/dataContainer2中新增内容
dc02/dc03继承自dc01
docker run -it --name dc02 --volumes-from dc01 zzyy/centos docker run -it --name dc03 --volumes-from dc01 zzyy/centos 02 03 继承自01
docker run -it --name dc02 --volumes-from dc01 zzyy/centos
dc02/dc03分别在/dataContainer2各自新增内容
回到dc01可以看到02/03各自添加的 都能共享 三个容器文件都是 互通一样的
删除dc01【docker rm -f dc01】。02/03不会受影响文件依旧在。那么,修改02 ,03会不会同步呢?会!在02添加的数据,03也会有
删除02后,03也可以访问
--> docker run -it --name dc04 --volumes-from dc03 zzyy/centos
新建04继承03 再删除03 再访问04 数据存在
总结
容器之间配置 信息的传递,数据卷的生命周期一直持续到没有容器使用为止
dockerFile解析
是什么
是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本
构建三步骤
编写dockerFile文件
docker build 生成镜像
docker run
文件(centos为例) ?
FROM scratch ADD centos-7-x86_64-docker.tar.xz / LABEL org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20190305" CMD ["/bin/bash"] 可以进入到容器实例内
dockerFile构建过程解析
dockerfile内容基础知识
每条保留字指令都必须为大写字母且跟随至少一个参数
指令按照从上到下,顺序执行
# 注释
每条指令都会创建一个新的镜像层,并对镜像进行提交
docker执行dockerfile的流程
1> docker从基础镜像运行一个容器
2> 执行一条指令并对容器作出修改
3> 执行类似docker commit的操作 提交一个新的镜像层
4> docker再基于刚提交的镜像运行一个新容器
5> 执行dockerfile中的下一条指令直到所有指令都执行完成
dockerfile小总结
dockerFile体系结构(保留字指令)
FROM
MAINTAINER
RUN
EXPOSE
WOEKDIR
ENV
ADD
COPY
VOLUME
CMD
ENTRYPOINT
ONBUILD
案例
总结
常用安装
总体步骤
搜索镜像
拉取镜像
查看镜像
启动镜像
停止容器
移除容器
tomcat
docker search tomcat
docker pull tomcat
docker images
docker run -it -p 9999:8080 tomcat
MySQL
docker search mysql
docker pull mysql:5.6 拉取5.6版本
docker images
以镜像创建容器
docker run -p 12345:3306 --name MySQL -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs -v /zzyyuse/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
docker run -p 12345:3306 --name MySQL -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs -v /zzyyuse/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 后台运行
docker ps
进入容器实例中:docker exec -it 容器id /bin/bash
mysql -uroot -p
外部win10连接运行在docker上的mysql服务
ip 端口号 root 123456
数据备份
docker exec mysql服务容器ID sh -c'exec mysqldump --all-databases -uroot -p"123456"' >/zzyyuse/all-databases.sql
Redis
docker pull redis:3.2
以镜像创建容器(运行镜像)
docker run -p 6379:6379 -v /zzyyuse/myredis/data:/data -v /zzyyuse/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes #启用aof
在宿主机/zzyyuse/myredis/conf/redis.conf目录下建redis.conf文件[vim /zzyyuse/myredis/conf/redis.conf/redis.conf]
拷贝一个Redis的.conf文件 注掉 bind 127.0.0.1
测试redis-cli连接
docker ps
容器外直接执行命令:docker exec -it 容器id redis-cli
测试持久化文件是否生成
宿主机 /zzyyuse/myredis/data下 有appendonly.aof文件
本地镜像发布到阿里云
本地镜像发布到阿里云流程
镜像生成方法
dockerfile
从容器创建一个新的镜像 docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]
docker commit -a zzyy -m "new mycentos 1.4" 容器id mycentos:1.4
OPTIONS说明
-a:提交的镜像作者
-m:提交时的描述
将本地镜像推送到阿里云
本地镜像素材
阿里云开发者平台
创建仓库镜像
命名空间
仓库名称
将镜像推送到registry
管理 --> 有例子 1. 登录阿里云Docker Registry $ sudo docker login --username=nancy123456fsdags registry.cn-hangzhou.aliyuncs.com 用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。 您可以在产品控制台首页修改登录密码。 2. 从Registry中拉取镜像 $ sudo docker pull registry.cn-hangzhou.aliyuncs.com/wwj00/mycentos:[镜像版本号] 3. 将镜像推送到Registry $ sudo docker login --username=nancy123456fsdags registry.cn-hangzhou.aliyuncs.com $ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/wwj00/mycentos:[镜像版本号] $ sudo docker push registry.cn-hangzhou.aliyuncs.com/wwj00/mycentos:[镜像版本号] 请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。 4. 选择合适的镜像仓库地址 从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。 如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录,并作为镜像命名空间前缀。 5. 示例 使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。 $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB $ sudo docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816 使用"docker images"命令找到镜像,将该镜像名称中的域名部分变更为Registry专有网络地址。 $ sudo docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
公有云 可以查询到
dockerHub 可搜索 命名空间/镜像名 eg:wwj00/mycentos
查看详情
将阿里云镜像下载到本地
docker容器
1、docker容器可以认为是软件的运行状态 2、docker容器涉及部署与运维 3、docker容器,容器是直接提供服务的
docker镜像
1、docker镜像是软件产品 2、docker镜像成为交付标准 3、docker镜像,在用dockerfile定义一个文件后,docker build时会产生一个docker镜像,当运行docker镜像时,会真正开始提供服务;
dockerfile
1、dockerfile是软件的原材料 2、dockerfile面向开发 3、dockerfile需要定义,dockerfile定义了进程需要的一切东西。dockerfile涉及内容包括执行代码或是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程等等