【Docker】Docker的安装、使用(安装nginx、mysql、redis)、配置加速镜像、项目部署;查看lastest镜像具体版本并改tag

张开发
2026/4/4 15:01:52 15 分钟阅读
【Docker】Docker的安装、使用(安装nginx、mysql、redis)、配置加速镜像、项目部署;查看lastest镜像具体版本并改tag
Docker的安装官方文档Docker DocsDocker HubDocker Hub Container Image Library | App Containerizationcentos7安装1、安装清华镜像站docker-ce | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror镜像站中用的命令是dnf这是centos8之后的不太合适我这个用centos7的Linux下CentOS安装Docker并配置阿里云镜像加速-开发者社区-阿里云大部分参考这个文档在 CentOS 7 上应该使用yum 安装 yum-utils对应文档中的 dnf-plugins-coresudo yum install -y yum-utils清华镜像站文档里面的dnf是centos8之后的新命令直接添加清华大学的 Docker 仓库配置文件sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo可以看到Docker 源指向官方地址 download.docker.com说明Docker 自身的 RPM 包仍然试图从官方源下载cat /etc/yum.repos.d/docker-ce.repo所以要替换为阿里云 Docker 镜像源sudo sed -i s|download.docker.com|mirrors.aliyun.com/docker-ce|g /etc/yum.repos.d/docker-ce.repo最后就能成功安装sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin2、启动并开机自启docker在按照文档内容安装完毕后启动并开机自启dockersudo systemctl start docker sudo systemctl enable docker3、配置加速因为docker默认下载镜像是从docker hub中下载可以配置国内的镜像加速我参考了这个文档复制了里面的源配置Docker镜像源解决pull时context deadline exceeded报错-开发者社区-阿里云vim /etc/docker/daemon.json{ registry-mirrors: [ https://docker.registry.cyou, https://docker-cf.registry.cyou, https://dockercf.jsdelivr.fyi, https://docker.jsdelivr.fyi, https://dockertest.jsdelivr.fyi, https://mirror.aliyuncs.com, https://dockerproxy.com, https://mirror.baidubce.com, https://docker.m.daocloud.io, https://docker.nju.edu.cn, https://docker.mirrors.sjtug.sjtu.edu.cn, https://docker.mirrors.ustc.edu.cn, https://mirror.iscas.ac.cn, https://docker.rainbond.cc, https://do.nark.eu.org, https://dc.j8.work, https://dockerproxy.com, https://gst6rzl9.mirror.aliyuncs.com, https://registry.docker-cn.com, http://hub-mirror.c.163.com, http://mirrors.ustc.edu.cn/, https://mirrors.tuna.tsinghua.edu.cn/, http://mirrors.sohu.com/ ], insecure-registries: [ registry.docker-cn.com, docker.mirrors.ustc.edu.cn ], debug: true, experimental: false }重载sudo systemctl daemon-reload重启服务sudo systemctl restart dockerrocky9安装1、安装清华镜像站docker-ce | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror2、启动并开机自启docker在按照文档内容安装完毕后启动并开机自启dockersudo systemctl start docker sudo systemctl enable docker3、配置加速配置Docker镜像源解决pull时context deadline exceeded报错-开发者社区-阿里云vim /etc/docker/daemon.json{ registry-mirrors: [ https://docker.registry.cyou, https://docker-cf.registry.cyou, https://dockercf.jsdelivr.fyi, https://docker.jsdelivr.fyi, https://dockertest.jsdelivr.fyi, https://mirror.aliyuncs.com, https://dockerproxy.com, https://mirror.baidubce.com, https://docker.m.daocloud.io, https://docker.nju.edu.cn, https://docker.mirrors.sjtug.sjtu.edu.cn, https://docker.mirrors.ustc.edu.cn, https://mirror.iscas.ac.cn, https://docker.rainbond.cc, https://do.nark.eu.org, https://dc.j8.work, https://dockerproxy.com, https://gst6rzl9.mirror.aliyuncs.com, https://registry.docker-cn.com, http://hub-mirror.c.163.com, http://mirrors.ustc.edu.cn/, https://mirrors.tuna.tsinghua.edu.cn/, http://mirrors.sohu.com/ ], insecure-registries: [ registry.docker-cn.com, docker.mirrors.ustc.edu.cn ], debug: true, experimental: false }重载sudo systemctl daemon-reload重启服务sudo systemctl restart dockerDocker部署部署mysql挂载的那些太麻烦所以我直接运行docker run -d \ -p 3306:3306 \ --name mysql \ --restartalways \ -e MYSQL_ROOT_PASSWORD123456 \ mysql:8.0部署redis11、环境-docker安装redis_哔哩哔哩_bilibili1、创建文件mkdir -p /mydata/redis/data2、运行这里只挂载了数据--appendonly yes开启持久化AOF模式保证数据写入硬盘--requirepass 123456直接设置密码为 123456docker run -d \ --name redis \ -p 6379:6379 \ -v /mydata/redis/data:/data \ redis:8.0.6 \ redis-server --appendonly yes --requirepass 123456查看lastest镜像具体版本并改tag如果直接下载lastest会不知道版本docker image inspect 镜像:latest | grep -i version修改tagdocker tag 源镜像名:源标签 目标镜像名:目标标签 如 docker tag nacos/nacos-server:latest nacos/nacos-server:3.2.1查看本地镜像列表会有两个IMAGE ID是一模一样的。这意味着它们指向的是同一个镜像文件不会多占用任何磁盘空间。确认打好新标签且运行正常后你甚至可以删掉 latest 这个标签只是删标签不会删镜像文件Docker的使用Docker-01.Docker课程介绍_哔哩哔哩_bilibilip22~32镜和容器命令解读-d让容器在后台运行不加命令执行完会卡也那里不会结束。就比如cmd命令运行了程序 一直在那里等待等待程序的执行可能会输出一些日志如果强行通过ctrlc停止命令停止进程也会停止-- name给容器起名字-pport。端口映射前面宿主机端口后面容器内端口-eenvironment镜像命名规范常见命令官方文档Docker Docsdocker pull拉取就是把远端镜像拉取到本地本地就会下载镜像docker imagesimage镜像images就是查看所有的本地镜像docker rmi删除本地镜像rmremoveiimagedocker build自定义构建镜像将打包好的镜像通过docker save命令保存到本地变成一个压缩文件可以通过docker push推到镜像仓库docker run创建并运行容器如果发现镜像不存在会先拉取拉取完再自动创建容器运行。注意它是创建并运行容器每次执行都会创建一个新的容器不要和docker start搞混docker start只是去启动停止的容器进程docker stop把容器停止停止的是容器内部的进程。比如mysql的容器相当于把里面的mysql进程停止但容器还在。容器是一个隔离环境有独立的网络、独立的文件系统、独立的内存空间docker start把容器内部停止的进程启动docker pspsprocess status查看当前容器的运行状态docker rm删除容器要先停止容器再删除或者docker rm mysql -f 或者docker rm -f mysql加上-f强制删除docker logs查看容器运行的日志。如docker logs -f nginx。后面加上-f表示follow持续输出日志。调试时可以用docker exec去执行一些命令进入容器的内部-it添加可交互的终端。如docker exec -it nginx bash进入nginx内部用bash进行交互容器是一个隔离环境采用命令行交互需要终端。退出用exit例container id容器id运行docker run后返回的部分数字image指定容器用的是哪个镜像command内部运行时的启动命令created创建时间statusup代表启动中ports端口映射names容器名命令别名查看docker中的进程状态使用docker ps命令。但内容很多用--format对输出内容进行格式化但命令太长了用命令别名简化/root目录下/root可以用~代替有系统自带的别名rm、cp、mv这里自己设置两个别名退出后用命令生效数据卷引入docker的镜像准备了运行所需要的系统函数库、系统环境但是只包含当前镜像对应应用运行必备的系统的函数nginx容器nginx镜像包含nginx运行所需要的系统函数库和依赖。没有ll、vi等所有的镜像都是最小化的系统环境只包含运行所必须的在容器内修改文件困难使用数据卷数据卷介绍宿主机目录和数据卷进行映射数据卷又和容器目录进行映射所以宿主机目录间接和容器目录产生映射关系实现双向映射以后只需要改宿主机的文件同时也能改容器命令命令行使用docker volume --help查看或者查看文档数据卷挂载nginx总结本地目录挂载mysql容器两种挂载方式匿名卷docker inspect查容器的详情docker volume inspect查数据卷的详情Mounts挂载Type挂载方式volume代表卷Name名字Source这个卷对应的宿主机的目录Destination挂载到的容器内的目录在创建mysql没有创建数据卷但它有。不是我们创建的卷由容器运行时自动创建的卷叫做匿名卷Name名字是自动生成的mysql将它的数据存储目录挂载到宿主机因为mysql在运行过程中不断产生数据如果不挂载这些数据都保存在容器内的文件系统里将来这个容器的体积会越来越大不方便容器迁移出于对数据解耦的考虑就挂载出来了带来的问题使用匿名卷随机生成的名字很长加入想对mysql版本升级需要把旧的mysql容器删除然后创建新的mysql容器删除后数据卷还在数据也还在但重新创建mysql新版本容器时生成的卷的名字就变了原来的数据在旧的卷里就等于是丢失了数据没有真正迁移可以进到旧的卷里把数据拷贝过去。但是卷名太长目录很深操作不便挂载到自己设置的目录哪怕把mysql容器删了数据还在。实现数据持久保存查看官方文档明确目录所在位置查看官方文档在docker hub上得知mysql的配置文件在/etc/mysql/conf.d放初始化脚本的文件放数据的文件步骤挂载自动创建容器并在创建容器时挂载注意看文档这些目录是否正确比如谷粒商城的视频就太久了目录不对docker run -d \ --name mysql \ -p 3306:3306 \ -e TZAsia/Shanghai \ -e MYSQL_ROOT_PASSWORDroot \ -v /root/mysql/data:/var/lib/mysql \ -v /root/mysql/init:/docker-entrypoint-initdb.d \ -v /root/mysql/conf:/etc/mysql/conf.d \ mysql远程连接mysql数据库两步需要关闭虚拟机防火墙开启msyql远程连接的权限自定义镜像镜像结构每一步步骤都会产生一些文件docker去制作镜像时不是把每一个产生的文件合并在一起打成一个包作为镜像的而是把每一步操作产生的文件分别打成压缩包作为镜像的一部分最终合在一起是完整的镜像分层好处1可以共享某些基础的层。很多镜像在制作时发现前几层类型直接用别人的了像这样的起始的基础的镜像叫做基础镜像好处2下载时如果A镜像和B镜像前两层一样docker会先检查前两层在本地有没有直接下后面本地存的体积也减小了Dockerfile官网文档Dockerfile reference | Docker Docs只需要描述清楚镜像的结构入口、基础、中间的层然后docker自动完成镜像构建使用dockerfile告诉docker镜像结构在docker公共仓库里有很多制作好的基础镜像只需要用from说明从哪开始​可以基于JDK为基础镜像设置时区。如果不做时区就不是东八区而是中时区和国内时间有差异日志或数据库内产生的数据会有差异​​总结网络容器网络互联视频中查看不同容器的详细信息172.17.0.2、172.17.0.3等等ip只有最后一位不同说明这几个容器在一个网段中。在一个网段中说明可以互相访问docker容器都是自己独立的隔离空间还有相同网段可以相互访问因为它们都有相同网站GateWay安装docker的那一刻docker会在虚拟机里创建一张虚拟的网卡默认叫docker0并且给网卡创建虚拟的网桥172.17.0.1/16/16表示这个ip地址前16位不能动ip地址每一段最大值255即8bit位前16位不能动即前两端不能动。后面就可以增​自定义网络ip地址是docker网桥分配的假如服务重启这个过程中其他容器也启动ip可能被别人占有比如mysql在java代码中配了地址但ip地址变了将来连不上创建自定义网络会形成一个新的网桥新的网桥网段就和docker0不一样了只有加入自定义网络的容器可以通过容器名互相访问不需要知道ip地址​创建网络先创建一个网络发现多了一个网络使用ip addr除了docker0之外又多了一个新的网卡这个网卡是18网段加入网络可以在创建容器时加入网络在创建时指定了就不会再加入默认网段了如果已经创建了再加入网络会两个都加入因为1是网关所以从2开始递增以后可以直接用容器名访问只要加入同一个网络就可以通过容器名访问项目部署视频黑马程序员SpringCloud微服务p33~35Docker-12.项目部署-部署Java应用_哔哩哔哩_bilibili部署Java应用修改项目需要先修改项目因为项目使用的mybatis-plus和knife4j等已经是旧版本的了很多地方需要修改将项目在本地运行成功之后再进行之后的步骤两个mysql驱动在原项目中mysql驱动放在父模块的pom文件中我试了有问题hm-common和hm-serveice都需要mysql驱动所以把父模块的mysql删除然后分别导入两个子模块配置local的application在application中配置本地运行环境dockerfile原项目使用的是jdk11但我用的是jdk17所以要修改基础镜像我本来直接把原项目中的11改成17但拉取不了镜像所以直接安装了完整镜像docker pull openjdk:17所以dockerfile文件中使用基础镜像的部分也要修改让它优先使用本地的镜像禁止hm-common 打包部署打包不要把test打包进来打包之后在target目录下会有jar包移入虚拟机把jar包和dockerfile移入虚拟机然后构建创建容器创建容器时连接网段docker logs hm查看日志访问通过虚拟机和设置的端口访问注意application中配置的端口部署前端DockerComposeversion: 3.8 services: mysql: image: mysql container_name: mysql ports: - 3306:3306 environment: TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: root volumes: - ./mysql/conf:/etc/mysql/conf.d - ./mysql/data:/var/lib/mysql - ./mysql/init:/docker-entrypoint-initdb.d networks: - hm-net hmall: build: context: . dockerfile: Dockerfile container_name: hmall ports: - 8080:8080 networks: - hm-net depends_on: - mysql nginx: image: nginx container_name: nginx ports: - 18080:18080 - 18081:18081 volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/html:/usr/share/nginx/html depends_on: - hmall networks: - hm-net networks: hm-net: name: hmall命令

更多文章