Docker笔记

重要概念
  • 仓库
    • 远程仓库:docker公司在世界范围内维护一个中心 用来集中管理docker中镜像 --> 搜索仓库 docker hub
    • 本地仓库:用来存储自己使用过的镜像, 在中心仓库下载镜像到本地仓库 /var/lib/docker
  • 镜像 image
    • 定义:一个镜像就是一个软件 mysql镜像 tomcat镜像 jdk镜像 redis 镜像。。
    • 特点: 镜像是只读 不能进行写操作
  • 容器 container
    • 定义: 镜像没运行一次会生成一个容器 一个容器代表一个正在运行的软件服务
    • 特点:容器可读写
操作
  • 镜像操作

    #1 查看镜像 -- 本地
    docker images
    
    #2 搜索镜像-- 首先本地 -- 默认地址
    docker search tomcat 
    
    #3 找到所有的镜像 --拉取 pull  拉取到本地宿主机
    docker pull tomcat # 最新版本
    docker pull tomcat:7 # 指定版本
    
    # 删除镜像
    docker rmi 镜像id
    
  • 容器操作

    • 命令格式 docker 命令【选项】
    # 根据tomcat 镜像 创建一个myTomcat容器
    docker create --name=myTomcat tomcat # 只是创建,没有运行
    
    # 查看容器
    docker ps # 查看在运行的容器
    docker ps -a # 查看所有的容器
    # 容器筛选
    docker ps | grep tomcat 
    
    # 运行 启动容器
    docker start myTomcat # start后面可以跟容器的id 或者 name
    # 停止容器
    docker stop myTomcat # stop后面可以跟容器的id 或者 name
    # 重启容器
    docker restart myTomcat
    # 暂停/恢复
    docker pause/unpause myTomcat
    
    # 删除没有运行的容器
    docker rm 容器id 或者名字
    # 删除在运行的容器
    docker rm -f 容器id 或名字
    
    # 删除所有容器
    # 先停止所有容器
    docker stop $(docker ps -a -q)
    # 结束容器
    docker kill 名称或id
    # 删除
    docker rm $(docker ps -qa)  # windows 下使用有问题
    #删除所有镜像
    docker rmi $(docker images -q)
    
    • 运行
    #1- 查看docker run 命令-- 创建并且启动容器
    docker run -- help
    	1-判断本地是否有这个镜像 -- 如果没有会自动pull
    	2-创建容器
    	3-运行容器
    	
    docker run 参数
    	-i # 运行容器
    	-t #容器启动后 进入命令行
    	-v #目录映射(共享目录) --挂载  -v 宿主机目录:容器的目录 
    	-d #守护进程 -- 后台运行
    	-p #端口映射 		-p 宿主机的端口:容器的端口-应用默认的端口
    	例:如果容器里面有tomcat, 本机windows想访问: docker tomcat 端口号8080 需要在虚拟机映射一个端口9099
    	
    # -p 宿主机端口: 容器端口(固定)  -v 宿主机位置:容器位置 
    docker run -id --name t2 -p 8090:8080 -v /usr/lovy:/usr/local/tomcat/webapps tomcat	
    
    	
    #2- 创建容器,并且进入命令行 --进入容器
    docker run -di --name=mytomcat2 tomcat
    docker run -it --name=mytomcat tomcat /bin/bash
    
    #3 进入容器    /bin/bash/ 进入命令行模式
    docker exec -it tomcat1  /bin/bash
    	-i 		以交互模式运行容器,通常与-t一起使用
    	-t 		分配一个伪终端  shell窗口  bash
    
    #4 查看日志
    docker logs 容器id或名称
    	-t			加入时间戳
    	-f			跟随最新的日志打印
    	-tail	数字 显示最后多少条
    
    #5 容器与宿主机之间的复制文件
    docker cp  文件|目录  容器id:容器路径   --- 将宿主机复制到容器
    docker cp 容器id:容器内资源路径 宿主机目录路径  --- 讲容器内资源拷贝到主机上
    
    #6 部署web项目 war包项目
    	a.将 test.war上传到服务器
    	b.通过docker cp命令将test.war复制到 tomcat的webapps目录中即可
    	c.使用ip端口进行测试
    
