Docker 完整版

分享 123456789987654321 ⋅ 于 2022-02-24 20:06:44 ⋅ 1460 阅读

Docker

1.Docker安装

docker官网

https://docs.docker.com/engine/install/centos/

1.确定centos版本

cat /etc/redhat-release  #centos7 或者 8 

2.卸载旧版本

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

3.安装docker


#yum安装gcc相关
yum -y install gcc
yum -y install gcc-c++
yum install -y yum-utils
#设置stable镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#安装DOCKER CE
yum -y install docker-ce docker-ce-cli containerd.io
#启动docker
systemctl start docker
#测试
docker version
docker run hello-world #配置完阿里云镜像才能访问

卸载

systemctl stop docker 
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

4.配置阿里云镜像加速

#https://cr.console.aliyun.com/cn-beijing/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://bkk48akd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2.Docker常用命令

帮助启动类命令

#启动docker: 
    systemctl start docker
#停止docker: 
    systemctl stop docker
#重启docker: 
    systemctl restart docker
#查看docker状态: 
    systemctl status docker   
#开机启动: 
    systemctl enable docker
#查看docker概要信息: 
    docker info    
#查看docker总体帮助文档: 
    docker --help   
#查看docker命令帮助文档: 
    docker 具体命令 --help  

镜像命令

#列出本地主机上的镜像
docker images -a :列出本地所有的镜像(含历史映像层)

#搜索镜像  https://hub.docker.com
docker search --limit 25 镜像名字

#拉取镜像
docker pull 镜像名字[:版本号]   没有TAG就是最新版(docker pull 镜像名字:latest)

#查看镜像/容器/数据卷所占的空间
docker system df

#删除镜像
    #删除单个
        docker rmi  -f 镜像ID/镜像名
    #删除多个
        docker rmi -f 镜像名1:TAG 镜像名2:TAG 
    #删除全部
        docker rmi -f $(docker images -qa)

容器命令

#新建+启动容器   https://www.runoob.com/docker/docker-run-command.html
    docker run 参数 IMAGE [COMMAND] [ARG...]
        #参数说明
        --name 重命名
        -d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);#没有前台进程容易退出,不建议用
        -it:# docker run -it ubuntu /bin/bash
        -p: 指定端口映射,小写p

#列出当前所有正在运行的容器
    docker ps [OPTIONS]
        -a :列出当前所有正在运行的容器+历史上运行过的
        -l :显示最近创建的容器。
        -n:显示最近n个创建的容器。# docker ps -n 1
        -q :静默模式,只显示容器编号。

#退出容器 (两种方式)
    run进去容器,'exit'退出,容器停止  
    run进去容器,'ctrl+p+q'退出,容器不停止

#启动已停止运行的容器
    docker start 容器ID/容器名
#重启容器
    docker restart 容器ID或者容器名
#停止容器   
    docker stop 容器ID或者容器名
#强制停止容器 
    docker kill 容器ID或容器名
#删除已停止的容器
    docker rm 容器ID
    #一次性删除多个容器实例
    docker rm -f $(docker ps -a -q)
    docker ps -a -q | xargs docker rm
#查看容器日志
    docker logs 容器ID
#查看容器内运行的进程
    docker top 容器ID
#查看容器内部细节
    docker inspect 容器ID
#退出容器后重新进入
    docker exec -it 容器ID /bin/bash 

#从容器内拷贝文件到主机上
    docker cp  容器ID:容器内路径 目的主机路径
    #docker cp fa946fdf483d:/a.txt /home/root/a.txt
#导入和导出容器    
    #export 
        docker export 容器ID > 文件名.tar
        #[root@localhost tmp]# docker export fa946fdf483d >b.tar
    #import 
        cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
        #[root@localhost tmp]# cat b.tar | docker import - root/ubuntu:fa946fdf483d     

3.Docker镜像

#镜像commit操作
    docker commit -m="提交的描述信息" -a="作者" 容器ID 镜像名:[版本号]
    docker commit -m="提交的描述信息" -a="作者" 容器ID testUbantu:1.3

3.1本地镜像发布到阿里云

3.2本地镜像发布到私有库

#1.拉取仓库
docker pull registry 

#2.运行私有库Registry   默认情况,仓库被创建在容器的/var/lib/registry目录下
docker run -d -p 5000:5000  -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry

#3.curl验证私服库上有什么镜像
curl -XGET http://192.168.92.144:5000/v2/_catalog

