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
启动类命令
- 启动docker:systemctl start docker
- 停止docker:systemctl stop docker
- 开机启动:systemctl enable docker
- 查看docker概要信息:docker info
- 查看docker总体帮助文档:docker --help
- 查看docker命令帮助文档: docker 具体命令 --help
- 查看docker系统情况docker system --help,比如查看磁盘的使用情况:docker system df
- docker stats 显示容器资源使用统计数据的实时流
操作docker
-
docker search hello-World(镜像名称)
-
docker pull ubuntu(镜像名字)
-
docker images -a 展示所有镜像
-
docker system df命令显示关于docker守护程序使用的磁盘空间量的信息。
-
docker rmi $(docker images -qa)或docker rmi -f $(docker images -qa)删除全部镜像
-
docker inspect 镜像名称:可以查看镜像具体信息.
容器命令:
-
-
docker run -it ubuntu /bin/bash或docker run --name=duwenjie ubuntu
-
退出容器:exit退出,容器停止或ctrl+p+q退出,容器不停止.
-
查看容器命令docker ps 展示运行的容器;docker ps -a展示全部的容器(包括停止的)
-
启动已经停止的容器:docker start unruffled_fermi,此处用的是容器名也可以用容器ID
-
docker stop 容器id/名称
-
强制停止容器: docker kill 容器id/名称
-
docker rm -f $(docker ps -a -q) 表示一次性删除多个容器实例(包括已经停止的容器)或docker ps -a -q | xgargs docker rm
-
docker run -d redis:6.0.8 表示后台运行 docker exec -it 5c812310f7f9 /bin/bash 表示重新进入正在后台运行的容器,/bin/bash为必须写的参数. docker attach 897cb080107d也可以重新进入;区别是:
-
docker cp 0623d41dd1ac:/tmp/a.txt /zzyyuse表示复制容器
内/tmp/a.txt文件到主机上,并重命名为zzyyuse. -
docker export 0623d41dd1ac > abcd.tar表示将整个容器备份到主机上,并命名为abcd.tar
-
cat abcd.tar | docker import - atguigu/ubuntu:3.7表示将备份的容器先生成镜像名为atguigu/ubuntu:3.7,并会随机生成镜像ID,然后重新运行新镜像的ID docker run -it 8d7af4895b97 /bin/bash就会将原来备份的容器恢复成新的.
-
在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
-
本地镜像发布到阿里云,先开通个人版容器镜像服务,然后创建命名空间(个人版最多创建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
- 新镜像推送到私服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 - 绑定挂载卷:docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu 宿主机的目录为/tmp/host_data,容器实例目录为/tmp/docker_data,这样实现容器中的文件也会保存在宿主机一份.
- docker run -it --privileged=true -v /tmp/host_data/:/tmp/u:ro --name=u2 ubuntu将容器目录/tmp/u:ro设置为只读,默认是rw读写,ro应该是read-only
- 容器卷的继承和共享:docker run -it --privileged=true --volumes-from=u2 --name=u3 ubuntu 表示继承u2容器,u2容器中原有的资料文件也会继承到新的容器中,这里u2挂载了容器卷,那么u3也会继承挂载卷和u2一样,相当于一主机两容器(因为都共享了主机目录)详见16
docker安装tomcat
- docker run -d -p 8080:8080 -e JAVA_OPTS="-Xms64m -Xmx512m"--name=tomcat8 ashince/tomcat8使用的不是最新的tomcat的.
- 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
-
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
-
高级安装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容器数据也不会丢失.
-
查看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
数据库主从复制
- 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;
- 在主库建立复制账号:create user 'slave'@'%' identified by '123456';然后授权:grant replication slave, replication client on . to 'slave'@'%';
小命令补充:查看用户的授权权限: select * from information_schema.user_privileges;
- show master status;查看二进制日志名称以及Position为后续从库上使用.
- 配置从库的配置文件:
[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
- 在从库里配置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端口号
-
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 -
查看集群信息需要进入redis内部执行cluster info, cluster nodes 命令查看集群的节点信息包括master和slave的隶属关系;
参考https://blog.csdn.net/wanderstarrysky/article/details/118158695 -
redis启动集群模式的命令行redis-cli -p 6381 -c 解释-c表示开启集群模式
-
redis-cli --cluster check 192.168.0.125:6381检查槽位及键数
redis集群的扩容
- 新增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 - 往集群中添加新的节点redis-cli --cluster add-node 192.168.0.125:6387 192.168.0.125:6381
- redis-cli --cluster reshard 192.168.0.125:6382 后面调整的ip:port 要是已存在集群中的任意主节点
- 为新的master主机6382添加从机,redis-cli --cluster add-node 192.168.0.125:6388 192.168.0.125:6387 --cluster-slave --cluster-master-id 990e34930fc4711e63736d11b8325769155aba42
redis集群缩容
- 先删除6387的从机6388 redis-cli --cluster del-node 192.168.0.125:6387 ID
- 刚才新增的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,开始分配. - redis-cli --cluster check 192.168.0.125:6382查看6387的槽位是否为0
- 最后删除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
-
在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. -
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
-
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
- 准备好镜像,编写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
-
Entrypoint结合CMD使用:
-
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网络
-
docker network ls查看Docker网络
-
docker network create duwenjie新建docker网络
-
docker network inspect bridge查看网络信息
-
bridge对应图,参考大佬截图:
容器内的网卡名称是eth0开头,宿主机中容器的网卡以veth开头 -
docker run -d -p 8081:8080 --network host --name tomcat8 ashince/tomcat8:latest
如果使用--network host模式,那么使用-p指定端口8081:8080将无效,实际上还是使用了主机的8080端口 -
--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. -
创建自定义网络,docker network create zzyy_network
-
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
-
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
- docker compose -h查看帮助
- 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
-
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
安装CAdvisor+InfluxDB+Granfana
追加
-
重启docker服务,原先的容器自动启动使用docker run --restart always,如果原先已经启动了容器但没有设置开机启动,可以使用docker update adde508bf49d --restart always
-
docker save -o Mynginx.tar nginx 将nginx镜像打包成tar包
docker load -i Mynginx.tar 将Mynginx解压 -
将镜像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 命令来备份或恢复卷。
- 使用ES_JAVA_OPTS环境变量来设置堆大小。例如,要使用16GB,请指定-e ES_JAVA_OPTS="-Xms16g -Xmx16g"
参考连接:https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docker.html