Docker
为什么会出现Docker
开发工程师将代码交给运维,运维开始部署,经常出现这个代码跑不对,
开发说没问题呀,在我本地没问题呀,所以环境和配置出现问题啦
所以 docker 可以从开发直接把OK的环境(代码/配置/系统/数据) 整体打包给 运维
特点
Docker 容器启动在秒级
Docker 对系统资源利用率高,一台主机上可以同时运行上千个Docker容器
Docker 基本不消耗系统资源,使得运行在Docker里面的应用的性能很高
Docker 迁移方便
Docker 是基于Go语言实现云开源项目
Docker 主要目标是 一次封装,到处运行
Docker 基本概念
镜像(Image)
是一个只读的模板,例如一个完整的Centos操作系统
镜像可以用来创建Docker容器,Docker中提供啦一个很简单的方式来创建镜像和更新镜像,甚至可以从其他地方直接拷贝已经做好的镜像直接使用,
镜像有点类似于编程中的Class类,在运行的时候生成对象
容器(Container)
是从镜像创建并运行的实例,就像一个启动好了的播放器程序,它可以被开始,停止,启动和删除。
每个容器都是互相隔离的,绝对保证安全
你可以把容易堪称一个启动了的Linux简化版系统,里面包括root用户权限,进程空间,用户空间和网络空间,还包括运行在里面的应用程序
仓库(Repository)
是集中存放镜像文件的地方,还有一种服务叫做仓库注册服务器,里面放着多个仓库,每个仓库中又包含多个镜像,每个镜像又有不同的标签。
仓库的概念有点类似于Git,也分为公有仓库和私有仓库,全世界最大的Docker仓库是Docker Hub,国内最大的Docker仓库是Docker Pool。
Docker 安装
Linux
Centos 安装
Centos 7 (64-bit) 系统内核版本为3.10 以上
Centos 6.5(64-bit) 或更好的版本 系统内核版本为 2.6.32-431 以上
查看自己的内核
uname -r
cat /etc/redhat-release
安装
CentOS 6.8
yum install -y epel-release 安装EPEL库 docker的依赖库
yum install -y docker-io
安装后的配置文件: /etc/sysconfig/docker
启动Docker后台服务: service docker start
docker version 验证:
CentOS 7
卸载老的版本
yum remove docker docker-client docker-client-latest \
docker-common docker-latest \
docker-latest-logrotate \
docker-selinux docker-selinux \
docker-engine-selinux docker-engine
安装
1. 安装最新的
yum install docker-ce
2. 选择版本安装
yum list docker-ce --showduplicates | sort -R
yum install docker-ce-<VERSION STRING>
3. 启动
systemctl start docker
注:
No package docker-ce available.
先执行: yum install epel-release
在执行: yum install docker-io
另一种安装
#得到文件直接输出给 sh 执行
sudo wget -qO- https://get.docker.com | sh
#由于安装完Docker 只能root操作,所以增加用户拥有执行权限
sudo usermod -aG docker 用户名
Windows
直接在Docker 官网进行下载
加速器
阿里云加速器
地址:https://cr.console.aliyun.com/
获得加速器地址:
配置本机的加速: /etc/sysconfig/docker
other_args:’加速器地址‘
例: other_args:"--registry_mirror=https...."
ubuntu 配置加速器
https://www.cnblogs.com/weschen/p/7134462.html
网易云加速器
镜像命令
# 列出所有镜像
docker images -a 列出所有镜像 -q 只显示镜像ID
-digests 显示镜像摘要信息
-no-trunc 显示完整的镜像信息
# 查询镜像
docker search [options] 镜像名称
options: -no-trunc 显示完整的镜像描述
-s 列出收藏数不小于指定的镜像
--limit int 只显示几个
-automated 只列出automated build类型的镜像 automated build 自动构建
# 下载镜像
docker pull 镜像名 不写版本号代表latest 例: docker pull tomact:2.4
# 删除镜像
docker rmi 镜像名
docker rmi -f 镜像名 #强制删除
docker rmi -f 镜像名1:tag 镜像名2:tag #删除多个
docker rmi -f $(docker images -a -q) # 删除全部
# 提交镜像
docker commit -m="提交描述信息" -a="作者" 容器ID 要创建目标镜像名称:tag
例: docker commit -m="描述" -a="YuYan" 容器ID mydocker/mycentos:1.2
# 上传镜像
docker push 镜像名称:tag
容器
# 运行容器
docker run -i 以交互模式运行容器,通常与 -t 同时使用
-d 后台运行容器,并返回容器ID
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-P 随机端口映射,容器内部端口随机映射到主机的高端口
-p 指定端口映射,格式为:主机(宿主)端口:容器端口
--name="centos_YuYan": 为容器指定一个名称
例: docker run -it -p 8080:8080 --name mytomact tomact
# 查看容器
docker ps # 查看正在运行的容器
docker ps -l # 查看上次运行的容器
docker ps -a # 当前运行的和过往的容器
docker ps -n 3 # 上 n 次 运行的容器
# 启动容器
docker start 容器ID
# 重启容器
docker restart 容器ID
# 停止容器
docker stop 容器ID # 停止退出容器
exit # 停止退出容器
ctrl + p + q # 容器不停止退出
docker kill 容器ID # 强制停止容器
# 不停止退出 或 后台运行的容器 在次进入
docker attach 容器ID # 直接进入容器启动命令的终端,不会启动新的进程
docker exec 容器ID # 是在容器中打开新的终端,并且可以启动新的进程(并不进去容器,直接返回)
# 例如 docker exec -t 容器ID ls -l /var
# 删除容器
docker rm 容器ID # 删除容器
docker rm -f 容器ID # 强制删除容器
# 删除多个容器
docker rm -f $(docker ps -aq)
docker ps -a -q|xargs docker rm
# 从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径
# 查看容器运行日志
docker logs 容器ID
-t 显示时间
-f 实时查看
--tail 查看几行
# 查看容器内运行的进程
docker top 容器ID
# 查看容器运行的细节
docker inspect 容器ID
Docker 容器数据卷
目的
数据持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点
1、数据卷可在容器之间共享和重用数据
2、卷中的更改可以直接生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止
5、也可以容器到主机 主机到容器的数据共享
数据卷
容器内添加
直接命令添加
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
权限: docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
# ro 只读 read only
DockerFile 添加
根目录下新建mydocker文件夹并进入
可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
出于可移植和分享的考虑,用 -v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录
file构建
vim Dockerfile
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,------------success1]"
CMD /bin/bash
bulid后生成镜像
获得一个新镜像zzyy/centos
docker build -f /mydocker/Dockerfile -t zzyy/centos .
run 容器
docker run -it 容器ID
备注
Docker挂载主机目录Docker访问出现cannot open directory .:Permission denied
解决办法:在挂载目录后多加一个--privileged=true 参数即可
Docker 数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
数据共享
1、先启动一个父容器dc01 docker run -it --name dc01 zzyy/centos
2、dc02/dc03 继承自dc01 docker run -it --name dc02 --volumes-from dc01 zzyy/centos
3、回到dc01可以看到02/03各自添加的都能共享了
4、删除dc01,dc02修改后dc03可否访问
5、删除dc02后dc03可否访问
6、新建dc04继承dc03后在删除dc03
结论: 容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
Dcokerfile 解析
解析过程
基础知识
1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行
3、# 表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交
大致流程
1、docker从基础镜像运行一个容器
2、执行一条指令并对容器作出修改
3、执行类似docker commit 的操作提交一个新的镜像层
4、docker在基于刚提交的镜像运行一个新容器
5、执行dockerfile中的下一条指令直到所有指令都执行完成
总结
Dockerfile 是软件的原材料
Docker镜像是软件的交付品
Docker容器则可以认为是软件的运行态
Dcokerfile面向开发 Docker镜像成为交付标准 Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石
Dockerfile 体系结构(保留字指令)
FROM 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令
EXPOSE 当前容器对外暴露出的端口
WORKDIR 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV 用来在构建镜像过程中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY 类似ADD,拷贝文件和目录到镜像中,
将从构建上下文目录中<源路经>的文件/目录复制到新的一层的镜像内的<目标路径>位置
COPY src dest
COPY ['src','dest']
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令
CMD
shell格式: CMD 命令
exec格式: CMD ["可执行文件","参数1","参数2"...]
Dockerfile 中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数 (多个追加)
ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发
小总结
BUILD Both RUN
FROM WORKDIR CMD
MAINTAINER USER ENV
COPY EXPOSE
ADD VOLUME
RUN ENTRYPOINT
ONBUILD
.dockerignore
案例:
Base镜像(scratch) Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的, 也就是元祖镜像
自定义镜像mycentos:
1、编写:
vim dockerfile
2、构建
docker build -f 镜像名字:标签 .
3、运行
docker run -it mycentos:1.3
4、列出镜像的变更历史
docker history 镜像名