问题
  • tomcat:8.0 默认用户 密码 需要自己添加

    • 修改容器内部 /usr/local/tomcat/conf/tomcat-users.xml 文件

      • 使用docker cp 把文件先拷贝到本机 修改完之后在拷贝到容器

      • 修改内容<role rolename="manager-gui"/> <user username="admin" password="admin" roles="manager-gui"/>

    #1 查看容器内运行进程
    docker top  容器id或名称
    
    #2 查看容器内部细节
    docker inspect 容器id
    
    #3 容器数据卷(volume)机制
    	a.数据卷 Data volume
    	作用: 用来实现容器中数据和宿主机中数据进行映射的(同步)
    	注意: 数据卷必须在容器首次启动时设置
    	使用: docker run -v 宿主机目录:容器目录
    	
    	1.使用绝对路径设置数据卷
    		docker run -v 宿主机绝对路径:容器绝对路径:ro 
    			ro: read only 如果设置数据卷时指定ro,代表日后容器内路径是只读的
              注意:这种方式将容器路径的原始内容全部清空,始终以宿主机路径为主
        2.使用别名方式 设置数据卷
        	docker run -v   aa:/usr/local/tomcat/webapps 
        		aa:
        			代表docker数据卷的别名
        			注意:如果别名存在,直接使用;否则自动创建
        			使用别名方式保留容器路径原始内容,前提别名对应路径不能存在内容	
        	    根据别名创建的目录 默认在 /var/lib/docker/volumes/aa 【仅限linux】
        【数据 最好方法数据卷】比如 mysql数据
    
    #1 把容器打包成一个新的镜像
    a.容器可读可写  基于这个特性就可以对容器进行自己深度定制
    docker commit -m "描述信息" -a "作者信息" (容器id或名称) 打包的镜像名称:标签 
    
    #2 镜像备份 还原
    docker save 镜像名:tag -o 名称.tar   # 名称最好带上版本号
    docker load -i 镜像名.tar
    

Docker镜像原理

  • Imagej镜像
    • 容器独立操作系统(精简linux操作系统+软件服务)===》镜像运行 ==》镜像(操作系统 + 软件文件)
  • 镜像 是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件。
    • UnionFS: 联合文件系统 叠加文件系统 ;Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。这种文件系统特性:就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
      • bootfs ( boot file system )主要包含bootloader和kernel , bootloader主要是引导加载kernel , Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix系统是一样的,包含boot加载器( bootloader )和内核( kernel )。当boot加载完后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
      • rootfs ( root file system ),在boots之上,包含的就是典型的linux系统中的/dev , /proc, /bin , letc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/Centos等等。
      • 我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才20OMB?对于一个精简的os , rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs.
MySql 服务
  • 访问 docker hub

    • 搜索 mysql
    • 确定 版本
  • 下载

    • docker pull mysql:5.6
  • 运行

    • 启动 mysql 开放端口映射 3306

      • -e MYSQL_ROOT_PASSWORD=XX设置密码
      • -d 后台运行 --name指定名称 --restart=always跟随容器重启自启
      • docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d --name mysql01 --restart=always mysql:5.6
    • 数据卷持久化数据到宿主机(同步文件夹)

      • docker run -p3306:3306 -e MYSQL_ROOT_PASSWORD=root -d --name mysql02 --restart=always -v /root/data:/var/lib/mysql mysql:5.6

      • 【问题】这里数据卷 同步时,如果宿主机文件夹不全为空; 数据库存在混乱,源数据表会消失

      在这里插入图片描述

  • 数据备份

    • 数据卷备份

      • 数据卷备份是将底层文件进行备份,不利于数据迁移 和 备份;推荐使用sql文件形式备份数据
    • 数据库备份成 sql文件 mysqldump

      • 备份全部数据

        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/all-databases.sql
        
      • 导出指定数据库 不要数据

        docker exec mysql容器id sh -c 'exec mysqldump --no-data --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
        
    • 执行sql文件 到mysql中

      docker exec -i mysql容器id sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /root/xxx.sql
      
