Docker学习笔记

本文详细介绍了Docker的起源、作用,以及如何安装和使用Docker。Docker解决了开发与生产环境一致性问题,通过容器实现轻量级隔离,提高资源利用率。文章还涵盖了Docker命令行操作,如镜像、容器、数据卷管理和Dockerfile的使用。此外,讲解了Docker镜像的分层存储和数据持久化的实现。最后,通过示例展示了如何构建和使用Dockerfile。
摘要由CSDN通过智能技术生成

学习视频:【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili

一、docker概述

docker为什么会出现

  • 开发-上线两套环境
  • 开发-运维,软件更新导致服务不可用
  • 环境配置复杂
  • docker通过隔离机制(打包装箱),将服务器运用到极致

docker的历史

  • linux container容器,内核虚拟化技术
  • 开源
  • 基于GO语言开发
  • 官网:https://www.docker.com/
  • 文档:https://docs.docker.com/
  • 仓库:https://hub.docker.com/

docker能做什么

  • 传统虚拟机虚拟邮件,运行完整的操作系统
  • 容器内的应用直接运行在宿主机的内容,没有自己的内核,也没有虚拟化硬件
  • 每个容器相互隔离,每个容器有自己的文件系统,互不影响

DevOps(开发、运维)

  • 应用更快速的交付和部署
  • 打包镜像发布测试一键运行
  • 更便捷的实际和扩容
  • 更简单的系统运维
  • 开发测试环境都是高度一致的
  • 更高效的计算资源
  • 可以在一个物理机上运行很多容器实例

二、docker安装

docker的基本组成

  • 镜像:根据镜像创建容器服务,镜像->run->容器,通过这个镜像可以创建多个容器(服务运行在容器中)
  • 容器:独立运行一个或一组应用,通过镜像来创建;启动、停止、删除、基本命令;可以理解为一个简易的linux系统
  • 仓库:存放镜像的地方;公有和私有(类似git);国内配置镜像加速

安装docker

网络上很容易找到,具体过程略。

运行流程:

底层原理

Docker是怎么工作的?

  • Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问
  • Docker-Server接收到Client的指令就会执行命令

 Docker为什么比VM快?

  • 有比虚拟机更小的抽象层,运行在docker容器上的程序直接使用的的实际物理机的硬件资源
  • docker利用的是宿主机的内核

  • 新建一个容器的时候,docker 不需要像虚拟机一样重新加载一个操作系统内核,避免引导

三、docker命令

帮助命令

docker version    # 显示版本信息
docker info       # 显示docker的系统信息(镜像和容器的数量)
docker 命令 --help     # 帮助命令

帮助文档的地址:https://docs.docker.com/engine/reference/commandline/docker/

镜像命令

docker images    # 查看所有镜像
docker search    # 搜索镜像
docker pull      # 下载镜像
docker image pull
docker rmi       # 删除镜像

docker images

# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项 
-a, --all # 列出所有的镜像 
-q, --quiet # 只显示镜像的id
docker images -aq #显示所有镜像的id

docker search

docker search mysql

docker pull

# 下载镜像 docker pull 镜像名[:tag]
docker pull mysql   # 默认版本是latest

docker rmi

docker rmi -f 镜像id
# docker rmi -f $(docker images -aq) # 删除全部的镜像

容器命令

有了镜像才可以创建容器

docker pull centos   #下载镜像
docker run 容器id   # 新建容器并启动
docker ps           # 列出所有运行的容器
docker container list
docker rm 容器id  # 删除指定容器
docker start 容器id # 启动容器
docker restart容器id   # 重启容器
docker stop 容器id     # 停止当前正在运行的容器
docker kill 容器id     # 强制停止当前容器
exit       #  直接容器停止并退出

docker run

docker run [可选参数] image
# 参数说明--name="Name" 容器名字 tomcat01 tomcat02, 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080 
-p ip:主机端口:容器端口 
-p 主机端口:容器端口(常用) 
-p 容器端口 
容器端口
-p 随机指定端口

