Docker


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

发布到阿里云上

参考官方文档,创建命名空间,再创建仓库,在仓库中上传。


Docker文档和仓库

Docker Documentation | Docker Documentation

Docker Hub

(100条消息) Docker入门学习笔记(狂神版)_三杯温开水的博客-CSDN博客_docker安装 狂神


文章作者: Dydong
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Dydong !
  目录