Docker
简单了解
建议: Maven、Git相关知识
一次封装,到处运行
解决了运行环境和配置软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
三大特点:镜像、容器、仓库
开发语言Go
容器和镜像的区别在于容器的最上面那一层是可读可写的
仓库(repository)是存放镜像文件的场所。
仓库和仓库注册服务器是有区别的。仓库注册服务器上面存放着多个仓库,每个仓库存放多个镜像。
linux 安装
yum install -y epel-release(依赖)
yum install -y docker-io
配置文件 /etc/sysconfig/docker
启动docker :service docker start
底层运行原理和机制
docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。容器是一个运行时环境。
docker不需要Hypervisor实现硬件资源虚拟化,直接使用主机硬件;docker直接利用宿主机的操作系统,VM会重新启动一个系统,所以会比虚拟机快
常用命令
docker version #版本号
docker info #个人信息描述
docker --help #帮助信息
docker images #列出本地镜像 docker images -a #列出所有镜像(含中间层) docker imags -q #列出镜像的ID
docker images --digests #显示摘要信息 docker images --digests --no-trunc #显示完整的镜像信息
docker search <镜像名字> #查找镜像 docker search -s 30 <镜像名字> #列出点赞数超过30的镜像
docker pull <镜像名字> #下载拉取镜像(没有版本号为最新版)
docker rmi -f <镜像ID> #强制删除镜像
docker rmi -f <镜像ID> <镜像ID> #删除多个
docker rmi -f $(docker iamges -qa)#删除所有
docker run [OPTIONS] IMAGE [COMMAND] [ARG…] #新建并启动容器
OPTIONS说明(常用):有些事一个减号,有些是两个
--name=“容器新名字”:为容器指定一个名称;
-d:后台运行容器,并返回容器ID,也即启动守护式容器;
-i: 以交互模式运行容器,通常与-t同事使用;
-t: 为容器重新分配一个伪输入终端,通常与-i同时使用;
-P: 随机端口映射
-p: 指定端口映射,有以下四种方式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
ps -ef用于查看全格式的全部进程,其中“ps”是在Linux中是查看进程的命令,“-e ”参数代表显示所有进程,“-f”参数代表全格式。
exit #退出docker
docker ps #运行的docker容器 docker ps -l #上一次运行的docker
docker run -it --name <别名>
docker ps -lq #只显示容器编号
docker start/stop <容器ID或者容器名字> #启动/暂停容器
一次性删除容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
docker run -d <容器名> #启动守护式进程
docker logs -t -f --tail <数字> <docker_name>
docker top <容器ID> #查看容器内进程
docker inspect <容器ID> #查看容器内部细节
docker attach <容器ID> #重新进入docker Ctrl +Q+P #退出但不停止
镜像原理
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,包括代码、运行时、库、环境变量和配置文件。
UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker的基础。
镜像可以通过分层来进行继承。
特性:一次同时加载多个文件系统,但是从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
bootfs和rootfs
最大的好处就是-共享资源
Docker镜像commit
docker commit 提交容器副本使之成为一个新的镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
docker容器数据卷
卷的设计目的就是数据卷的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除的时候删除其挂载的数据卷
特点:
1.数据卷可在容器之间共享或重用数据
2.卷中的更改可以直接生效
3.数据卷中的更改不会包含在镜像的更新中
4.数据卷的生命周期一直持续到没有容器使用它为止
容器间继承+共享数据
docker cp #从docker容器拷贝文件到主机
容器内添加数据卷:直接命令添加、DockerFile添加、备注
直接命令添加
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
容器停止退出后,主机修改后数据依然同步
命令(带权限)docker run -it -v /宿主机绝对路径:/容器内目录:ro 镜像名
最后的:ro是模式,ro为read only,默认为rw,read write
DockerFile添加
Docker images ===> DockerFile
File构建
build后生成镜像 docker build -f <dockerfile文件> -t <docker名字> . (别忘记最后的点)
docker run -it <docker名字> /bin/bash
数据卷容器
命名的容器挂载数据卷,其他容器通过 挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
docker run -it --name doc01 hehe/centos
volumes-from
docker run -it --name doc02 --volumes-from doc01 hehe/centos
docker run -it --name doc03 --volumes-from doc01 hehe/centos
即继承又共享 doc01/2/3中任何一个添加文件另外两个都会增加
DockerFile是什么
手动编写符合规范的dockerfile文件
直接docker build命令执行
run
基础知识
1.每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2.指令按照从上到下,顺序执行
3.#标识注释
4.每条指令都会创建一个新的镜像层,并对镜像进行提交
体系结构
FROM--基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER--镜像维护者的姓名和邮箱地址
RUN--容器构建时需要运行的指令
EXPOSE--暴露的端口号
WORKDIR--指定在创建容器后,终端默认登录的进来工作目录,一个落脚点,
ENV--用来在构建镜像过程中设置环境变量 ENV <name> <path> $name 就是指定的path
ADD--将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY--类似ADD,拷贝文件和目录到镜像中。COPY src dest COPY [“src”,“dest”]
VOLUME--容器数据卷,用于数据保存和持久化工作
CMD--指定一个容器启动时要运行的命令,可以有多个CMD,但是只有最后一个生效,CMD会被docker run之后的参数替换 CMD <命令> 或者 CMD ["可执行文件",“参数1”,“参数2”...]
ENTRYPOINT--指定一个容器启动时要运行的命令,docker run 之后的参数会追加,不会被覆盖
ONBUILD--当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
案例
docker history <容器ID> 显示容器创建过程
自定义镜像Tomcat
1.mkdir /data/tomcat9
2.在上述目录下touch c.txt
3.将jdk和tomcat安装的压缩包拷贝进第一步目录
4.在第一步目录下新建Dockerfile
5.构建
6.Run
7.验证
8.结合前述的容器卷将测试的web服务test发布
阿里云
https://cr.console.aliyun.com/repository/cn-hangzhou/xdhughie/mycentos/details
- 登录阿里云Docker Registry
$ sudo docker login --username=18519198841 registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在产品控制台首页修改登录密码。
- 从Registry中拉取镜像
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/xdhughie/mycentos:[镜像版本号]
- 将镜像推送到Registry
$ sudo docker login --username=18519198841 registry.cn-hangzhou.aliyuncs.com$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/xdhughie/mycentos:[镜像版本号]$ sudo docker push registry.cn-hangzhou.aliyuncs.com/xdhughie/mycentos:[镜像版本号]