Docker笔记

安装的docker版本yum install docker-ce-23.0.0 docker-ce-cli-23.0.0 containerd-23.0.0
yum install docker-ce-23.0.0 docker-ce-cli-23.0.0 containerd.io docker-buildx-plugin docker-compose-plugin

启动类命令

  1. 启动docker:systemctl start docker
  2. 停止docker:systemctl stop docker
  3. 开机启动:systemctl enable docker
  4. 查看docker概要信息:docker info
  5. 查看docker总体帮助文档:docker --help
  6. 查看docker命令帮助文档: docker 具体命令 --help
  7. 查看docker系统情况docker system --help,比如查看磁盘的使用情况:docker system df
  8. docker stats 显示容器资源使用统计数据的实时流

操作docker

  1. docker search hello-World(镜像名称)

  2. docker pull ubuntu(镜像名字)

  3. docker images -a 展示所有镜像

  4. docker system df命令显示关于docker守护程序使用的磁盘空间量的信息。

  5. docker rmi $(docker images -qa)或docker rmi -f $(docker images -qa)删除全部镜像

  6. docker inspect 镜像名称:可以查看镜像具体信息.

容器命令:


  1. docker run -it ubuntu /bin/bash或docker run --name=duwenjie ubuntu

  2. 退出容器:exit退出,容器停止或ctrl+p+q退出,容器不停止.

  3. 查看容器命令docker ps 展示运行的容器;docker ps -a展示全部的容器(包括停止的)

  4. 启动已经停止的容器:docker start unruffled_fermi,此处用的是容器名也可以用容器ID

  5. docker stop 容器id/名称

  6. 强制停止容器: docker kill 容器id/名称

  7. docker rm -f $(docker ps -a -q) 表示一次性删除多个容器实例(包括已经停止的容器)或docker ps -a -q | xgargs docker rm

  8. docker run -d redis:6.0.8 表示后台运行 docker exec -it 5c812310f7f9 /bin/bash 表示重新进入正在后台运行的容器,/bin/bash为必须写的参数. docker attach 897cb080107d也可以重新进入;区别是:

  9. docker cp 0623d41dd1ac:/tmp/a.txt /zzyyuse表示复制容器
    内/tmp/a.txt文件到主机上,并重命名为zzyyuse.

  10. docker export 0623d41dd1ac > abcd.tar表示将整个容器备份到主机上,并命名为abcd.tar

  11. cat abcd.tar | docker import - atguigu/ubuntu:3.7表示将备份的容器先生成镜像名为atguigu/ubuntu:3.7,并会随机生成镜像ID,然后重新运行新镜像的ID docker run -it 8d7af4895b97 /bin/bash就会将原来备份的容器恢复成新的.

  12. 在docker容器中apt-get update”用来更新数据源列表,apt-get install vim安装vim软件,将包含vim的Ubuntu重新生成一个新的镜像docker commit -m="add vim" -a="zzyy" 7de1a4066d1a atguigu/ubuntuvim:1.3,后面的1.3为自定义TAG版本,如果不添加docker images则显示latest

  13. 本地镜像发布到阿里云,先开通个人版容器镜像服务,然后创建命名空间(个人版最多创建3个)

    然后创建镜像仓库,仓库名称可以是软件的名称(目前不限个数),这里的仓库名称是my_ubuntu;