安装redis 服务
  • 搜索镜像

    • docker search redis
  • 拉取redis到本地

    • docker pull redis
  • 启动 redis 服务运行容器

    # 没有暴露外部端口
    docker run --name redis -d redis:tag		
    
    # 暴露外部宿主机端口为6379进行连接  数据内存--->持久化(快照文件aof文件【】)
    docker run --name redis01 -p 6379:6379 -d redis:tag
    
    docker run --name redis02 -p 6380:6379 redis:5.0.10 redis-server --appendpnly yes
    # 最终启动方式
    docker run --name redis03 -p 6381:6379 -v /root/redisdata:/data redis:5.0.10 redis-server --appendonly yes
    
    • redis持久化 aof rdb

      • rdb 快照redis服务器将某一个时刻数据以快照文件形式写入到磁盘(默认)
      • aof redis服务器将所有redis客户端的写操作以命令方式记录到日志文件中

      【注意】只要开启持久化,将持久化文件生成容器中 /data/ 目录中

  • 查看日志

    • docker logs -t -f 容器id|容器名称
  • 进入容器内部查看

    • docker exec -it 容器id|名称 bash
  • 加载外部自定义配置 启动redis容器

    # 默认redis官方镜像中没有redis.conf 配置文件 需要去官网下载指定版本的配置文件
    1. wget http://download.redis.io/releases/redis-5.0.8.tar.gz  下载官方安装包
    2. 将官方安装包中配置文件进行复制到宿主机指定目录中如 /root/redis/redis.conf文件
    3. 修改需要自定义的配置
    	bind 0.0.0.0 开启远程权限
    	appendonly yes 开启aof持久化  
    4. 加载配置启动
    docker run --name redis01 -v /root/redis.conf:/usr/redis.conf -p 6379:6379 -d redis redis-server /user/redis.conf
    
    # 容器内进入redis
    redis-cli
    
    # 自定义配置文件启动 redis
    1.
        a. 获取redis 官网下载,找到对应配置文件 进行修改  【使用完整的配置文件启动】
        b. 上传配置文件到宿主机指定目录 /root/rediscon/redis.conf
        c. 数据卷 挂载配置启动 【注意宿主机文件路径】
    docker run --name redis03 -d -p 6379:6379 --restart=always -v /root/redisconf:/data redis:5.0.14 redis-server /data/redis.conf
    
    2. 创建指定文件名称 直接书写修改属性即可
    
Nginx服务器
  • 搜索 docker hub nginx

  • 下载对应镜像

    • docker pull nginx:1.19:10
  • 运行nginx

    # a.启动nginx 映射端口(80)
    docker run -p 80:80 nginx:1.19.10
    # b.启动 映射端口 后台启动 总是启动 指定名称
    
    docker run -p 80:80 -d --restart=always --name nginx01 nginx:1.19.10
    
    # c.启动 映射端口 后台启动 总是启动 指定名称 加载指定nginx配置
    
    # 1.反向代理 负载均衡 把容器中的 nginx.conf 拷贝出来
    docker run -p 80:80 -d --restart=always --name nginx01 -v /root/nginxconfig/nginx.conf:/etc/nginx/nginx.conf nginx:1.19.10
    
    # 2.nginx服务器 挂载目录
    
      docker run -p 80:80 -d --restart=always --name ngxin02 -v 宿主机目录:/usr/share/nginx/html/ nginx:1.19.10
    