#4.推送镜像倒私服
docker tag 镜像名:版本号   私服ip:端口/镜像名:版本号
    #docker tag  zzyyubuntu:1.2  192.168.111.162:5000/zzyyubuntu:1.2

#5.增加docker 的私服支持  别忘记逗号  如果不生效,需要重启docker
#vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"],
  "insecure-registries": ["仓库ip:仓库端口"]
}

#6.push推送到私服库
docker push 仓库ip:仓库端口/镜像名称:版本号

4.Docker容器数据卷

数据卷就是持久化容器里面的数据, linux和docker文件数据互通

#1.运行一个带有容器卷存储功能的容器实例 
    # rw就是读写(默认是读写)   ro是只读
 docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw   --name xxx 镜像名 /bin/bash

#2.查看是否挂载成功
docker inspect 容器id
"Mounts": [
          {
              "Type": "bind",
              "Source": "/tmp",
              "Destination": "/tmp",
              "Mode": "",
              "RW": true,
              "Propagation": "rprivate"
          }

#3.卷的继承和共享  继承的是路径映射规则,文件是独立的
docker run -it  --privileged=true --volumes-from 父类  --name u2 ubuntu

5.Docker常规安装简介

#docker hub 账号密码   https://hub.docker.com/
dockeralibabamapengfei
dalong2014

5.1tomcat安装

docker search tomcat
docker pull tomcat
#docker images查看是否有拉取到的tomcat
docker images tomcat
#使用运行tomcat镜像
docker run -it -p 8080:8080 tomcat /bin/bash
#修改weapps目录
[root@localhost ~]# docker exec -it 3708ab6d4a7e /bin/bash
root@3708ab6d4a7e:/usr/local/tomcat# rm -rf webapps
root@3708ab6d4a7e:/usr/local/tomcat# mv webapps.dist webapps
#访问  http://192.168.92.144:8080/

#免修改版tomcat
#run的时候 没有billygoo/tomcat8-jdk8镜像 会自动拉取
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

5.2安装mysql

docker pull mysql:5.7   
#启动 挂载配置文件,包,以及日志   
docker run -d -p 3306:3306 --privileged=true 
-v /zzyyuse/mysql/log:/var/log/mysql 
-v /zzyyuse/mysql/data:/var/lib/mysql 
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d 
-e MYSQL_ROOT_PASSWORD=123456  --name mysql mysql:5.7
#查看字符编码
 SHOW VARIABLES LIKE 'character%'
#新建my.cnf
default_character_set=utf8
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

5.3安装redis

docker pull redis:6.0.8
#修改redis.conf
  3.1 开启redis验证    可选
    requirepass 123

  3.2 允许redis外地连接  必须
     注释掉 # bind 127.0.0.1
  3.3   daemonize no
     将daemonize yes注释起来 或者设置 daemonize no,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败
  3.4 开启redis数据持久化  appendonly yes  可选
#启动redis  /etc/redis/redis.conf 读取redis容器内部的配置
#更换redis配置(linux的配置文件),需要重启docker的redis
docker run  -p 6379:6379 --name myr3 --privileged=true 
-v /app/redis/redis.conf:/etc/redis/redis.conf 
-v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf

5.4安装mysql主从复制

#1.启动主服务器3307
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7
#2.  vim my.cnf 
    [mysqld]
    ## 设置server_id,同一局域网中需要唯一
    server_id=101 
    ## 指定不需要同步的数据库名称
    binlog-ignore-db=mysql  
    ## 开启二进制日志功能
    log-bin=mall-mysql-bin  
    ## 设置二进制日志使用内存大小(事务)
    binlog_cache_size=1M  
    ## 设置使用的二进制日志格式(mixed,statement,row)
    binlog_format=mixed  
    ## 二进制日志过期清理时间。默认值为0,表示不自动清理。
    expire_logs_days=7  
    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
    ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
    slave_skip_errors=1062
#3.修改完配置后重启master实例
    [root@localhost conf]# docker restart mysql-master
    mysql-master
#4.进入mysql-master容器
    docker exec -it mysql-master /bin/bash 
    mysql -uroot -proot
#5.master容器实例内创建数据同步用户
    CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
#6.开启从服务器3308
    docker run -p 3308:3306 --name mysql-slave \
    -v /mydata/mysql-slave/log:/var/log/mysql \
    -v /mydata/mysql-slave/data:/var/lib/mysql \
    -v /mydata/mysql-slave/conf:/etc/mysql \
    -e MYSQL_ROOT_PASSWORD=root  \
    -d mysql:5.7
#7.进入/mydata/mysql-slave/conf目录下新建my.cnf
    [mysqld]
    ## 设置server_id,同一局域网中需要唯一
    server_id=102
    ## 指定不需要同步的数据库名称
    binlog-ignore-db=mysql  
    ## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
    log-bin=mall-mysql-slave1-bin  
    ## 设置二进制日志使用内存大小(事务)
    binlog_cache_size=1M  
    ## 设置使用的二进制日志格式(mixed,statement,row)
    binlog_format=mixed  
    ## 二进制日志过期清理时间。默认值为0,表示不自动清理。
    expire_logs_days=7  
    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
    ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
    slave_skip_errors=1062  
    ## relay_log配置中继日志
    relay_log=mall-mysql-relay-bin  
    ## log_slave_updates表示slave将复制事件写进自己的二进制日志
    log_slave_updates=1  
    ## slave设置为只读(具有super权限的用户除外)
    read_only=1
#8.修改完配置后重启slave实例
    [root@localhost conf]# docker restart mysql-slave
    mysql-slave
#9.在主数据库中查看主从同步状态
    docker exec -it mysql-master /bin/bash 
    mysql -uroot -proot
    mysql> show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File                  | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000001 |      617 |              | mysql            |                   |
+-----------------------+----------+--------------+------------------+-------------------+
#10.进入mysql-slave容器
    docker exec -it mysql-slave /bin/bash
    mysql -uroot -proot
#11.在从数据库中配置主从复制
    change master to master_host='192.168.92.144', master_user='slave',         master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
    #主从复制命令参数说明
    master_host:主数据库的IP地址;
    master_port:主数据库的运行端口;
    master_user:在主数据库创建的用于同步数据的用户账号;
    master_password:在主数据库创建的用于同步数据的用户密码;
    master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
    master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
    master_connect_retry:连接失败重试的时间间隔,单位为秒。

#12.在从数据库中查看主从同步状态
    show slave status \G;
    Slave_IO_Running:NO#未开始
    Slave_SQL_RUNNING:NO#未开始

#13.在从数据库中开启主从同步
start slave;
#14.查看从数据库状态发现已经同步
show slave status \G;
#主从复制测试
    主机新建库-使用库-新建表-插入数据,ok
    从机使用库-查看记录,ok

5.5安装redis集群

#哈希取余分区
    某个redis机器宕机了,由于台数数量变化,会导致hash取余全部数据重新洗牌。
#一致性哈希算法分区
        一致性Hash算法在服务节点太少时,容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台    服务器上)问题,
    #优点
    加入和删除节点只影响哈希环中顺时针方向的相邻的节点,对其他节点无影响。
    #缺点 
    数据的分布和节点的位置有关,因为这些节点不是均匀的分布在哈希环上的,所以数据在进行存储时达不到均匀分布的效果。