docker ps

#docker ps命令 #列出当前正在运行的容器 
-a # 列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器
-q # 只显示容器的编号

docker rm

docker rm 容器id # 删除指定容器,不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $(docker ps-aq) # 删除所有的容器

启动和停止

docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器

常用其他命令

后台启动容器

docker run -d 镜像名  # docker ps无法查看,需要有前台进程,docker 发现没有应用,就会自动停止

查看日志

docker logs -tf --tail 10 容器id

查看容器中的进程

docker top 容器id

查看镜像的元数据

docker inspect 容器id

进入当前正在运行的镜像

# 通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
docker exec -it 容器id     # 开启新的终端
docker attach 容器id       # 进入正在执行的终端,不会启动新的进程

从容器内拷贝到主机上

docker cp 容器id:容器内路径 目的的主机路径
# 拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现

小结

attach Attach to a running container #当前shell下attach连接指定运行镜像
build Build an image from a Dockerfile #通过Dockerfile定制镜像
commit Create a new image from a containers changes #提交当前容器为新的镜像
cp Copy files/folders from a container to a HOSTDIR or to STDOUT #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container  #创建一个新的容器,同run 但不启动容器
diff Inspect changes on a containers filesystem #查看docker容器变化
events Get real time events from the server #从docker服务获取容器实时事件
exec Run a command in a running container #在已存在的容器上运行命令
export Export a containers filesystem as a tar archive #导出容器的内容流作为一个tar归档文件(对应import)
history Show the history of an image #展示一个镜像形成历史
images List images #列出系统当前镜像
import Import the contents from a tarball to create a filesystem image #从tar包中的内容创建一个新的文件系统映像(对应export)
info Display system-wide information #显示系统相关信息
inspect Return low-level information on a container or image #查看容器详细信息
kill Kill a running container #kill指定docker容器
load Load an image from a tar archive or STDIN #从一个tar包中加载一个镜像(对应save)
login Register or log in to a Docker registry #注册或者登陆一个docker源服务器
logout Log out from a Docker registry #从当前Docker registry退出
logs Fetch the logs of a container #输出当前容器日志信息
pause Pause all processes within a container #暂停容器
port List port mappings or a specific mapping for the CONTAINER #查看映射端口对应的容器内部源端口
ps List containers #列出容器列表
pull Pull an image or a repository from a registry #从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to a registry #推送指定镜像或者库镜像至docker源服务器
rename Rename a container #重命名容器
restart Restart a running container #重启运行的容器
rm Remove one or more containers #移除一个或者多个容器
rmi Remove one or more images #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
run Run a command in a new container #创建一个新的容器并运行一个命令
save Save an image(s) to a tar archive #保存一个镜像为一个tar包(对应load)
search Search the Docker Hub for images #在docker hub中搜索镜像
start Start one or more stopped containers #启动容器
stats Display a live stream of container(s) resource usage statistics #统计容器使用资源
stop Stop a running container #停止容器
tag Tag an image into a repository #给源中镜像打标签
top Display the running processes of a container #查看容器中运行的进程信息
unpause Unpause all processes within a container #取消暂停容器
version Show the Docker version information #查看容器版本号
wait Block until a container stops, then print its exit code #截取容器停止时的退出状态值
docker stats # 查看CPU状态、内存

四、docker镜像

镜像是什么

代码、运行时、库、环境变量、配置文件

应用直接打包docker镜像就可以直接跑起来

如何得到镜像:

  • 远程仓库下载
  • 拷贝
  • 自己制作镜像DockerFile

镜像加载原理

UnionFS联合文件系统

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