安装ElasticSearch服务

  • 搜索docker hub

  • 下载对应镜像

    • docker pull elasticsearch:6.8.10
  • 运行 es

    # 启动es 映射端口(9200 http) (9300 tcp)
    docker run -p 9200:9200 -p 9300:9300 elasticsearch:6.8.10
    # 启动es 映射端口 后台启动 总是启动 指定名称
    docker run -p 9200:9200 -p 9300:9300 -d --restart=always -name=es elasticsearch:6.8.10
    # 启动es  通过数据卷映射数据 容器存放目录(/usr/share/elasticsearch/data)
    docker run -p 9200:9200 -p 9300:9300 -d --restart=always -name=es -v 宿主机目录:/usr/share/elasticsearch/data elasticsearch:6.8.10
    
    # 启动es  通过数据卷映射配置 容器存放目录(/usr/share/elasticsearch/config/elasticsearch.yml)
    docker run -p 9200:9200 -p 9300:9300 -d --restart=always -name=es -v 宿主机目录:/usr/share/elasticsearch/data  -v 宿主机目录:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:6.8.10
    

    【注意】ES启动如果没有指明单击方式运行,默认使用集群方式启动,如果使用集群方式启动在启动时会出现如下错误

    • max virtual memory areas vm.max_map_count[65530]

      # 1.在centos虚拟机 修改配置 sysctl.conf
      vim /etc/sysctl.conf
      # 2.加入如下配置
      vm.max_map_count=262144
      # 3.启用配置
      sysctl -p
      

容器之间的通信 网络使用

  • 容器间通信

    • 当Docker启动时,会自动在主机上创建一个docker0虚拟网桥,实际上是Linux的一个bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
      同时,Docker随机分配一个本地未占用的私有网段(在RFC1918中定义)中的一个地址给docker0接口。比如典型的172.17.42.1,掩码为255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16 )的地址。
      当创建一个Docker容器的时候,同时会创建了一对veth pair 接口((当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即eth0 ;另一端在本地并被挂载到dockere网桥,名称以veth开头(例如vethAQI2QT )。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
  • 网络总结

    • 默认 docker在创建容器时将 所有容器都连接在docker0网桥上,默认在docker0网桥的容器都可以使用容器内的ip 进行通信
    • 默认 docker在创建容器时将 所有容器都连接在docker0网桥上,默认在docker0网桥的容器都可以使用容器内的名称作为容器的ip 进行通信【注意】使用容器名称必须自定义网桥,不能使用默认docker0
  • 自定义网桥

    • docker网桥类型 (查看 docker network ls)

      NETWORK ID     NAME      DRIVER(类型)    SCOPE 
      1ee16437a7da   bridge    bridge    local                                               
      1c328d413f51   host      host      local                                               
      bc41b2f56d67   none      null      local  
      
    • 创建自定义网络桥 docker network --help

      docker network create -d bridge 网络名称 # (默认)
      
    • 查看某一网络细节

      docker network inspect 网络名
      
    • 删除一个网络

      docker network rm 网络名
      docker netword prune 网络名
      
    • 运行多个容器在指定网络中

      # a.启动时 明确指定容器使用哪个网络
      docker run -d --network 网络名称 
      
      # b.启动之后让容器加入某个网络
      docker network connect 网络名 容器id或名称
      

高级卷

  • 数据卷 volume

    • 定义: 用来实现宿主机和容器之间文件目录映射同步
  • 别名代表一个docker自身维护数据卷

    # 1.查看所有docker维护数据卷
    docker volume ls
    
    # 2.查看数据卷详细信息
    docker volume inspect 卷的别名
    
    # 3.删除数据卷
    docker volume rm 卷的别名
    
    # 4.创建别名
    docker volume create 卷的别名
    

DockerFile

  • Dockerfile可以认为是 Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件。

    • 作用:通过 Dockerfile文件构建一个属于自己镜像

    在这里插入图片描述

    • 操作

      • 在指定位置创建一个 Dockerfile文件;编写dockerfile相关语法
      • 通过Dockerfile 构建镜像 docker build -t aa:1.0 .(指定Dockerfile文件位置)
    • 构建镜像流程

      • 【注意】 一行只有一条完整指令

      • 基础内容

        1.每条保留字指令都必须为大写,且后面都要跟至少一个参数
        2.指令按照从上到下,顺序执行
        3. #表示注释
        4.每条指令都会创建一个新的镜像层,并对镜像进行提交
        
      • 保留命令 #注释 但一定要隔行

        保留字左右
        FROM当前镜像是基于哪个镜像第一个指令必须是FROM
        RUN构建镜像时需要运行的指令
        EXPOSE当前容器对外暴露的端口号
        WORKDIR指定在创建容器后,终端默认进入的工作目录,一个落脚点
        ENV用来在构建镜像过程中设置环境变量
        ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包
        COPY类似于ADD 拷贝文件和目录到镜像中
        将构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
        VOLUME容器数据卷,用于数据保存和持久化工作
        CMD指定一个容器启动时要运行的命令
        Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
        ENTRYPOINT指定一个容器启动时要运行的命令
        ENTRYPOINT的目的和CMD一样,都是在指定 容器启动程序及其参数

      FROM命令

      • 基于哪个镜像进行构建新的镜像,在构建时会自动从docker hub拉取base镜像 必须作为Dockerfile的第一个指定出现

      • 语法

        FROM <image>
        FROM <image>[:<tag>] 	# 使用版本不写为latest
        FROM <image>[@<digest>]	# 使用摘要
        

      RUN 命令

      • RUN指令将在当前映像之上的新层中执行任何命令并提交结果,生成的提交映像将用于Dockerfile中的下一步

      • 语法

        RUN <command> (shell form, the command is run in a shell,which bydefault is /bin/sh -c on Linux or cmd /s /c on Windows)
        RUN echo hello
        # 添加缓存 RUN ["yum", "install", "-y", "vim"]
        RUN [ "executable" , "param1", "param2" ] (exec form)
        RUN [ " /bin/bash" , "-c", "echo hello " ]
        

      EXPOSE命令

      • 用来指定构建的镜像在运行为容器时对外暴露的端口

      • 语法

        EXPOSE 80/tcp如果没有显示指定则默认暴露都是tcp
        EXPOSE 88/ udp
        

      CMD命令

      • 用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。

        【注意】Dockerfile中只能有一条CMD指令,如果列出多个命令,则只有最后一个命令才会生效

      • 语法

        CMD ['executable', 'param1', 'param2'] (exec form, this is the preferred form)
        CMD ['param1', 'param2'] (as default parameters to ENTRYPOINT)
        CMD command param1 param2 (shell form)
        

      WORKDIR命令 通过docker exec -it id bash 进入的入口点

      • 用来为Dockerfile中任何RUN CMD ENTERPOINT COPY ADD指令设置工作目录。如果WORKDIR不存在,及时它没有在任何后续Dockerfile指令中使用,它也将被创建

      • 语法

        WORKDIR /path/to/workdir
        
        WORKDIR /a
        WORKDIR b
        
        `注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前wORKDIR指令的路径相对`
        

      ENV命令

      • 用来为构建镜像设置环境变量,这个值将出现在构建阶段中所有后续指令的环境中。

      • 语法

        ENV <key> <value>
        ENV <key> <value>
        

      ADD命令

      • 用来从context上下文复制新文件、目录或远程文件url, 并将它们添加到位于指定路径的映像文件系统中。

      • 语法

        ADD hom* /mydir/   		# 通配符添加多个文件
        ADD hom?.txt /mydir/ 	# 通配符添加
        
        ADD https://downloads.apache.org/tomcat/tomcat-9/v9.0.48/bin/apache-tomcat-9.0.48.tar.gz .		# 添加网络 依赖
        

      ENTRYPOINT CMD

      • 都是用来指定容器启动时默认执行指令

        • CMD 可以存在多个,但只有最后一个生效
      • 语法

        # 直接命令方式
        java -jar ems.jar
        # json 数组  推荐
        ["java", "-jar", "ems.jar"]
        
        # 1.cmd里面命令如果在运行在容器时 进行覆盖
        docker run 镜像:版本号 覆盖自定义命令 ls /
        # 2.entrypoint 命令如果在运行容器时 进行覆盖
        docker run --entrypoint=覆盖指令 镜像:版本号 传递参数
        
      • 使用

        • ENTRYPOINT用来书写一个固定的指定
        • CMD 用来给 ENTRYPOINT传递参数

        【注意】配合使用时必须使用json数组语法

      FROM centos:7
      # yum install -y vim
      RUN ["yum", "install", "-y", "vim"]
      # 声明容器中服务使用端口
      EXPOSE 15672
      EXPOSE 5672
      EXPOSE 8081
      ENV BASE_PATH=/app/data
      WORKDIR $BASE_PATH
      ADD aa.txt $BASE_PATH
      ADD https://mirrors.cnnic.cn/apache/tomcat/tomcat-9/v9.0.69/bin/apache-tomcat-9.0.69.tar.gz  .
      RUN tar -zxvf apache-tomcat-9.0.48.tar.gz
      RUN rm -rf apache-tomcat-9.0.48.tar.gz
      RUN mv apache-tomcat-9.0.48 tomcat-9.0.48
      # 这仅仅是个声明,告诉使用者容器中可以挂载这个目录到宿主机中
      VOLUME $BASE_PATH
      # 只要使用 docker run 容器名称或id 就会自动执行
      # CMD ls $BASE_PATH
      ENTRYPOINT ["ls"]
      CMD ["/apps/data"]
      

【关于flask无法远程访问问题】

  • 设置通配符IP地址0.0.0.0

docker-compose

  • docker进行项目部署

  • 为了完成一个完整项目 使得n多个容器配合完成项目中业务开发;解决容器之间的依赖问题

  • 简介
    • compose允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为—个项目( project ) .
    • Compose中有两个重要的概念︰
      • 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。
      • 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
    • compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
    • compose项目由Python编写,实现上调用了Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker APl,就可以在其上利用compose来进行编排管理。
  • 离线安装
    • 下载
    • 移动 mv docker-compose /usr/local/bin
    • 执行 sudo chmod +x /usr/local/bin/docker-compose
  • docker-compose 使用

    • versiondocker-compose版本 和 docker版本的对应关系

    • 书写docker-compose

      # 代表使用docker-compose项目的版本号
      version: "3.8"
      
      services:
        tomcat:
          #container_name: tomcat01	# 给当前容器指定名称
          image: tomcat:8.0	# 代表使用哪个镜像
          ports: 				# 代表宿主机和容器中端口映射
            - 8080:8080
        
        redis:
          image: redis:latest
          ports:
           - "6379:6379"
         
         mysqldb:
           image: mysql:latest
           ports:
             - "3306:3306"
           environment:
             MYSQL_DATABASE: exampledb
             MYSQL_USER: exampleuser
             MYSQL_PASSWORD: examplepass
           volumes:
             # - /root/mysqldata1:/var/lib/mysql
             - db:/var/lib/mysql					# 使用别名需提前声明   
             
      volumes:
        db:		# 声明别名数据卷
      
    • 启动docker-compose

      docker-compose up  	# 必须在docker-compose.yaml配置文件目录下执行
      
      # 若不使用默认的docker-compose.yml 文件名:
      docker-compose -f server.yml up -d 
      
      docker-compose down # 移除
      
  • 模板 https://yeasy.gitbook.io/docker_practice/compose/compose_file

    • build 通过docker-compose在启动容器之前,先根据dockerfile构建镜像,然后根据构建镜像启动容器。
    version: "3.8"
    
    services:
      tomcat:
        image: tomcat:latest
        restart: always
        ports:
          - "8000:8000"
      
      apps:
        restart: always
        # build: ./	# 指定Dockerfile上下文目录(dockerfile文件所在的位置)
        build:
          context: ./dir
          dockerfile: Dockerfile # 指定Dockerfile文件名称
        ports:
          - "8081:8081"
        # command: ["test.jar"]
        depends_on:
          - tomcat	# 依赖服务
        networks:
          - ems
      mysql:
        restart: always
        image: mysql:5.6
        ports:
          - "3306:3306"
        env_file:
          - .env
        volumes:
          - mysqlData:/var/lib/mysql
        networks:
          - ems
    # 声明网桥
    networks:
      ems:
    # 声明别名
    volumes:
      mysqlData:
    
    • command 覆盖容器启动后默认执行的命令

    • container_name 指定容器名称

    • depends_on 解决容器依赖、启动先后问题

      • web服务不会等待 被依赖的服务完全启动
      version: "3"
      
      services:
        web:
          build: .
          depends_on:
            - db 
            - redis
        
        redis:
          image: redis
          
        db:
          image: mysql
      
    • environment 不是特别隐私的内容

      version: "3"
      
      services:
        mysql01:
          image: mysql:5.6
          ports:
            - "3306:3306"
          environment:
            MYSQL_DATABASE: exampledb
            # - "MYSQL_DATABASE=exampledb"
      
    • env_file 比较隐私的内容

      # 单个文件
      env_file: .env
      
      # 多个文件
      env_file:
        - ./common.env
        - ./apps/web.env
        - /opt/secrets.env
      
      • # common.env
        MYSQL_USER=exampleuser
        MYSQL_PASSWORD=examplepass
        
    • expose 用来指定构建镜像过程中 暴露的端口号

    • image 指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像

    • networks 用来指定启动容器使用的网桥

      version: "3"
      services:
        some-service:
          networks:
            - some-network
            - other-network
      # 声明网桥
      networks:
        some-network:
        other-networks:
      
    • ports 指定 宿主机端口:容器端口 (HOST:CONTAINER)

      ports:
       - "3000"
       - "8000:8000"
       - "49100:22"
       - "127.0.0.1:8001:8001"
      
    • volumes 指定 宿主机中容器目录 目录映射

    • restart 指定docker服务 总是运行

  • docker-compose命令
    # docker-compose 命令  项目|项目中某个服务
    # 语法 docker-compose -f docker-compose.yml  命令 [选项] [服务id]
    -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
    -p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
    –x-networking 使用 Docker 的可拔插网络后端特性
    –x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge
    –verbose 输出更多调试信息。
    -v, --version 打印版本并退出。
    
    # 1.up [服务id]  尝试自动完成包括构建镜像,创建服务,启动服务,并关联服务相关容器的一系列操作
    # docker-compose up -d  # 后台启动并运行容器
    docker-compose up 		# 对整个项目操作
    docker-compose up 服务id # 对当前docker-compose中对应服务id容器操作 
    #服务id services下面的名称 比如tomcat  mysql01
    
    # 2.down  关闭所有容器 并移除网络
    docker-compose down 	# 对整个项目操作
    docker-compose down [服务id]	#
    
    # 3.exec 进入容器
    docker-compose exec [服务id] bash
    
    # 4.ps 列出项目中的所有容器
    docker-compose ps  
    	-q  # 打印 id
    	
    # 5.restart 
    docker-compose restart 		# 对整个项目
    docker-compose restart -t 10 [服务]id # 指定 时间之后 重启某项服务
    
    # 6.rm 删除
    docker-compose  rm  [服务id]
    	-f 强制删除
    	-v 删除数据卷
    	
    # 7.start
    # 8.stop
    # 9.top 查看整个项目中所有服务容器内运行进程或 指定di服务的容器进程
    docker-compose top [服务id]
    
    # 10.pause
    # 11.unpause
    # 12.logs 
    docker-compose logs [服务id]  # services下面的名称
    

docker可视化工具

  • 安装portainer

    docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

壹如年少遲夏歸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值