Docker

本篇笔记来源: 狂神说Docker

Docker概述

Docker为什么会出现

在这里插入图片描述
在这里插入图片描述

聊聊docker

在这里插入图片描述
文档地址:https://docs.docker.com/ Docker的文档是十分详细的!

仓库地址:https://hub.docker.com/

Docker能干吗

在这里插入图片描述
虚拟机技术缺点

  • 资源占用十分多
  • 冗余步骤多
  • 启动很慢

容器化技术
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Docker 镜像讲解

镜像是什么

镜像是一种轻量级、可执行的独立软件保,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。

所有应用,直接打包docker镜像,就可以直接跑起来!

如何得到镜像:

  • 从远程仓库下载

  • 拷贝

  • 自己制作 DockerFile

Docker镜像加载原理

UnionFs (联合文件系统)

UnionFs(联合文件系统):Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下( unite several directories into a single virtual filesystem)。Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

Docker镜像加载

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
boots(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引导加 kernel, Linux刚启动时会加bootfs文件系统,在 Docker镜像的最底层是 boots。这一层与我们典型的Linux/Unix系统是一样的,包含boot加載器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。 rootfs就是各种不同的操作系统发行版,比如 Ubuntu, Centos等等。

对于个精简的OS,rootfs可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的Linux发行版, boots基本是一致的, rootfs会有差別,因此不同的发行版可以公用bootfs.

虚拟机是分钟级别,容器是秒级!

commit 镜像

在这里插入图片描述

容器数据卷

什么是容器数据卷

在这里插入图片描述

使用数据卷

直接使用命令来挂载 -v

docker run -it -v 主机目录:容器内目录 

# 测试
docker run -it -v /home/test:/home centos /bin/bash

# 启动起来时我们通过docker inspect 容器id

在这里插入图片描述
测试文件的同步
在这里插入图片描述

1.停止容器

2.宿主机上修改文件

3.启动容器

4.容器内的数据依旧是同步的

在这里插入图片描述
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!

具名和匿名挂载

# 匿名挂载
-v 容器内路径!
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有的 volume(卷) 的情况
[root@internetOne data]# docker volume ls
local  6as5f64as654f6sa46f54a65sf4a6s54f65as4fa5asfasasfasfa65s4f65as4f

# 这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径!

# 具名挂载
[root@internetOne data]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
asashfguiahduajhiwjepowjapodjaoishfajaskdjakjopw64a8d4a98wf8
[root@internetOne data]# docker volume ls
DEIVER  		VOLUME NAME
local 			juming-nginx

# 通过-v 卷名:容器内路径
# 查看一下这个卷

在这里插入图片描述
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下在使用的‘具名挂载’

# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 # 匿名路径挂载
-v 卷名:容器内路径   # 具名路径挂载
-v /宿主机路径::容器内路径 # 指定路径挂载

初始Dockerfile

Dockerfile就是用来构建docker镜像的构建文件! 命令脚本!

通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个命令,每个命令都是一层!

# 创建一个dockerfile文件,名字可以随机 建议 Dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash

# 这里的每个命令都是镜像的一层!

启动自己写的容器
在这里插入图片描述
这个卷和外部一定有一个同步的目录
在这里插入图片描述
查看一下卷挂载的路径
在这里插入图片描述
测试一下刚才的文件是否同步出去了!

这种方式我们未来使用的非常多,因为我们通常会构建自己的镜像!

假设构建镜像时没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径

数据卷容器

多个mysql同步数据
在这里插入图片描述
启动三个容器,通过我们刚才自己写的镜像启动
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 测试:可以删除docker01,查看一下docker02和docker03是否还可以访问这个文件
# 测试依旧可以访问

在这里插入图片描述
多个mysql实现数据共享

docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=panzer --name mysql01 mysql:5.7

docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=panzer --name mysql02 --volumes-from mysql01 mysql:5.7

# 这个时候,可以实现两个容器数据同步!

结论
容器之间配置信息的传递,数据卷容器的数据周期一直持续到没有容器使用为止.

但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

Dockerfile

DockerFile介绍

dockerfile是用来构建docker镜像的文件,命令参数脚本

构建步骤:

1.编写一个dockerfile文件
2.docker build 构建成一个镜像
3.docker run 运行镜像
4.docker push 发布镜像(DockerHub,阿里云镜像仓库!)

tip: 很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!

DockerFile构建过程

基础知识:

1.每个保留关键字(指令)都必须是大写字母
2.执行从上到下顺序执行
3.#表示注释
4.每一个指令都会创建一个新的镜像层,并提交!

在这里插入图片描述
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件非常简单!
Docker镜像逐渐成为企业交付的标准,必须要掌握!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务器

DockerFile的指令

在这里插入图片描述

FROM            # 基础镜像,一切从这里开始构建
MAINTAINER      # 镜像是谁写的, 姓名+邮箱
RUN             # 镜像构建的时候需要运行的命令
ADD             # 步骤, tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR         # 镜像的工作目录
VOLUME          # 挂载的目录
EXPOSE          # 暴露端口配置
CMD             # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT      # 指定这个容器启动的时候要运行的命令, 可以追加命令
ONBUILD         # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY            # 类似ADD, 将我们文件拷贝到镜像中
ENV             # 构建的时候设置环境变量!

实战测试

Docker Hub中99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行的构建

在这里插入图片描述
创建一个自己的centos

# 1 编写Dockerfile的文件
FROM centos

MAINTAINER myfirst<125231455@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash

# 2.通过这个文件构建镜像
# 命令 docker bulid -f dockerfile文件路径 -t 镜像名:[tag]

# 3.测试运行

对比:之前的原生的centos
在这里插入图片描述
我们增加之后的镜像
在这里插入图片描述
我们可以列出本地镜像的变更历史
在这里插入图片描述
CMD和ENTRYPOINT区别

CMD         # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT      # 指定这个容器启动的时候要运行的命令, 可以追加命令

测试cmd

# 编写dockerfile文件
[root@internetOne dockerfile]# vim dockerfile-cmd-test

FROM centos
CMD ["ls","-a"]

# 构建镜像
[root@internetOne dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .

# run运行,发现我们的ls -a生效了
[root@internetOne dockerfile]# docker run cmdtest
.
..
.dockerenv
bin
dev
etc
home
lib
lib64


# 想追加一个命令 —l ls -al
[root@internetOne dockerfile]# docker run 2b06f9641629 -l
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.

# cmd的情况下 -l 替换了CMD ["ls","-a"]命令,-l不是命令所以报错

测试ENTRYPOINT

# ENTRYPOINT
# 1. 编写dockerfile文件
[root@kuangshen dockerfile]# vim dockerfile-entrypoint
FROM centos
ENTRYPOINT ["ls", "-a"]

# 2.构建镜像
[root@kuangshen dockerfile]# docker build -f dockerfile-entrypoint -t entrypointtest .

# 3. 创建容器
[root@kuangshen dockerfile]# docker run fc5e427dcacd
.
..
.dockerenv
bin
dev
etc
home
lib
lib64

# 想追加一个命令 -l 变成 ls -al
# 我们的追加命令, 是直接拼接到ENTRYPOINT命令的后面的!
[root@kuangshen dockerfile]# docker run fc5e427dcacd -l
drwxr-xr-x   1 root root 4096 Oct 10 08:20 .
drwxr-xr-x   1 root root 4096 Oct 10 08:20 ..
-rwxr-xr-x   1 root root    0 Oct 10 08:20 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  340 Oct 10 08:20 dev
drwxr-xr-x   1 root root 4096 Oct 10 08:20 etc
drwxr-xr-x   2 root root 4096 Nov  3  2020 home
lrwxrwxrwx   1 root root    7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3  2020 lib64 -> usr/lib64

发布自己的镜像

DockerHub
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
提交的时候也是按照镜像的层级进行提交的

阿里云镜像服务上
在这里插入图片描述
5.浏览阿里云
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值