将镜像推送到Registry
$ docker login --username=duwe****@sino-mc.com registry.cn-beijing.aliyuncs.com
$ docker tag [ImageId] registry.cn-beijing.aliyuncs.com/atguigu_jie/my_ubuntu:[镜像版本号]
$ docker push registry.cn-beijing.aliyuncs.com/atguigu_jie/my_ubuntu:[镜像版本号]
如果push时没有镜像版本号则显示为latest,如果再push时为latest则覆盖前面的,所以最好填上版本号.
参考连接:https://cr.console.aliyun.com/repository/cn-beijing/atguigu_jie/my_ubuntu/details
  1. 新镜像推送到私服registry,先拉取镜像docker pull registry,然后生成registry的容器实例docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry,找到要上传的镜像,先改名:docker redis:latest 192.168.1.8:5000/redis,然后上传改名后的镜像192.168.1.8:5000/redis,这里会有报错
    The push refers to repository [192.168.1.8:5000/ubuntu]Get "https://192.168.1.8:5000/v2/": http: server gave HTTP response to HTTPS client
    网上要求在/etc/docker/daemon.json中添加"insecure‐registries": ["192.168.1.8:5000"],如图:{ "registry-mirrors": ["https://3ohj9483.mirror.aliyuncs.com"], "insecure‐registries": ["192.168.1.8:5000"] }
    但是daemon.json无法重启docker,最后网上找答案,修改vim /usr/lib/systemd/system/docker.service,修改ExecStart=后面追加--insecure-registry 192.168.1.8:5000,然后重启docker,就可以上传镜像到私有库registry;参考网址:https://www.jianshu.com/p/a6a0b5d07508;通过实验明,/etc/docker/下的daemon.json,以jison为后缀无法重启docker,会报错,修改daemon.conf重启没问题.最后通过curl -XGET 192.168.1.8:5000/v2/_catalog,查看已经上传了那些镜像.测试拉取:docker pull 192.168.1.8:5000/ubuntu:1.2
  2. 绑定挂载卷:docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu 宿主机的目录为/tmp/host_data,容器实例目录为/tmp/docker_data,这样实现容器中的文件也会保存在宿主机一份.
  3. docker run -it --privileged=true -v /tmp/host_data/:/tmp/u:ro --name=u2 ubuntu将容器目录/tmp/u:ro设置为只读,默认是rw读写,ro应该是read-only
  4. 容器卷的继承和共享:docker run -it --privileged=true --volumes-from=u2 --name=u3 ubuntu 表示继承u2容器,u2容器中原有的资料文件也会继承到新的容器中,这里u2挂载了容器卷,那么u3也会继承挂载卷和u2一样,相当于一主机两容器(因为都共享了主机目录)详见16

docker安装tomcat

  1. docker run -d -p 8080:8080 -e JAVA_OPTS="-Xms64m -Xmx512m"--name=tomcat8 ashince/tomcat8使用的不是最新的tomcat的.
  2. docker run -it -d -p 8081:8080 -v /zzyyuse/tomcat8_1/logs:/usr/local/tomcat/logs -v /zzyyuse/tomcat8_1/webapps:/usr/local/tomcat/webapps --name tomcat8_1 tomcat:latest

容器启动失败排查

docker logs 容器id
参考连接:https://www.php.cn/docker/488518.html

安装mysql
  1. docker run -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=null -d mysql:5.7此处安装的没有密码,也即是为null,如果需要设置密码则改为MYSQL_ROOT_PASSWORD=123456,然后进入mysql容器实例docker exec -it f0fef78e6c8e /bin/bash,然后再进入mysql内部mysql -uroot -p

  2. 高级安装mysql: docker run -d -p 3307: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 这样数据库和配置文件和log日志会同时保留在宿主机上一份,这样即便不小心删除了mysql容器数据也不会丢失.

  3. 查看mysql字符变量:show variables like 'character%';如果出现保存中文乱码,那么需要修改服务端的字符集和排序规则,位置在/etc/mysql/conf.d/my.cnf,重启mysql容器这样新建的表就会支持中文,对于没修改字符集之前建的表需要单独修改表的字符集

[client]
default_character_set=utf8mb4
[mysqld]
collation_server = utf8mb4_general_ci
character_set_server = utf8mb4
default_authentication_plugin=mysql_native_password 

小提示: whereis mysql可以查看mysql相关的文件夹,如果没有whereis,可以使用yum install util-linux安装

安装redis