Docker镜像加载原理

  • docker的镜像实际上由一层一层的文件系统组成(UnionFS)
  • bootfs:包含bootloader(引导加载kernel)和kernel。boot加载完成之后整个内核就在内存中了,此时内存的使用权已由bootfs转交给内核(公用)
  • rootfs:在bootfs之上,包含linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs是各种不同的操作系统发行版(Ubuntu,Centos等)

 分层理解

资源共享,多个镜像从相同的base镜像构建而来,那么素质及只需在磁盘上保留乙方base镜像,内存中只需要加载一份base镜像,这样可以为所有的容器服务,而且镜像的每一层都可以被共享

docker image inspect    # 查看镜像分层

  •  在添加额外的镜像层的同时,镜像始终是保持当前所有镜像的组合

  •  最上层的文件7是文件5的一个更新版本,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新的镜像层添加到镜像当中

  •  docker通过存储引擎的方式来实现镜像层堆栈,保证多镜像层对外展示为统一的文件系统->(Overlay2)

  •  Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部(容器层)

commit镜像

docker commit 提交容器成为一个新的副本 # 命令和git原理类似
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]

五、容器数据卷

什么是容器卷

数据都在容器中,容器删除数据就会丢失,需要数据持久化

数据共享技术,docker容器中产生的数据同步到本地(卷技术,目录挂载,将容器内的目录挂载到linux上)

容器的持久化和同步操作,容器间也可以数据共享

使用数据卷

方法一:直接使用命令挂载-v

# docker run -it -v 主机目录:容器内目录
docker run -it -v /home/ceshi:/home centos /bin/bash  
# 可通过 docker inspect 容器id 查看

只需在本地修改,容器内会自动同步

具名和匿名挂载 

  • 匿名:不指定主机路径
docker run -d -p --name nginx01 -v /etc/nginx nginx
docker volume ls  # 查看所有卷(乱码)
docker volume inspect 容器id # 寻找匿名卷id

所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxx/_data

大多数情况都是使用具名挂载


初始Dockerfile

Dockerfile是用来构建docker镜像的构建文件,通过这个脚本可以生成镜像,镜像是一层一层的,脚本就是一个一个命令

# Dockerfile1
FROM centos
VOLUME ["volume01", "volume02"]   # 挂载数据卷
CMD echo "----end----"
CMD /bin/bash

通过dockerfile构建镜像

docker build -f Dockerfile1 -t xxx/centos .

查看容器挂载卷的路径

docker inspect 容器id

如果构建镜像的时候没有挂载卷,则需要手动镜像挂载 -v 

数据卷容器

多个容器间的数据共享

docker run -it --name docker02 --volumes-from docker01 xxx/centos

 容器之间的配置信息传递,数据卷容器的生命周期一直持续到没有容器使用为止。一旦持久化到了本地,本地数据不会删除

六、DockerFile

dockerfile介绍

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

构建步骤:

  • 编写一个dockerfile文件
  • docker build 构建镜像
  • docker run运行镜像
  • docker push发布镜像(DockerHub、阿里云仓库)

dockerfile构建过程

基础知识:

  • 每个关键字都必须是大写字母
  • 执行从上到下顺序
  • # 表示注释
  • 每一个指令都会创建提交一个新的镜像并提交

  •  dockerfile:构建文件,定义了一切的步骤,源代码
  • dockerImages:通过dockerfile构建生成的镜像,最终发布和运行产品(企业交付的标准)
  • docker容器:镜像运行起来提供服务

dockerfile常用指令

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

实战

# 1. 编写Dockerfile:mydockerfile-centos
FROM scratch     # 基础镜像

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 build -f 文件路径 -t 镜像名:[tag] .
docker build -f mydockerfile-centos -t mycentos:0.1 .
# Successfully built f22b7b27d5d2Successfully tagged mycentos:0.1
# 3. 测试运行
docker images
docker run -it mycentos:0.1
docker history 镜像id # 镜像是如何构建的

发布自己的镜像

------------------------------------------------------------------------------------

后续docker网络部分在k8s中用不上,就没往下记了
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值