Docker
Dockers 概述
出现原因:缓解开发与运维之间的不协调,两者之间的困难。开发时可将项目通过docker把项目的镜像(环境)给传到仓库中,需要时直接取出即可,用户不用自己重新布置环境。
Docker的思想来自于集装箱(logo如上),把不同的项目给隔离出来,每一个项目互相隔离出来,以免互相影响。从一开始的VM虚拟化技术到现在的容器虚拟化技术,从几个G到几个M的转变。
- 传统虚拟机虚拟出一条硬件,运行一个完整的OS,然后在上面运行
- 容器没有内核,也没有硬件,因此轻便了许多
- 每个容器相互隔离,都有自己的文件系统
Docker名词概念
镜像:类似于模板,镜像==>run==>容器,一个镜像可以产生多个容器。
容器:独立运行一个组,用镜像创建。
仓库:存放镜像的地方,分为公有和私有仓库。
Docker原理&流程
Docker是一个CS访问模型,Docker通过Socket从客户端访问,DockerServer接受命令并且执行。
Docker命令
卸载docker
#1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2. 删除资源
rm -rf /var/lib/docker
# /var/lib/docker 是docker的默认工作路径!
帮助命令:
docker version #查看docker版本
docker info #查看docker信息
docker [op] --help #帮助请求
Docker原理
为什么Docker比Vm快
1、docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
2、docker利用的是宿主机的内核,而不需要Guest OS。
因此,当新建一个 容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引导、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了这个复杂的过程,因此新建一个docker容器只需要几秒钟。
Docker基本命令
镜像命令:
docker images [op] #查看镜像信息
docker search name [op] #搜索镜像,eg:docker search mysql --filter=stars=3000(使用大于3000)
docker pull name [tag] #下载镜像,分层下载
docker rmi -f id #选择删除镜像,id=$(docker images -aq)删除全部
容器命令:
docker run [op] images [way] #启动容器,/bin/bash
op:
--name="Name" 容器名称
-d 后台方式运行
-it 交互式运行
-P 指定容器端口 -P 8080:8080
-p 随机指定端口
exit #退出容器&&停止
ctrl+P+Q #退出容器&&不停止
docker rm [-f] id #删除容器,id=$(docker ps -aq)
docker ps #显示正在运行的容器
docker ps -a #查看历史记录
docker start id #启动容器
docker restart id #重启容器
docker stop id #停止正在运行容器
docker kill id #强制停止容器
Docker日志元数据进程
docker logs -tf --tail 10 [id]
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp
docker inspect [id] #查看容器详细信息
Docker进入容器拷贝
#进入容器,开启新的终端
docker exec -it [id] /bin/bash
#进入容器正在执行的终端
dcoker attach [id]
#copy文件到主机上
docker cp f312867b9b84:[文件位置] [主机目录]
#copy是一个手动过程,我们可以使用卷技术实现内外同步
Docker命令图
镜像原理联合文件系统
UnionFileSystem(联合文件系统)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次性提交来一层层的叠加,通知可以将不同的目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层进行基础,基于基础镜像(没有父镜像),可以制作各种具体的应该镜像。
bootfs(Boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动是会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存中使用权已由bootfs转交给内核,此时系统也会卸载bootfs。rootfs(root file system),在bootfs之上。包含就是典型Linux系统中的 /dev
,/proc
,/bin
,/etc
等标准目录和文件。rootfs就是各种不同的操作系统发行版本,比如Ubuntu,CentOS等等。
镜像分层理解
所有的Docker镜像都是起始于一个基础镜像,当进行修改或者增加新的内容时,就会在当前镜像之上,创建新的镜像层。举个简单的例子:加入基于Ubuntu Linux 16.04 创建一个新的镜像,就是新的镜像的第一次;如果在该镜像中添加python包,就会在基础镜像之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像。
Commit镜像
docker commit # 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名: [TAG]
# 1、启动一个默认的tomcat
# 2、发现这个默认的tomcat 是没有webapps应用,镜像的原因,官方的镜像默认 webapps 下面是没有文件的
[root]# docker commit -a="dydong" -m="add webapps" 88cb0a36828f tomcat02:1.0
sha256:185e7ed7ae4da8927157108e92251ce97405df1d79908e11c27f887a4efa5b4e
[root]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 185e7ed7ae4d 6 seconds ago 684MB
tomcat 9.0 b8e65a4d736d 11 months ago 680MB
tomcat latest fb5657adc892 11 months ago 680MB
# 3、将我们操作过的容器通过commit提交为一个新的镜像!以后若需要就可以使用我们修改过的镜像
如果你想要保存当前的容器状态,就可以通过commit来提交,获得一个镜像;类似在虚拟机中创建一个快照!
容器数据卷
数据如果数据都在容器,那么我们容器删除,数据就会丢失! 需求: 数据可以持久化,MySQL,容器删了,删除跑路!需求:MySQL数据可以存储到本地!容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
总结:容器的持久化和同步化操作!容器间也可是可以数据共享的!
方式一:直接使用命令挂载,-v
#通过-v来进行挂载
docker run -it -v /home/ceshi:/home centos /bin/bash
# 启动起来时候外面可以通过 docker inspect 容器id
1、文件之间的数据是同步的
2、停止容器,宿主机上修改文件
3、启动容器
4、容器内的数据依旧是同步的!
好处: 以后修改文件配置只需要在本地修改即可,因为启动容器后数据会自动同步
MySQL同步数据
# 获取镜像
docker pull mysql:5.6
# 运行容器,需要做数据挂载! # 安装启动mysql , 需要配置密码的,这是需要注意的!
# 官方测试: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动mysql5.7
-d 后台运行
-p 端口映射
-v 数据卷挂载
-e 环境配置
--name 容器名字
docker run -d -p 8080:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.6
#可以通过sqlyog去进行连接了,结论: 我们发现,挂载到本地的数据卷一九没有丢失,这就实现了容器数据持久化!
具名匿名挂载
# 匿名挂载
-v 容器内路径!
docker run -d -p --name nginx01 -v /etc/nginx nginx
# 查看所有卷的情况
docker volume ls
# 这里发现,这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径!
# 具名挂载
- docker run -d -P --name nginx002 -v juming-nginx:/etc/nginx nginx
6950de23be75a77fb315ea738a4b448bcd0618326fdcec7aabd4e54e9e3c4d59
- docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 通过 -v 卷名:容器内路径
# 查看卷名所在位置
- docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-11-17T16:33:24+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
DockerFile数据卷
通过这个脚本可以生成一个镜像,镜像是一层一层的,脚本一个个的命令组成,每个命令就是一层。
# 创建dockerfile文件,名字随机,建议Dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["valume01","volume02"] #匿名挂载
CMD echo "---end----"
CMD /bin/bash
# 这里的每一个命令,就是镜像的一层
# 执行命令 注意后面需要添加一个 .
docker build -f dockerfile1 -t lbx/centos .
# 启动自己的容器
docker run -it 容器id /bin/bash
#通过查看容器卷的挂载的情况可以发现到Mounts内部的信息
docker inspect 容器id
容器间共享
# 通过volumes-from 进行继承,在容器之间的数据是共享的
docker run -it --name docker02 --volumes-from docker01 9cfb4ae44fb8
#多个mysql同步数据!
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
# 这个时候,就可以实现两个容器的数据同步
容器之间配置信息的传递,数据卷容器的声明周期一直持续到没有容器使用为止。
但是一旦持久化到了本地,这个时候,本地的数据是不会删除的!
DockerFile
基础知识
1、每个保留关键字(指令)都是必须是大写字母
2、执行上到下顺序执行
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
基本指令
FROM # 基础镜像,一切从这里构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建时候需要运行的命令
ADD # 步骤: tomcat镜像, 这个tomcat压缩包!添加的内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被代替
ENTRYPOINT # 这顶这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令。触发指令。
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
构建centos
Docker Hub 中99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建。
FROM centos
MAINTAINER dydong<1935569700@qq.com>
ENV MTPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN tum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
镜像发布
发布到hub上
docker login -u username -p password #进行登录
docker tag [id] name:[版本] #docker tag 12313 dyd/centos:1.0
docker pull [image_name] #发布镜像
dcoker logout
发布到阿里云上
参考官方文档,创建命名空间,再创建仓库,在仓库中上传。