#哈希槽分区

主从容错切换

#主机宕机

安装redis集群

#1.启动6台redis 
#--appendonly yes 开启持久化 
#--port 6386 redis端口
#--cluster-enabled yes 开启redis集群
#--net host 使用宿主机网络和端口
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

#2.进入redisnode1 构建集群
docker exec -it redis-node-1 /bin/bash

#3.--cluster-replicas 1 表示为每个master创建一个slave节点
redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386 --cluster-replicas 1

#4.链接进入6381作为切入点,查看节点状态  cluster nodes可以查看主机下面挂载的哪台从机
    root@localhost:/data# redis-cli -p 6381 
    127.0.0.1:6381> cluster info
    127.0.0.1:6381> cluster nodes
#5.以集群方式连接redis集群
    redis-cli -p 6381 -c
#6.集群检查命令
    redis-cli --cluster check 192.168.92.144:6381

Redis主从扩容

#新建6387、6388两个节点
docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
#2.进入6387容器实例内部
    docker exec -it redis-node-7 /bin/bash
#3.将新增的6387节点(空槽号)作为master节点加入原集群   
    redis-cli --cluster add-node 127.0.0.1:6387 127.0.0.1:6381
    #将新增的6387作为master节点加入集群
    #redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
    #6387 就是将要作为master新增节点
    #6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
#4.重新分派槽号  16384/master节点数
    命令:redis-cli --cluster reshard IP地址:端口号
    redis-cli --cluster reshard 127.0.0.1:6381

