Docker 笔记
什么是Docker?#
官方介绍
- we help developers and development teams build and ship apps. 我们帮助开发人员和开发团队构建和发布应用
- we have a complete container solution for you - no matter who you are and where you are on your containerizationjourney.
我们为你提供了一个完整的容器解决方案,不管你是谁,不管你在哪,你都可以开始容器的的旅程。
官方定义: docker是一个容器技术。docker引擎:容器(container)(软件redis mysql tomcat rabbitmq ..) ---->构建 发布应用
通俗理解: docker是一个软件容器平台 | 引擎 | 技术
Docker优势#
-
环境一致、高效迁移
如︰我们一个java Web应用程序涉及很多东西,比如jdk、tomcat、mysql等软件环境。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker则将程序以及使用软件环境直接绑定在一起,无论在那个机器上保证了环境一致。
-
进程级隔离、容器独立
如︰服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。
-
镜像机制、便于部署
公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器。在没有Docker的情况下
要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给跑多少容器,极大地提高了部署效率。
Docker和虚拟机 区别#
比较上面两张图,我们发现虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。
另外在调用宿主机的CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存->虚拟物理内存->真正物理内存,但是Docker是利用Docker Engine去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存。
传统虚拟机 | Docker容器 | |
---|---|---|
磁盘占用 | GB | MB |
CPU内存占用 | 虚拟OS非常占用CPU和内存 | Docker引擎占用极低 |
启动速度 | (从开机到运行项目)几分钟 | (从开启容器到运行项目)几秒 |
安装管理 | 需要专门的运维技术 | 安装、管理方便 |
应用部署 | 每次部署都费时费力 | 从第二次部署开始轻松简洁 |
耦合性 | 多个应用服务安装到一起 | 每个应用服务一个容器,达成隔离 |
系统依赖 | 无 | 需求相同或相似的内核,目前推荐是Linux |
Docker 核心概念#
- dockerfile:docker生成镜像配置文件,用来书写自定义镜像的一些配置
- tar:一个对镜像打包的文件,日后可以还原成镜像
镜像 Image#
一个镜像就代表一个软件。
-
镜像是只读的,不能进行写操作。
-
镜像是原子化的 逻辑镜像=物理镜像+环境镜像+OS镜像 逻辑镜像是应用模板
容器 Container#
一个镜像运行一次就会生成一个容器,容器就是一个运行的软件服务
- 容器可读可写
容器本质上是多个镜像加载到内存中的副本的组合,因此容器是OS级别的隔离,最终表现为精简的OS+运行需要的环境+对应的应用,比如tomcat容器就是精简的OS+jdk+tomcat。 镜像每次运行之后就产生一个容器,容器就是镜像实例,也就是应用。
精简的linux os + 软件服务 ===》容器(运行的镜像)
仓库 Repository#
仓库是用来存储所有镜像/软件的位置,类似于maven仓库,也是镜像下载和上传的位置,有远程和本地仓库之分。
- 本地仓库:用来存储在使用docker过程中的相关镜像。
数据卷 volume#
宿主机目录和容器内目录进行绑定以同步。只有在创建容器的时候才可以进行绑定
- 作用:用来实现容器中数据和宿主机中数据进行映射的(同步的)
镜像相关操作#
0. 辅助命令#
docker version
:用来查看docker客户端引擎 和 server端引擎版本信息docker info
:用来查看docker引擎详细信息docker --help
:用来帮助信息
1. 镜像 image#
-
查看当前本地仓库中存在哪些镜像:
docker image ls
或者docker images
docker images 【-q】只显示image-id
定位一个镜像:
名称:tag
,比如tomcat:8.0
-
下载镜像\从远程仓库拉取镜像到本地仓库
docker pull 镜像名称
-
搜索镜像
docker search 镜像名
docker search tomcat
:只能看当前镜像是否存在,不能列出版本 -
删除镜像
docker image rm 镜像名(name:tag) | 镜像 id # 正常删除,要求必须是没有运行过的镜像 docker image rm -f 镜像名(name:tag) | 镜像 id # 强制删除 docker image rm -f $(docker images -q) # 删除全部镜像
2. 容器 Container#
操作容器命令格式:docker 命令 [选项]
-
运行容器
docker run 镜像名 | 镜像id # 直接这么写,这种方式直接运行容器,容器内无法访问 【-p】设置宿主机端口和容器的映射关系,如: -p 8080(宿主机):8080(容器) 【-d】后台启动该服务 【--name】容器名称 如:docker run-d -p 8080:8080 --name tomcat01 tomcat:8.0
-
进入容器内部
docker exec -it 容器名/id bash
-
复制文件
docker cp 容器名/id:文件路径 文件路径 #从容器复制文件到宿主主机 docker cp 文件路径 容器名/id:文件路径 #从宿主主机复制文件到容器
-
移除容器
docker rm 容器id|name # 删除已经停止的容器 docker rm -f 容器id|name # 强制删除,即使正在运行也可删除 docker rm -f $(docker ps -aq) # 全部删除
-
查看docker引擎中运行容器有哪些?
docker ps # 查看当前docker引擎中正在运行的容器 docker ps -a # 查看所有容器(运行 停止都显示) docker ps -aq # 查看所有的容器id
CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|---|---|---|---|---|---|
d7f0a664400f | tomcat:8.0 | "catalina.sh run" | 40 seconds ago | Up 38 seconds | 8080/tcp | gracious_bose |
-
启动容器
docker start 容器名/id
-
停止容器
docker stop 容器名/id
-
重启容器
docker restart 容器名/id
-
暂停/回复容器
docker pause/unpause 容器名/id
-
查看容器内应用的信息
docker inspect 容器名/id
-
将容器提交/打包为新的镜像 添加到本地仓库中
docker commit 容器名/id 镜像名:版本 【-m】后面加描述信息x
-
查看容器内部日志
这里的日志就是应用的输出
docker logs 【-f】实时刷新 容器名/id
-
杀死容器
docker kill id|name
-
打包镜像
docker save 镜像名 -o
-
载入镜像
docker load -i 名称.ar
将save、load 俩理解为镜像的备份和恢复
3. 数据卷 Volume#
作用:容器中数据和宿主机中数据进行映射同步( 数据共享)
注意:数据卷使用必须在容器首次启动时使用 -v
参数设置
docker run -v
1、使用绝对路径设置数据卷
docker run -v 宿主机绝对路径:容器内路径
ro: readonly 如果在设置数据卷时指定ro,代表日后容器内路径是只读的
Note:这种方式会将容器路径的原始内容全部清空,始终以宿主机路径为主
2、使用别名方式设置数据卷
docker run -v aa:/usr/local/tomcat/webapps
aa是什么?
- aa代表docker数据卷中别名。注意:这个别名如果存在docker直接使用,aa不存在自动创建
- 使用别名方式保留容器路径原始内容,前提是别名对应路径不能存在内容
- 注意:docker根据别名创建目录默认在:
/var/lib/docker/volumes/
3、别名到底是什么?
别名代表一个docker自身维护数据卷
-
查看所有docker维护数据卷
docker volume ls
-
查看数据卷详细内容
docker inspect 数据卷别名、网桥名称、容器名称 docker volume inspect xxx 查看xxx数据卷详细
-
删除一个数据卷
docker volume rm 数据卷别名
-
创建一个别名数据卷
docker volume create 数据卷别名
Dockerfile#
Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件。Dockerfile是一个文件,内容是镜像产生需要执行的语句。 Dockerfile中一个命令或注释独占一行
- 为什么使用Dockerfile构建镜像?
答:官方镜像确实足够好,但是如果我们想要属于自己业务的镜像,此时就需要自定义。
-
如何通过Dockerfile构建自己的镜像?
-
在指定位置创建一个Dockerfile文件,编写Dockerfile相关语法
-
通过Dockerfile构建镜像
docker build -t aaa:1.0 .(指定Dockerfile文件所在位置)
-
- FROM
FROM 镜像名:版本
基于这个镜像进行构建,必须作为Dockerfile的第一个指令出现。
- RUN
RUN 命令
在当前工作目录下执行后面的命令
- WORKDIR
WORKDIR 目录
相当于cd到指定目录,如果这个目录不存在,它将被创建。
且进入容器时会进入到最后指定的目录
- ENV
ENV 变量=值
设置环境变量,用的时候这样:$变量。
- ADD
ADD 本地文件路径/远程文件url 容器中路径
复制本地文件或远程文件到容器指定路径的中
- CMD
CMD 命令
指定容器启动时执行的命令,只有最后一个(所有容器Dockerfile的CMD的最后一个)才会生效。
- #
注释
docker-compose#
用来启动容器,不用我们关心启动顺序了。 把它下载到/usr/local/bin目录下并改名为docker-compose,然后增加执行权限。 写好docker-compose.yml(这个文件里的内容和docker run的东西是等价的),再启动项目。
#启动项目
docker-compose
【-f docker-compose.yml的路径】
【-d 】(后台启动)
up
#关闭用docker-compose启动的所有容器
docker-compose
【-f docker-compose.yml的路径】
down
docker-compose文件模板
#docker-compose的版本
version: "3.8"
#一组容器
services:
#容器(自定义),默认生成的容器名为:项目名(docker-compose.yml所在目录的目录名)_容器_序号。
container1:
#镜像
image: image1
#通过Dockerfile构建镜像然后运行
build: /dir/of/Dockerfile
#容器名
container_name: container-name
#端口映射(可多个) 宿主主机端口:容器端口
ports:
- 80:80
#数据卷(可多个) 宿主主机文件(必须已存在):容器文件
volumes:
- /path/in/host:/path/in/container
#环境变量(可多个)
environment:
- var=value
#覆盖容器启动时执行的命令
command: new-command
#先启动这些,再启动本身.
depends_on:
- 服务1
Docker运行常用服务#
Docker运行Mysql#
1、启动mysql,开放端口映射(3306),指定root用户密码才行
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.6
-e
:环境--restrart=always
:总是运行-v msqlData:/var/lib/mysql
:数据卷持久化数据到宿主机-d
:开启后台运行--name
:指定名称
2、进入mysql容器:
docker exec -it 容器名称|容器id bash
3、导出sql文件来备份数据
-
备份全部数据
docker exec (mysql容器id) sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
-
备份指定库中数据
docker exec (mysql容器id) sh -c 'exec mysqldump --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/一个库名-databases.sql
-
备份指定库中结构不要数据
docker exec (mysql容器id) sh -c 'exec mysqldump --no-data --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/一个库名.sql
-
使用nacivat连接远程数据库,直接备份
Docker运行Redis#
1、启动redis,映射端口(6379)
docker run -p 6379:6379 redis:5.0.12
-d
:后台启动--name
:指定名称--restart=always
:总是启动
2、redis支持内存数据持久化:
- rdb持久化:快照,redis服务将某一时刻数据以快照文件形式写入到磁盘
- aof持久化:redis服务器将所有的redis客户端的写操作以命令方式记录到日志文件中,AOF更加安全
开启持久化:
docker run --name redis03 -d -p 6379:6379 --restart=always redis:5.0.12 redis-server --appendonly yes
注意:只要开启了持久化,将持久化文件生成容器中的 /data/
目录中。
开启持久化,映射数据文件外部:
docker run --name redis03 -d -p 6379:6379 --restart=always -v /root/redisdata:/data redis:5.0.12 redis-server --appendonly yes
3、自定义配置文件启动redis
-
如何获取redis配置文件
- 第一种方式:下载对应版本找到配置文件,进行修改(bind后改成0.0.0.0),使用完整配置文件启动
- 第二种方式:创建指定文件名称(比如redis.conf),直接书写修改属性即可,推荐!
-
上传配置文件到宿主机指定目录
/root/redisconf/redis.conf
-
数据卷挂载配置启动
docker run --name redis03 -d -p 6379:6379 --restart=always -v /root/redisconf:/data redis 5.0.12 redis-server /data/redis.conf
Docker运行Nginx#
1、运行nginx
docker run -p 80:80 nginx:1.19.10
2、启动nginx,映射端口,后台启动,总是启动,指定名称,加载指定nginx配置启动
-
实现反向代理,负载均衡
拷贝文件:
docker cp 容器id:/etc/nginx/nginx.conf /root/nginxconf
docker run -p 80:80 -d --restart=always --name nginx04 -v /root/nginxconfig/nginx.conf:/etc/nginx/nginx.conf nginx:1.19.10
-
nginx服务器
docker run -p 8081:80 -d --restart=always --name nginx05 -v /root/html:/usr/share/nginx.html nginx:1.19.10
Docker运行Elasticsearch#
1、运行es
启动es,映射端口(9200(http) 9300(tcp))
docker run -p 9200:9200 9300:9300 elasticsearch:6.8.10
2、启动es,映射端口,后台启动,总是启动,指定名称
docker run -p 9200:9200 9300:9300 -d --restart=always --name=es elasticsearch:6.8.10
3、启动es,映射端口,后台启动,总是启动,指定名称,通过数据卷映射数据到宿主机,容器内数据存储目录(/usr/share/elasticsearch/data
)
docker run -p 9200:9200 9300:9300 -d --restart=always --name=es -v esdata:/usr/share/elasticsearch/data elasticsearch:6.8.10
4、(同上)通过数据将配置文件映射宿主机
docker run -p 9200:9200 9300:9300 -d --restart=always --name=es -v esdata:/usr/share/elasticsearch/data -v /root/esconfig/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:6.8.10
注意:ES启动如果没有指明单机方式运行,默认是使用集群方式启动,如果使用集群方式启动,在启动时会出现如下错误:
max virtual memory areas vm.max_map_count [65520] is too low, increase to at least [262144]
解决方案:在宿主机中执行如下操作
-
ci /etc/sysctl.conf
加入如下配置:vm.max_map_count=262144
-
sysctl -p
使配置生效
5、设置ik分词器
访问github:搜索elasticsearch-analysis-ik,选择medcl,要求与elasticsearch版本保持一致
6、启动kibana服务,开放端口,指定kibana连接es服务
docker run -p 5601:5601 -d --name kibana -e ELASTICSEARCH_URL=http://你的url:9200 --restart=always kibana:6.8.10
注意:默认链接就是localhost:9200 ,es,kibana在一台机器上
作者:stdxiaozhang
出处:https://www.cnblogs.com/stdxiaozhang/p/16992594.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
吼吼,如果对你有帮助的话,可以点个赞呀!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~