docker run -p 6379:6379 --name du_redis --privileged=true -v /zzyyuse/redis/redis.conf/:/etc/redis/redis.conf -v /zzyyuse/redis/data:/data -d redis:latest redis-server /etc/redis/redis.conf/redis.conf
需要提前从别处拷贝一份redis.conf到挂载的容器卷里,也就是拷贝到/zzyyuse/redis/redis.conf目录下,在redis.conf文件中将daemonize no改为no,因为yes和-d冲突,

示例2: docker run -p 6380:6380 --name=myRedis --privileged -v /data/redis:/etc/redis/ -v /data/redis/data:/data -v /data/redis/lib:/var/lib/redis -d redis:6.0.8 redis-server /etc/redis/redis.conf
备注:/data/redis和/data/redis是目录.之前提示配置文件中的/var/lib/redis不存在,所以有新增了对应的挂在卷

优化有的redis安装:
docker run -p 6379:6379 --name guli_redis --privileged=true -v /DuWenjie/redis/conf/:/etc/redis/conf -v /DuWenjie/redis/data:/data -d redis:latest /etc/redis/conf/redis.conf

数据库主从复制
  1. docker run -p 3309:3306 --name mysql-master -v /zzyyuse/mysql-master/log:/var/log/mysql -v /zzyyuse/mysql-master/data:/var/lib/mysql -v /zzyyuse/mysql-master/conf:/etc/mysql/mysql.conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7这里需要注意下,老师讲的容器目录是/etc/mysql,但是可能是版本不同或升级,无法创建成功,需要改下容器中mysql配置文件的路径为/etc/mysql/mysql.conf.d或/etc/mysql/conf.d,此处是查看mysql镜像容器的配置文件/etc/my.cnf所知:
    !includedir /etc/mysql/conf.d/!includedir /etc/mysql/mysql.conf.d/.
    还可以其他MySQL容器配置文件中复制一份my.conf配置文件到宿主机挂载的目录中,可以提前配置datadir的位置(不推荐).
    编写主的配置文件:
[mysqld]
#设置server-id同一局域网中保持唯一
server-id = 101
##指定不需要同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能
log-bin=mall-mysql-bin
#设置二进制日志使用内存大小
binlog_cache_size=1M
#设置使用的二进制日志格式
binlog_format=mixed
#二进制日志过期清理时间.默认为0,表示不自动清理.
expire_logs_days=7

#通常,当副本上出现错误时,复制会停止,这使您有机会手动解决数据中的不一致问题。当语句>返回选项值中列出的任何
错误时,此选项会导致复制SQL线程继续复制。1062表示主键重复
#slave_skip_errors=1062
    小命令补充:vim全部删除:普通模式下:ggdG;如果按行删除是dG;
  1. 在主库建立复制账号:create user 'slave'@'%' identified by '123456';然后授权:grant replication slave, replication client on . to 'slave'@'%';
    小命令补充:查看用户的授权权限: select * from information_schema.user_privileges;
  2. show master status;查看二进制日志名称以及Position为后续从库上使用.
  3. 配置从库的配置文件:
[mysqld]
#设置server_id,同一局域网中保持唯一
server-id = 102
##指定不需要同步的数据库名称
binlog-ignore-db=mysql
##开启二进制日志功能
log-bin=mall-mysql-slave-bin
##设置二进制日志使用内存大小
binlog_cache_size=1M
##设置使用的二进制日志格式
binlog_format=mixed
##二进制日志过期清理时间.默认为0,表示不自动清理.
expire_logs_days=7

##通常,当副本上出现错误时,复制会停止,这使您有机会手动解决数据中的不一致问题。当语句>返回选项值中列出的任>何错误时,此选项会导致复制SQL线程继续复制。1062表示主键重复
##slave_skip_errors=1062
#relay_log配置中继日志
relay_log=mall-mysql-relay-bin

##log_slave_updates表示slave将复制事件写进自己的二进制日志,官方解释:副本服务器从源服务>器收到的更新是否应该>记录到副本服务器自己的二进制日志中。
log_slave_updates=1
#slave设置为只读
read_only = 1
  1. 在从库里配置CHANGE MASTER TO更改副本服务器用于连接到源和从源读取数据的参数。它还更新复制元数据存储库的内容.
    小提示:在MySQL 8.0.23中,使用CHANGE REPLICATION SOURCE TO代替CHANGE MASTER TO,该版本已弃用。在MySQL 8.0.23之前的版本中,使用CHANGE MASTER TO.
    change master to master_host='192.168.1.8', master_user='slave', master_password='1234567',master_port=3309,master_log_file='mall-mysql-bin.000002', master_log_pos=154,master_connect_retry=30;此处的master_log_file和master_log_pos均来自主库中的show master status.
    5.启动start slave;然后查看show slave status \G(带G后面不用加分号),Slave_IO_Running: Yes和Slave_SQL_Running: Yes均为yes表示主从复制成功.
    6,如果后续关机或直接重启mysql容器,开启后start slave自启动.
    刚才我实验重新启动发现从库无法启动成功,通过docker logs 容器ID排查发现报错:
    2022-10-05T15:32:57.344363Z 0 [ERROR] Failed to open log (file './mall-mysql-slave-bin.000003', errno 2) 2022-10-05T15:32:57.344369Z 0 [ERROR] Could not open log file
    也就是没有mall-mysql-slave-bin.000003这个binlog日志,查看日志所在的文件夹确实没有,那就vim mall-mysql-slave-bin.index从中删除mall-mysql-slave-bin.000003,重新启动从库容器成功.

redis集群-分布式存储之哈希槽算法

1.下载redis镜像并启动redis容器,启动六个redis
docker run -d --name redis-node-1 --network host --privileged=true -v /zzyyuse/redis-node-1:/data redis:latest --cluster-enabled yes --appendonly yes --port 6381

docker run -d --name=redis-node-2 --network host --privileged=true -v /zzyyuse/redis-node-2:/data redis:latest --cluster-enabled yes --appendonly yes --port 6382,以此类推.
解释:--name=redis-node-2容器的名字; --network host使用宿主机的IP和端口,默认; --privileged=true获取宿主机root用户权限; --cluster-enabled yes开启redis集群; --appendonly yes开启aof持久化; --port 6382 redis端口号

  1. redis-cli --cluster create 192.168.1.109:6381 192.168.1.109:6382 192.168.1.109:6383 192.168.1.109:6384 192.168.1.109:6385 192.168.1.109:6386 --cluster-replicas 1创建cluster集群副本.
    命令帮助参考redis-cli --cluster help to list all available cluster manager commands.
    小命令补充:centos7释放现有的IP命令dhclient -r,重新从DHCP获取dhclient
    在运行后有个报错:[ERR] Not all 16384 slots are covered by nodes.意思是slots分布不正确,可以通过以下命令修复 redis-cli --cluster fix host:port

  2. 查看集群信息需要进入redis内部执行cluster info, cluster nodes 命令查看集群的节点信息包括master和slave的隶属关系;
    参考https://blog.csdn.net/wanderstarrysky/article/details/118158695

  3. redis启动集群模式的命令行redis-cli -p 6381 -c 解释-c表示开启集群模式

  4. redis-cli --cluster check 192.168.0.125:6381检查槽位及键数

redis集群的扩容

  1. 新增docker run -d --name redis-node-7 --network host --privileged=true -v /zzyyuse/redis-node-7:/data redis:latestter-enabled yes --appendonly yes --port 6387
    docker run -d --name redis-node-8 --network host --privileged=true -v /zzyyuse/redis-node-8:/data redis:latestter-enabled yes --appendonly yes --port 6388
  2. 往集群中添加新的节点redis-cli --cluster add-node 192.168.0.125:6387 192.168.0.125:6381
  3. redis-cli --cluster reshard 192.168.0.125:6382 后面调整的ip:port 要是已存在集群中的任意主节点
  4. 为新的master主机6382添加从机,redis-cli --cluster add-node 192.168.0.125:6388 192.168.0.125:6387 --cluster-slave --cluster-master-id 990e34930fc4711e63736d11b8325769155aba42

redis集群缩容

  1. 先删除6387的从机6388 redis-cli --cluster del-node 192.168.0.125:6387 ID
  2. 刚才新增的master6387分的槽位重新分配给6381: redis-cli --cluster reshard 192.168.0.125:6382此处的ip:port仍然只要是集群中的任意master即可.
    How many slots do you want to move (from 1 to 16384)?询问从6387中分配多少个槽位?What is the receiving node ID?询问谁接收槽位的ID这里填6381的id:f77cf462397925b1a2ed2a475f2e07b4a790ebfc,Source node #1:询问释放槽位的ID,这里是6387的ID,也可以继续释放其他masterID,如果填2个,那就是4096个槽位从两个ID中均分,下一步,yes,开始分配.
  3. redis-cli --cluster check 192.168.0.125:6382查看6387的槽位是否为0
  4. 最后删除6387的节点 redis-cli --cluster del-node 192.168.0.125:6387 990e34930fc4711e63736d11b8325769155aba42,也可以停止6387的容器实例.
    补充:如果换了IP地址而又不想数据丢失的办法:修改宿主机挂载卷中的nodes.conf或容器实例内的/data文件夹中的nodes.conf,将IP地址修改成新的ip 192.168.1.6地址,使用vim快速全局替换 :%s/192.168.0.125/192.168.1.6/g,将集群中节点的nodes.conf全部替换完之后,使用表达式重启所有集群节点docker restart $(docker ps | grep redis | awk '{print $1}'), redis-cli --cluster check 192.168.1.6:6382查看状态.

Dockerfile

  1. 在Dockerfile中只能有一个CMD指令。如果列出多个CMD,则只有最后一个CMD生效。比如docker run -it -p 8080:8080 ID将生成一个新的tomcat容器,那么也就是执行了官方CMD中的命令CMD ["catalina.sh", "run"],但是如果我们刚才又在后面追加了cmd命令也就是docker run -it -p 8080:8080 ID /bin/bash那么这里的/bin/bash将替换之前的catalina.sh,run,虽然也能启动容器,但是无法启动Tomcat.

  2. CMD和run的区别:CMD是在docker run时运行;RUN是在docker build时运行

     `小命令补充:`docker rmi `docker image ls -f dangling=true -q`删除虚悬镜像正则表达式.
    

    小命令补充:docker image prune -a表示docker image prune命令用于删除未使用的映像。 如果指定了-a,还将删除任何容器未引用的所有映像. docker image prune -f静默删除<none>虚悬镜像 参考连接:https://www.yiibai.com/docker/image_prune.html

  3. Dockerfile中from使用的最新的centos8镜像,但是End of Life.CentOS项目已将重点从CentOS Linux转移到CentOS Stream。CentOS Linux 8停产日期:2021年12月31日,参考连接:https://www.centos.org/cl-vs-cs/;如果您需要更新您的CentOS8,您需要将镜像更改为vault.centos.org它们将被永久存档.因为docker pull centos:latest还没有更新yum仓库,我只能先run新的centos镜像,然后将yum仓库更新,在此基础上进行docker commit -m="update yum" -a="duwenjie" ID vault.centos/latest3,生成新的centos8镜像vault.centos/latest3 latest下面是修改yum仓库的步骤:

第一步:去/etc/yum.repos.d/目录。

[root@autocontroller ~]# cd /etc/yum.repos.d/
第二步:运行以下命令

[root@autocontroller ~]# sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
[root@autocontroller ~]# sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
第三步:现在运行yum更新

[root@autocontroller ~]# yum update -y
  1. 准备好镜像,编写Dockerfile,
#这是使用我制作好的镜像vault.centos/latest:latest
from vault.centos/latest:latest
MAINTAINER 568778282@qq.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
RUN mkdir /usr/local/java
#ADD把jdk-8u201-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位
置.
ADD jdk-8u201-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_201
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

在Dockerfile文件所在目录中执行docker build -t vault.centos/latest3 .最后生成一个含有vim等软件应用的新images名字叫vault.centos/latest3

  1. Entrypoint结合CMD使用:

  2. docker history 镜像ID 可以查看镜像生成的过程

构建eureka的Dockerfile
  • 首先编辑Dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} /app.jar
EXPOSE 10086
ENTRYPOINT ["java","-jar","/app.jar"]

其中将/app.jar去掉前面的/也可以正常启动

  • 执行构建镜像命令:docker build --build-arg JAR_FILE=tensquare_eureka_server-1.0-SNAPSHOT.jar -t eureka:v1 .,其中命令JAR_FILE为设置构建时变量.
  • 查看docker images看是否有eureka:v1镜像
Docker网络
  1. docker network ls查看Docker网络

  2. docker network create duwenjie新建docker网络

  3. docker network inspect bridge查看网络信息

  4. bridge对应图,参考大佬截图:


    容器内的网卡名称是eth0开头,宿主机中容器的网卡以veth开头

  5. docker run -d -p 8081:8080 --network host --name tomcat8 ashince/tomcat8:latest如果使用--network host模式,那么使用-p指定端口8081:8080将无效,实际上还是使用了主机的8080端口

  6. --network container模式,属于容器内共享同一ip和端口:
    先执行docker run -d -p 8085:8080 --name tomcat8 ashince/tomcat8,生成一个tomat8容器,然后再执行docker run -d -p 8086:8080 --network container:tomcat8 --name tomcat8_1ashince/tomcat8就会报错,因为属于共享IP和端口,那么8085:8080端口已经被使用,所以8086:8080就会冲突,报错提示为:docker: Error response from daemon: conflicting options: port publishing and the container type network mode.

  7. 创建自定义网络,docker network create zzyy_network

  8. docker run -d -p 8083:8080 --network zzyy_network --name tomcat3 ashince/tomcat8和docker run -d -p 8084:8080 --network zzyy_network --name tomcat4 ashince将新建的tomcat容器加入自定义的网络zzyy_network,那么tomat3容器中可以ping通tomcat4

  9. docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 mynet创建自定义网段.如果其他网段的某个容器也想加入192.168.0.0网段,可以执行docker network connect mynet tomcat3,那么tomat3就会新增分配到192.168.0.0/24网段的IP.

docker compose
  1. docker compose -h查看帮助
  2. docker compose 结合 Dockerfile进行一键部署jar+mysql+redis,这里虽然有部署redis,但是项目代码中没有用redis.首先idea中package打包产生*.jar.
    2.1 maven打包之前一定要配置好pom.xml,我之前就是打包中没有resource下的static和templates和application.yml,导致jar包运行不成功.正确的pom.xml文件如下
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.yml</include>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.yml</include>
                    <include>static/**</include>
                    <include>templates/**</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
    

2.2 生成的jar包copy到和Dockerfile所在的目录,Dockfile文件如下

  FROM vault.centos/latest3:latest

  MAINTAINER DuWenjie

  ADD mmall-0.0.1-SNAPSHOT.jar /mmall.jar

  ENTRYPOINT ["java","-jar","/mmall.jar"]

  EXPOSE 8081

2.3 执行docker build -t mmall_docker:1.1 . 重新生成新的镜像mmall_docker:1.1

2.4 编写docker-compose.yml,docker compose config -q检查compose.yml是否有错误

version: "3"

services:
 microService:
  image: mmall_docker:1.1
  container_name: ms01
  ports:
   - "8080:8081"
  volumes:
   - /zzyyuse/microService:/data
  networks:
   - atguigu_net
  depends_on:
   - redis
   - mysql

 redis:
  image: redis:latest
  ports:
   - "6379:6379"
  volumes:
   - /zzyyuse/redis/redis.conf:/etc/redis/redis.conf
   - /zzyyuse/redis/data:/data
  networks:
   - atguigu_net
  command: redis-server /etc/redis/redis.conf/redis.conf

 mysql:
  image: mysql:5.7
  #container_name: mysql
  environment:
   MYSQL_ROOT_PASSWORD: '123456'
   MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
   MYSQL_DATABASE: 'mmall'
   MYSQL_USER: 'duwenjie'
   MYSQL_PASSWORD: '123456'
  ports:
   - "3306:3306"
  volumes:
   - /zzyyuse/mysql/data:/var/lib/mysql
   - /zzyyuse/mysql/conf/:/etc/mysql/conf.d
   - /zzyyuse/mysql/init:/docker-entrypoint-initdb.d
  networks:
   - atguigu_net

networks:
 atguigu_net:

其中将*.sql文件放入这个文件夹/zzyyuse/mysql/init,可以初始化sql文件,相当于还原sql文件; MYSQL_ALLOW_EMPTY_PASSWORD: 'no'相当于root不设密码.这里好像不生效,仍然按照上面的MYSQL_ROOT_PASSWORD: '123456'设置为123456

2.5. 在docker-compose.yml所在的目录中执行docker compose up -d将一键运行jar镜像和mysql和redis,如图

2.6 docker compose stop 停止所有compose启动的容器实例.

安装Portainer

  1. docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

  2. 访问地址:https://192.168.1.7:9443/#!/init/admin

安装CAdvisor+InfluxDB+Granfana

追加

  1. 重启docker服务,原先的容器自动启动使用docker run --restart always,如果原先已经启动了容器但没有设置开机启动,可以使用docker update adde508bf49d --restart always

  2. docker save -o Mynginx.tar nginx 将nginx镜像打包成tar包
    docker load -i Mynginx.tar 将Mynginx解压

  3. 将镜像push到自己的docker.hub上

    其中568778282/guigu,568778282是账户名,guigu是仓库名,nginx是tagname,
    docker push 568778282/guigu:nginx

  • Redis 提供了 AOF 重写机制,手动执行BGREWRITEAOF命令,开始重写 aof 文件:
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started
  • docker安装elasticsearch
    当您在Docker中运行时elasticsearch配置文件从以下位置加载/usr/share/elasticsearch/config/.
    es容器内默认存储路径/usr/share/elasticsearch/data
  • 默认情况下,Elasticsearch作为用户在容器内部运行elasticsearch使用uid:gid1000:1000.
    如果您正在绑定安装一个本地目录或文件,它必须是可读的elasticsearch用户。此外,该用户必须对数据和日志目录。一个好的策略是授予组对gid的访问权限1000或者0对于本地目录。
    例如,要通过绑定装载准备用于存储数据的本地目录:
    此处需要centos主机需要创建elasticsearch用户
    useradd elasticsearch
    mkdir esdatadir
    chmod g+rwx esdatadir光改变组还是权限受限,所以同时改变用户和组的所有权:
    chown elasticsearch:elasticsearch esdatadir/
    chgrp 1000 esdatadir这个命令就不用了.
使用Docker启动单节点集群编辑
要启动单节点Elasticsearch集群进行开发或测试,请指定单节点发现绕过引导检查:

docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.5.2

优化安装

docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -v es-config:/usr/share/elasticsearch/config -v /root/esdatadir:/usr/share/elasticsearch/data --name es01  elasticsearch:7.5.2

其中-v es-config:/usr/share/elasticsearch/config使用的是具名卷
具名卷是一种,把容器所需的持久化数据,从用来创建容器所需的镜像中,解耦开来的机制。同时,它也能和宿主机进行解耦。具名卷由 Docker 负责创建和管理,即使当前没有容器在使用某个具名卷,它依旧可以保留下来。具名卷中的数据可以在容器和宿主机之间共享,也可以在多个容器间共享。Docker 使用卷驱动器来创建,管理和挂载卷。你还可以使用 Docker 命令来备份或恢复卷。

posted @ 2022-10-13 22:33  文采杰出  阅读(139)  评论(0编辑  收藏  举报