一、Docker 是什么Docker 是一款容器化引擎基于 Linux 内核技术Namespaces 隔离、Cgroups 资源限制能把应用、依赖、环境打包成统一镜像一次打包到处运行。核心优势环境统一解决 “本地能跑服务器报错”轻量容器共享宿主机内核比虚拟机体积小、启动秒级隔离容器之间互不干扰分发便捷镜像可上传 Docker Hub或私有仓库如阿里云容器镜像服务ACR和自建Harbor仓库 快速部署。1、Docker底层原理宿主机提供 Linux 内核容器镜像自带独立用户态系统CentOS / Ubuntu / Alpine。所有 Linux 发行版CentOS、Ubuntu共用一套 Linux 内核Docker 容器共享宿主机内核但文件系统、命令、软件包管理器、系统库全是镜像自带的。2、容器和虚拟机对比容器打包应用、环境、库成容器每个容器相互隔离运行在操作系统内核上。[APPLib]-[APPLib]【kernel】虚拟机运行一个完整操作系统 。[APP]-[APP]【Libkernel】3、使用docker,开发打包部署上线一套流程java -jar(环境)-打包带上环境(镜像)-docker仓库-下载镜像-直接运行即可传统方式要要安装应用环境redis,mysql,jdk等应用配置端口等配置麻烦不能跨平台如window开发后发布到linux端口冲突等费时费力而且容易出错。Docker实操基本过程[build] 构建镜像[pull] 拉取镜像[run] 运行镜像指定端口映射数据卷挂载等参数[start] [stop] [restart] 启动容器二、四大核心概念镜像 Image只读模板包含程序、库、配置相当于容器模板类似系统安装包。容器 Container镜像运行后的实例可创建、启动、停止、删除一个镜像能跑多个容器。Dockerfile文本脚本自定义构建镜像的步骤。仓库 Registry存放镜像的平台官方公共仓库Docker Hub。三、docker engine配置1、registry-mirrors镜像加速源从上到下依次尝试Docker 遇到403401权限拒绝不会自动切换下一个镜像源直接终止拉取流程只有超时才会切换Docker 官方公有镜像仓库国内可能访问不了可使用以下国内镜像加速器。2、insecure-registries信任 HTTP 私有仓库自建 Harbor 内网地址{builder: {gc: {defaultKeepStorage: 20GB,enabled: true}},experimental: false,registry-mirrors: [https://docker.1panel.live,https://docker.1ms.run,https://dockerproxy.com,https://mirror.ccs.tencentyun.com],insecure-registries: [192.168.1.100:80],}四、Docker Hub / 阿里云 ACR / 自建 Harbor 仓库 对比1、基础定位区分Docker HubDocker 官方公有镜像仓库全球公共镜像源头阿里云 ACR云厂商托管式镜像仓库底层封装 Harbor公有 私有一体 SaaS 服务自建 Harbor自己 Linux 服务器部署开源私有仓库完全自主可控2、使用流程搭配主流企业方案方案 1个人本地开发最简单Docker Desktop 国内镜像加速器中科大 / 阿里 mirror只用 Docker Hub 拉公共镜像不存私有业务镜像。方案 2阿里云上业务部署本地 Docker Desktop 打包镜像 → push 到阿里云 ACR 私有仓库 → 阿里云 ECS/ACK 拉取镜像部署。方案 3企业内网生产环境最常用本地电脑打包镜像 → 推送内网自建 Harbor → 内网 K8s / 业务服务器从 Harbor 拉取运行。3、快速选型建议只是学习、只拉 nginx/mysql 等开源镜像 → Docker Hub 国内镜像加速器公司业务跑阿里云、没人维护服务器、预算充足 → 阿里云 ACR企业内网集群、镜像量大、数据保密、有运维人员 → 自建 Harbor 私有仓库三、常用基础命令#查看系统内核bashuname -r#查看系统版本bashcat /etc/os-release#查看docker信息。可以验证加速器是否生效,往下滚动看到 Registry Mirrors 出现你的阿里云地址即成功bashdocker info#帮助docker --help2、镜像命令#查看所有本地主机上的镜像docker images#下载镜像docker pull 镜像名#删除镜像docker rmi -f 镜像名或镜像ID3、容器命令#新建容器并启动 docker run执行过程执行run后docker开始在本机寻找镜像有则使用这个镜像运行没有则到镜像仓库下载默认docker hub,配置云镜像加速服务后就到阿里云镜像库下载镜像库找到镜像则下载找不到则报错docker run [可选参数] 镜像[参数说明]--name容器名称-d 后台方式运行-it 使用交互方式运行-p 制定容器的端口 -p 主机端口:容器端口。 如-p 8080:8080#启动并进入容器docker run -it 镜像名或镜像ID /bin/bashls#启动nginx镜像docker run -d --name 容器名称 -p 3344:80 镜像名或镜像ID 注意后台直接运行网站不用进 bash,如果加/bin/bash进入容器后 Nginx 不会自动启动需要手动执行nginx -g daemon off;#容器停止并从中退出exit#容器不停止退出快捷键CtrlPQ#查看当前运行中的容器docker ps#查看全部容器包括历史运行过的容器docker ps -a#删除容器docker rm 容器ID#强制删除容器docker rm -f 容器ID#启动和停止容器docker start 容器IDdocker restart 容器IDdocker stop 容器IDdocker kill 容器ID#进入容器终端进入正在运行中的容器docker exec -it 容器ID/容器名 /bin/bashls# 进入容器终端进入正在运行中的容器部分系统没有bash用 shdocker exec -it 容器ID/容器名 sh4、其它常用命令#docker run -d 容器名问题docker ps发现容器停止了。如果docker使用后台运行就必须要有一个前台进程docker发现没有应用就会自动停止。即容器启动后发现没有提供服务就会立即停止#查看日志docker logs -tf tail 10 容器ID#查看容器中的进程dokcer top 容器ID#查看镜像的元数据docker inspect#进入容器终端进入正在运行中的容器docker exec -it 容器ID #进入容器后开启一个新的终端docker attach 容器ID #进入正在执行的终端不会启动新的进程#从容器内拷贝文件到主机上。docker cp 容器ID:容器内路径 目的主机路径 #在主机上执行#查看CPU、内存状态docker stats#提交镜像docker commit -m提交的描述信息 -a作者 容器ID 目标镜像名:[tag]四、部署nginxdocker pull nginxdocker run -d --name nginx01 -p 3344:80 镜像名或镜像IDdocker run -d --name nginx02 -p 3345:80 镜像名或镜像IDdocker run -d --name nginx03 -p 3346:80 镜像名或镜像ID运行测试curl localhost:3344docker exec -it nginx01 /bin/bashwhereis nginx五、部署Elasticsearch Kibana#启动Elasticsearch因启动后比较耗内存用ES_JAVA_OPTS参数限制内存占用。本地没有镜像会自动下载再启动docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e discovery.typesingle-node -e ES_JAVA_OPTS-Xms512m -Xmx512m -e xpack.security.enabledfalse -e xpack.security.enrollment.enabledfalse -e xpack.security.http.ssl.enabledfalse -e xpack.security.transport.ssl.enabledfalse elasticsearch:8.17.0ES8 默认开启 SSL HTTPS 身份验证直接用 http://localhost:9200 访问会被强制断开连接。用-e xpack.security.enabledfalse -e xpack.security.enrollment.enabledfalse -e xpack.security.http.ssl.enabledfalse -e xpack.security.transport.ssl.enabledfalse参数 关闭 xpack 安全、SSL、认证后可正常访问 http://localhost:9200。#安装Kibana六、docker build Dockerfile 与 docker commit 对比1、核心本质区别Dockerfile脚本化构建每一步操作可记录、可复用、可版本管理。构建过程透明、可复现企业标准生产打包方案。docker commit对运行 / 停止后的容器做快照把容器读写层改动打包成新镜像纯手动操作无操作记录仅适合临时调试。2、实际使用场景commit临时保存当前容器的状态调试好的环境进容器手动装依赖、改配置、修复 bug不想下次重新操作commit 保存快照。commit 生成镜像后 docker save 打成 tar 包拷贝到无外网服务器导入使用。例ubuntu 容器手动装了 nginx、插件提交成镜像下次 run 直接带环境。快速制作临时镜像测试验证。Dockerfile项目业务镜像打包Java、前端、Nginx 网站等线上生产环境交付镜像团队多人协作开发CI/CD自动打包推送镜像仓库3、使用边界区分本地调试、临时快照、应急备份 → 用 docker commit项目正式打包、线上部署、团队协作 → 必须用 Dockerfile docker build七、容器数据卷如果数据在容器中容器删除数据就会丢失。容器数据卷作用实现数据在本地持久化存储和容器间的数据共享。挂载持久化目录方式1、指定路径挂载绑定主机目录直接使用命令挂载(目录映射挂载实现主机目录和容器目录内的双向数据同步。平常在本地修改容器会自动同步)docker run -it p 主机端口:容器端口 -v 主机目录:容器目录 容器ID /bin/bashdocker run -d p 8080:80 -v 主机目录:/home/test 容器IDdocker volume ls实例代码安装nginxdocker run -d -p 8080:80 -v ${PWD}/html:/usr/share/nginx/html nginxdocker run -d -p 8080:80 -v /home/html:/usr/share/nginx/html nginx安装mysqldocker pull mysql:5.6docker run -d --name mysql01 -p 3310:3306 -v ${PWD}/dockerdata/mysql/conf:/etc/mysql/conf.d -v ${PWD}/dockerdata/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 mysql:5.62、匿名挂载和匿名挂载(1)、具名挂载 建议使用docker run -d --name nginx_juming -P -v 数据卷名:/etc/nginx nginxdocker run -d --name nginx_juming -P -v juming_nginx:/etc/nginx nginx(2)、匿名挂载docker run -d --name nginx_niming -P -v /etc/nginx -v /usr/share/nginx/html nginx(3)、linux主机查看数据卷挂载信息docker volume lsdocker volume inspect 数据卷名(执行后显示信息中的Mountpoint: /var/lib/docker/volumes/数据卷名/_data就是持久化文件目录)(4)、windos主机查看匿名挂载和匿名挂载持久化文件WinE 打开文件资源管理器顶部地址栏粘贴这条路径回车\\wsl$\docker-desktop\mnt\docker-desktop-disk\data\docker\volumes文件夹名是一长串随机字符 匿名挂载卷点开任意卷里的 _data就是容器持久化文件)3、参数 --volumes-from的常用应用场景1、多服务容器共用数据目录Nginx PHP-FPM 共享网站代码2、数据备份容器临时容器挂载数据卷打包备份3、统一日志收集、静态资源共享业务容器MySQL、Redis、应用里面有持久化数据卷不能直接进宿主机目录打包权限、文件锁、路径麻烦。这时--volumes-from 可以用来启动一个一次性临时容器直接复用业务容器全部数据卷在临时容器内部执行打包、导出备份操作操作完容器直接销毁不影响正在运行的业务。1、 启动mysql数据存在命名卷 mysql-datadocker run -d --name mysql-db -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 mysql:5.62、启动临时备份容器关键 --volumes-fromdocker run --rm --volumes-from mysql-db:ro -v /宿主机备份目录:/backup alpine tar -czf /backup/mysql_back_$(date %Y%m%d).tar.gz /var/lib/mysqlalpine 是一个超轻量级 Linux 系统镜像基于 Alpine LinuxDocker 官方常用极简镜像体积只有 5MB 左右对比 centos、ubuntu 几百 MB启动极快自带基础命令tar、cp、ls、rm 等刚好满足备份打包需求没有 MySQL、Java 等多余服务专门用来做临时工具容器。八、DockerFile构建docker镜像的构建文件通过这个脚本可以生成镜像。1、指令核心区分(1)构建时执行build 阶段FROM / LABEL / RUN / COPY / ADD / ARG / WORKDIR / USER / ONBUILD / SHELL(2)仅定义元数据运行时生效不生成层EXPOSE / ENV / VOLUME / CMD / ENTRYPOINT / HEALTHCHECK / STOPSIGNAL(3)RUN vs CMD vs ENTRYPOINTRUN在执行 docker build 打包镜像时执行执行结果永久保存到镜像内。安装软件。RUN 完整执行流程:Docker 基于当前已有镜像层创建临时读写容器在临时容器内执行 RUN 后面的 shell/exec 命令安装软件、编译命令执行完毕把容器内变更保存为新镜像层删除临时构建容器继续执行下一条 Dockerfile 指令CMD/ENTRYPOINT启动容器时才执行不改变镜像本身。-------------DockerFile---------------------#指令用大写# 基础镜像FROM centos:7#镜像维护者信息MAINTAINER run21com#RUN yun -y intall vimRUN yun -y intall net-tools#ENV MYPATH /usr/local#工作目录默认是根目录可以指定进入系统后的默认目录WORKDIR MYPATH#COPY readme.txt /usr/local/readme.txt#添加文件压缩文件自动解压ADD jdk-8ull-linux-64.tar.gz /usr/local/ADD apache-tomcat-9.0.22.tar.gz /usr/local/ENV JAVA_HOME /usr/local/jdk1.8.0_11ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22ENV PATH SPATH: $JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin#指定暴露端口EXPOSE 8080# 挂载持久化目录以下是匿名挂载方式VOLUME [/data/v_logs, /data/v_upload]#指定容器启动后要运行的命令CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh tail-F /url/local/apache-tomcat-9.0.22/bin/logs/catalina.out-------------DockerFile---------------------以上脚本保存为DockerFile文件,官方命名构建时会自动寻找这个文件就不需要-f文件了。bash#构建镜像docker build -f dockerfile文件路径 -t 镜像名:版本 .docker build -t mytomcat:1 . #DockerFile文件,官方命名DockerFile可以省略-f dockerfile文件路径docker build -f dockerfile -t mytomcat:1.0 .#发布镜像# 先进入阿里云镜像容器服务》创建命名空间》创建镜像仓库docker login -u 用户名docker tag mytomcat:1.0 mynane/mytomcat:1.0docker tag [源镜像名:标签] [新镜像仓库/用户名/镜像名:新标签]docker push mynane/mytomcat:1.0#运行镜像生成容器01dcoker run -d -p 9090:8080 --name mytomcat01 -v /home/jason/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test mytomcat:1.0#发布项目web项目发布到/home/jason/build/tomcat/test#查看镜像的构建历史具体怎么一步一步构建的docker history docker01#创建容器02 参数--volumes-from 多容器复用一整套挂载dcoker run -it --name docker02 --volumes-from docker01 i/centos ##导出导入镜像作用场景本地镜像离线迁移。无镜像仓库、内网隔离、断网环境把本地镜像打包成压缩文件拷贝到另一台机器导入。docker save导出本地镜像 → tar 离线包docker loadtar 文件导入本机 Docker 镜像列表#导出 tar 包docker save -o myapp_v1.tar tom123/myapp:v1#压缩打包节省磁盘docker save tom123/myapp:v1 | gzip myapp_v1.tar.gz#导入 tar 包docker load -i myapp_v1.tar#导入压缩包gzip -d -c myapp_v1.tar.gz | docker load九、Docker网络安装docker,就会有一个docker0网卡。启动容器后docker给每个容器分配IP同网段主机(docker0)和容器之间网络互通容器和容器之间网络互通1、自定义网络容器互联#查看网络docker network ls#创建网络docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.1.1 mynet#指定同个网络实现ping容器名互通 ping tomcat01,ping tomcat02docker run -d -P --name tomcat01 --net mynet tomcatdocker run -d -P --name tomcat02 --net mynet tomcatdocker exec -it tomcat01 ping tomcat02(或IP)docker exec -it tomcat02 ping tomcat01(或IP)2、网路连通不同网络的容器docker run -d -P --name tomcat03 tomcatdocker run -d -P --name tomcat04 tomcat#将容器tomcat03放到mynet网络下后tomcat03容器有2个IPdocker connect mynet tomcat03#将容器tomcat04放到mynet网络下后tomcat04容器有2个IPdocker connect mynet tomcat04十、Docker ComposeDocker Compose 是一个用于定义和运行多容器 Docker 应用的工具Dockerfile在编译/构建阶段用于构建镜像。定义如何从零到一创建一个容器镜像。针对单个容器描述其内部环境和配置。管 “内部” —— 我的应用环境怎么装。Docker Compose 在部署/运行阶段。用于运行容器。定义如何部署、配置和启动一个或多个已经存在的镜像。针对多个容器组成的应用描述它们之间的协作关系。管 “外部” —— 我的应用和数据库、缓存怎么连怎么一起跑。