How many slots do you want to move (from 1 to 16384)? 4096  #16379/master节点数
What is the receiving node ID? 24fb9d89744da4e909038cddca0a1fa4dcdc2436 #给新机器分配
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: all

#5.检查集群槽分配情况
    redis-cli --cluster check 127.0.0.1:6381
#6.为主节点6387分配从节点6388

#命令:redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID

redis-cli --cluster add-node 127.0.0.1:6388 127.0.0.1:6387 --cluster-slave --cluster-master-id 24fb9d89744da4e909038cddca0a1fa4dcdc2436 #---这个是6387的编号

#7.检查集群 发现8机器加入集群
    root@localhost:/data# redis-cli --cluster check 127.0.0.1:6381

Redis主从缩容

#1.检查集群
    redis-cli --cluster check 127.0.0.1:6381
#2.将6388删除
    #命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID
    redis-cli --cluster del-node 127.0.0.1:6388 2e84e6cabbf227aa055de36477a04bbf9be9cc33
#3.将6387的槽号清空,重新分配, 清出来的槽号都给6381
   redis-cli --cluster reshard 127.0.0.1:6381

    How many slots do you want to move (from 1 to 16384)? # 4096  输入需要清空的槽数
What is the receiving node ID?  # 输入需要接受槽的机器
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: #输入需要删除槽的机器
Source node #2: done

6.DockerFile

#官网  https://docs.docker.com/engine/reference/builder/
#菜鸟  https://www.runoob.com/docker/docker-dockerfile.html
#说明
1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2:指令按照从上到下,顺序执行
3:#表示注释
4:每条指令都会创建一个新的镜像层并对镜像进行提交

#DockerFile常用保留字指令
FROM: #指定一个已经存在的镜像作为模板,第一条必须是from
MAINTAINER: #镜像维护者的姓名和邮箱地址
RUN: #运行的shell命令
    1.shell命格式: RUN yum -y install vim  # 等同于,在终端操作的 shell 命令。
    2.exec 格式: RUN ["./test.php", "dev", "offline"]   #等价于 RUN ./test.php dev offline
EXPOSE:  `容器端口`
WORKDIR: 启动容器后,`默认的目录位置`
USER: #指定该镜像以什么样的用户去执行,如果都不指定,默认是root
     #这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;
ENV: 用来在构建镜像过程中设置`环境变量` #这里设置了环境变量,下面可以直接来引用 
ADD: 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY: 类似ADD,拷贝文件和目录到镜像中。多了一层复制的功能
VOLUME: 容器数据卷,用于数据保存和持久化工作
CMD: #指定容器启动后的要干的事情
     #CMD是在docker run 时运行。
     #Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
ENTRYPOINT: 1.用来指定一个容器启动时要运行的命令
            2.类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数              送给 ENTRYPOINT 指令指定的程序
            3.如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
            4.在执行docker run的时候可以指定 ENTRYPOINT 运行所需的参数。
            5.ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。
            6.当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给              ENTRYPOINT指令,他两个组合会变成            

6.1自定义镜像带有java8的centOS7

FROM centos
MAINTAINER zzyy<zzyybs@126.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java8添加到centos中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

#在具备jar包和Dockerfile文件的文件夹执行  最后的.中间有空格
docker build -t 新镜像名字:TAG .

6.2虚悬镜像

`仓库名、标签都是<none>的镜像,俗称dangling image`
#删除所有  需要删除所有这类镜像
docker image prune
#查看
docker image ls -f dangling=true

7.Docker微服务

1.Dockerfile

# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER mpf
# VOLUME 挂载容器卷,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
# 运行jar包 拷贝文件到容器
RUN bash -c 'touch /zzyy_docker.jar'
ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 6001
docker build -t mytest:1.6 .
#运行容器
docker run -d -p 6001:6001 mytest:1.6
#访问
127.0.0.1:6001/order/docker

8.Docker网络

#创建网络
    docker network create xxx
#docker查看网络
    docker network ls
#删除网络
    docker network rm XXX网络名字
#查看倒数20行容器网络信息
    docker inspect u1|tail -n 20
#docker多台容器规划   
    一定要规划好容器名称
    docker run -d -p 8081:8080 --network zzyy_network  --name tomcat81 billygoo/tomcat8-jdk8
    docker run -d -p 8082:8080 --network zzyy_network  --name tomcat82 billygoo/tomcat8-jdk8

9.Docker-compose容器编排

