学习视频:【狂神说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中用不上,就没往下记了