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就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。

    img

  • 镜像机制、便于部署

    公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器。在没有Docker的情况下

    要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给跑多少容器,极大地提高了部署效率。

Docker和虚拟机 区别#

img

比较上面两张图,我们发现虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。

另外在调用宿主机的CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存->虚拟物理内存->真正物理内存,但是Docker是利用Docker Engine去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存

传统虚拟机 Docker容器
磁盘占用 GB MB
CPU内存占用 虚拟OS非常占用CPU和内存 Docker引擎占用极低
启动速度 (从开机到运行项目)几分钟 (从开启容器到运行项目)几秒
安装管理 需要专门的运维技术 安装、管理方便
应用部署 每次部署都费时费力 从第二次部署开始轻松简洁
耦合性 多个应用服务安装到一起 每个应用服务一个容器,达成隔离
系统依赖 需求相同或相似的内核,目前推荐是Linux

Docker 核心概念#

img

  • 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是什么?

  1. aa代表docker数据卷中别名。注意:这个别名如果存在docker直接使用,aa不存在自动创建
  2. 使用别名方式保留容器路径原始内容,前提是别名对应路径不能存在内容
  3. 注意:docker根据别名创建目录默认在:/var/lib/docker/volumes/

3、别名到底是什么?

别名代表一个docker自身维护数据卷

  1. 查看所有docker维护数据卷

    docker volume ls
    
  2. 查看数据卷详细内容

    docker inspect 数据卷别名、网桥名称、容器名称
    docker volume inspect xxx 查看xxx数据卷详细
    
  3. 删除一个数据卷

    docker volume rm 数据卷别名
    
    
  4. 创建一个别名数据卷

    docker volume create 数据卷别名
    

Dockerfile#

Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件。Dockerfile是一个文件,内容是镜像产生需要执行的语句。 Dockerfile中一个命令或注释独占一行

  • 为什么使用Dockerfile构建镜像?

​ 答:官方镜像确实足够好,但是如果我们想要属于自己业务的镜像,此时就需要自定义。

  • 如何通过Dockerfile构建自己的镜像?

    1. 在指定位置创建一个Dockerfile文件,编写Dockerfile相关语法

    2. 通过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支持内存数据持久化:

  1. rdb持久化:快照,redis服务将某一时刻数据以快照文件形式写入到磁盘
  2. 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

  1. 如何获取redis配置文件

    1. 第一种方式:下载对应版本找到配置文件,进行修改(bind后改成0.0.0.0),使用完整配置文件启动
    2. 第二种方式:创建指定文件名称(比如redis.conf),直接书写修改属性即可,推荐!
  2. 上传配置文件到宿主机指定目录 /root/redisconf/redis.conf

  3. 数据卷挂载配置启动

    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配置启动

  1. 实现反向代理,负载均衡

    拷贝文件: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
    
  2. 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]

解决方案:在宿主机中执行如下操作

  1. ci /etc/sysctl.conf 加入如下配置:

    vm.max_map_count=262144
    
    
  2. 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 国际」许可协议进行许可。

吼吼,如果对你有帮助的话,可以点个赞呀!

posted @   啊哈小张同学  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示