#官网
    https://docs.docker.com/compose/compose-file/compose-file-v3/
#官网下载 (用version3  和docker引擎有要求)
    https://docs.docker.com/compose/install/
#安装
  #1.
  curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  #2.
  chmod +x /usr/local/bin/docker-compose
  #3.
  docker-compose --version
#卸载
  rm /usr/local/bin/docker-compose  

9.1docker-compose.yml

version: "3" #版本

services: #固定的
  microService: #微服务名
    image: zzyy_docker:1.6 #镜像名字
    container_name: ms01 # docker ps 时候的container_name
    ports: #-p 6001:6001
      - "6001:6001"
    volumes: 
      - /app/microService:/data
    networks: #--network test_net 自动建设这个网段
      - test_net 
    depends_on: #依赖于mysql和 redis 先启动
      - redis
      - mysql

  redis:
    image: redis:6.0.8
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    networks: 
      - test_net
    command: redis-server /etc/redis/redis.conf

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'db2021'
      MYSQL_USER: 'zzyy'
      MYSQL_PASSWORD: 'zzyy123'
    ports:
       - "3306:3306"
    volumes:
       - /app/mysql/db:/var/lib/mysql
       - /app/mysql/conf/my.cnf:/etc/my.cnf
       - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - test_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问

networks: 
   test_net: 

9.2yml文件配置

server.port=6001

# ========================alibaba.druid相关配置=====================
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.url=jdbc:mysql://192.168.111.169:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
#mysql://mysql 这里的mysql代替了ip要和docker compose一样的名字
spring.datasource.url=jdbc:mysql://mysql:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.druid.test-while-idle=false

# ========================redis相关配置=====================
spring.redis.database=0
#spring.redis.host=192.168.111.169
spring.redis.host=redis
spring.redis.port=6379
spring.redis.password=
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0

# ========================mybatis相关配置===================
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.atguigu.docker.entities

# ========================swagger=====================
spring.swagger2.enabled=true

9.3执行

docker rm -f xx xx xx #停止多个容器实例

执行 docker-compose up
或者
执行 docker-compose up -d

9.4compose常用命令

指定docker composr命令一定要在 docker-compose.yml文件的目录执行,否则可能找不到

#Compose常用命令
docker-compose -h                           # 查看帮助
docker-compose up                           # 启动所有docker-compose服务
docker-compose up -d                        # 启动所有docker-compose服务并后台运行
docker-compose down                         # 停止并删除容器、网络、卷、镜像。
docker-compose exec  yml里面的服务id          # 进入容器实例内部  docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps                      # 展示当前docker-compose编排过的运行的所有容器
docker-compose top                     # 展示当前docker-compose编排过的容器进程
docker-compose logs  yml里面的服务id     # 查看容器输出日志
dokcer-compose config     # 检查配置
dokcer-compose config -q  # 检查配置,有问题才有输出
docker-compose restart    # 重启服务
docker-compose start      # 启动服务
docker-compose stop       # 停止服务

10.Docker可视化Portainer

# docker pull portainer/portainer
#--restart=always docker重新启动 容器自动重启
docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --name prtainer-mpf portainer/portainer

11.Docker容器监控之CAdvisor+InfluxDB+Granfana

#查看资源
docker stats

新建docker-compose.yml

version: '3.1'

volumes:
  grafana_data: {}

services:
 influxdb:
  image: tutum/influxdb:0.9
  restart: always
  environment:
    - PRE_CREATE_DB=cadvisor
  ports:
    - "8083:8083"
    - "8086:8086"
  volumes:
    - ./data/influxdb:/data

 cadvisor:
  image: google/cadvisor
  links:
    - influxdb:influxsrv
  command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
  restart: always
  ports:
    - "8080:8080"
  volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro

 grafana:
  user: "104"
  image: grafana/grafana
  user: "104"
  restart: always
  links:
    - influxdb:influxsrv
  ports:
    - "3000:3000"
  volumes:
    - grafana_data:/var/lib/grafana
  environment:
    - HTTP_USER=admin
    - HTTP_PASS=admin
    - INFLUXDB_HOST=influxsrv
    - INFLUXDB_PORT=8086
    - INFLUXDB_NAME=cadvisor
    - INFLUXDB_USER=root
    - INFLUXDB_PASS=root

启动docker-compose文件

docker-compose up
版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-123456789987654321,http://hainiubl.com/topics/75826
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter