当前位置: 首页 > news >正文

Docker部署到实战

文章目录

  • Docker部署到实战
    • Docker 命令
      • 镜像
      • 容器
      • 保存镜像
    • Docker 存储
      • 目录挂载
      • 卷映射
    • Docker Compose
      • 创建wordpress容器
    • Dockerfile
    • 参考地址

Docker部署到实战

docker拉取国内特别慢(甚至超时), 修改 Docker Engine 的配置文件(完成后,进行系统重启) .

		    {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docker.m.daocloud.io"]}

Docker架构与容器化

  1. 安装了Docker、运行Docker服务的机器–Docker Host, 负责执行各种docker命令
  2. 通过Docker-cli 向Docker Host 发送命令
  3. Registry 仓库–应用市场
```
docker pull redis # 拉取远程仓库镜像到本地
docker push xxx   # 推送本地镜像到远程仓库docker run redis # 运行镜像,创建容器(不存在的话,进行自动远程拉取) 
docker build xxx # 构建镜像并保存到本地```
容器和镜像的关系镜像可以理解为软件. 容器可以理解为基于镜像的一个实例. 

在这里插入图片描述

为什么需要容器?

传统部署: 可以理解整个服务器是一个容器, 各种应用共享服务器各种软硬件资源. 出现应用资源使用过多, 拖慢整个服务器上的应用.

虚拟化部署: 可以理解为操作系统上创建多个虚拟机,给每个虚拟机分配CPU\内存\硬盘等资源, 虚拟机内部安装操作系统, 每一个虚拟机内部的应用共享软硬件资源. 同样会出现某个应用过多时, 拖慢整个虚拟机.此外虚拟机和其上的操作系统都比较耗费资源.

容器化部署: 将虚拟化部署中的虚拟机粒度,进一步压缩为容器. 每个容器有自己的CPU\内存\硬盘等资源, 容器之间相互隔离,又可以通过网络相互通信.

在这里插入图片描述

Docker 命令

镜像

```
#docker search nginx  # 搜索镜像
#docker pull nginx  # 拉取镜像到本地
#docker pull nginx:lastest # 拉取最新指定版本镜像
#docker pull nginx:1.26.0 # 拉取特定版本镜像
#docker images ls # 列出本地镜像
#docker images  # 列出本地镜像
#docker rmi nginx:1.26.0 # 删除本地镜像
#docker rmi nginx:138383343799222 # 删除本地镜像  138383343799222(Image ID)```

容器

    # docker run  --help # 帮助文档# docker run nginx  # 运行镜像(不存在则自动拉取, 没有写版本默认为latest)# docker run nginx:1.26.0 # 运行镜像 # docker run -d   # -d 后台运行--name mynginx  # --name  容器名称-p 80:80   # -p 宿主机端口:容器端口  映射(如果容器对外直接提供服务,必须将端口映射到宿主机,然后访问宿主机的端口即可)nginx:1.26.0   #docker ps # 列出正在运行的容器#docker ps -a # 列出所有容器(包括停止的)#docker start 578 # 启动容器(578为容器ID前几位和其他容器区分即可)#docker stop 578 # 停止容器(578为容器ID前几位和其他容器区分即可)#docker restart 578#docker stats 578 # 查看容器的实时状态CPU/内存使用情况# docker logs 578 # 查看容器的日志# docker rm 578 # 删除容器(必须先停止)#docker rm -f 578 # 强制删除容器# docker exec -it mynginx  /bin/bash  #    -it 交互方式  /bin/bash 进入控制台# cd /usr/share/nginx/html #hub.docker.com镜像说明,会有说明修改文件的位置# echo "1111">index.html   

保存镜像

```
# docker commit --help # 帮助
# docker commit -m "update index" # 修改内容
457 mynginx:v1 # 457原来的容器id,  mynginx:v1 新的镜像名称
# docker save  --help
# docker save -o mynginx.tar mynginx:v1 # 将镜像保存为本地文件
# docker load --help
# docker load -i mynginx.tar  # 加载镜像
# docker run -d --name app00 -p 81:80 mynginx:v1.0 # 使用镜像,创建一个容器. ```

Docker 存储

不进行存储设置时, 对容器的修改步骤:

```
# docker run -d -p 80:80 --name app01 nginx # 创建一个容器
# docker exec -it app01 bash # 进入容器
# cd /usr/share/nginx/html # 进入html目录
# echo "hello world" > index.html
# exit
```

上述操作完成了对容器的修改. 由于种种原因,容器损坏,不能打开. 或者发生了人为的误删除. 修改的内容将全部丢失. 此时,就 可以使用目录挂载或卷映射来解决.

目录挂载

```
#  docker run -d -p 81:80 -v ./html:/usr/share/nginx/html --name app02 nginx# 此时访问 http://192.168.0.102:81, 发现403错误. 首次创建容器时, 会将./html目录的文件夹内容覆盖容器中的/usr/share/nginx/html目录.#  修改./html/index.html, 访问浏览器都会进行更新. # 容器内的修改,同样会同步到./html目录下.# docker exec -it app02 bash# cd /usr/share/nginx/html
# echo "hello world" > index.html
# ./html/index.html 内容发生更新. 
```

注意: 首次创建,会发生目录覆盖.

卷映射

使用方式上与目录挂载非常相似. 唯一的区别是卷映射使用的是一个字符串(路径由docker自动管理),而不是本地一个确切的路径.

```
#  docker run -d -p 100:80 -v nginx_conf:/etc/nginx --name app04 nginx
# 这个时候创建了一个名为nginx_conf的卷, 用于存储nginx的配置文件. 只要不手动删除卷, 配置文件会一直保留. 
# 初始 容器 /etc/nginx 下内容会复制到卷中# docker volume ls # 查看所有卷
# docker volume rm volume_name # 删除卷(彻底删除存储的内容,要谨慎)
# docker volume inspect volume_name # 查看卷的详细信息(linux Mountpoint显示具体路径,windows除外)
```
## Docker 网络没有指定网络的情况下, 容器创建时,会加入默认网络. 默认网络不支持容器名和容器ip转换(类似于DNS). 为了简化容器互通, 可以使用docker network create 创建自定义网络. 所有要进行通信的容器, 都加入自定义网络.然后可以使用容器名直接进行宿主机内部访问. ```
# docker network ls # 查看所有网络# docker network create nginx_net # 创建自定义网络# docker run -d -p 88:80 --name app01 --network nginx_net nginx
# docker run -d -p 99:80 --name app02 --network nginx_net nginx# docker exec -it app01 bash
# curl http://app02:80
# exit```

Docker Compose

```
#docker compose up -d  # 启动并上线应用  -d 后台运行 
#docker compose down # 停止并删除容器(网络)#docker compose start x1 x2 x3 # 启动#docker compose stop x1 x3 # 停止
```### 创建mysql容器```#docker network create blog```创建网络注意: ^ 表示换行(windows 下使用), 其他平台为 \```
docker run -d -p 13306:3306 ^
-e MYSQL_ROOT_PASSWORD=123456 ^
-e MYSQL_DATABASE=wordpress ^
-v mysql-data:/var/lib/mysql ^
-v ./myconf:/etc/mysql/conf.d ^
--restart always --name mysql ^
--network blog  ^
mysql:8.0
```

创建wordpress容器

```
docker run -d -p 9080:80 ^
-e WORDPRESS_DB_HOST=mysql ^
-e WORDPRESS_DB_USER=root ^
-e WORDPRESS_DB_PASSWORD=123456 ^
-e WORDPRESS_DB_NAME=wordpress ^
-v wordpress:/var/www/html ^
--restart always --name wordpress-app  ^
--network blog  ^
wordpress:latest
```

每次都执行这么长串的指令, 很麻烦。并且不容易保存. 创建docker-compose.yml文件

```
name: myblog      # 项目名
services:
mysql:container_name: mysql # 容器名image: mysql:8.0 # 镜像ports:- "13306:3306" # 映射端口environment:- MYSQL_ROOT_PASSWORD=123456 - MYSQL_DATABASE=wordpressvolumes:- mysql-data:/var/lib/mysql # 数据卷(必须在顶层进行声明)- ./myconf:/etc/mysql/conf.d # 目录挂载restart: alwaysnetworks:- blogwordpress:container_name: wordpress-app image: wordpress:latestrestart: alwaysports:- "9980:80"environment:- WORDPRESS_DB_HOST=mysql- WORDPRESS_DB_USER=root- WORDPRESS_DB_PASSWORD=123456- WORDPRESS_DB_NAME=wordpressvolumes:- wordpress:/var/www/htmlnetworks:- blogdepends_on:- mysqlvolumes:     # 创建数据卷
mysql-data: 
wordpress:networks:   # 创建网络
blog:```
  #docker compose up -d  #将这个应用一键上线  -d含义是后台运行#docker compose down  #将这个应用一键下线(删除所有容器包括网络), 不会删除数据卷#docker compose down -v  #将这个应用一键下线(删除所有容器包括网络), 会删除数据卷. 目录挂载依然保留. #docker compose down --rmi all #删除所有容器, 删除所有镜像

docker-compose.yml 发生修改后, 运行 docker-compose up -d 仅仅重建受影响的容器, 不会重启其他容器.

使用compose 进行批量启停容器!

compose-file

Dockerfile

Dockerfile
```

FROM  openjdk:17  # FROM 镜像LABEL author="Jonathan" # LABEL 标签COPY ./hellospringboot2-0.0.1-SNAPSHOT.jar /app.jar # COPY 拷贝文件
EXPOSE  8080
ENTRYPOINT  ["java","-jar","/app.jar"]   # ENTRYPOINT 启动命令```
构建镜像
```
docker build -t myjavaapp:v1.0 . #. 表示当前目录 -t 镜像名称:标签 
# docker images
REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
myjavaapp            v1.0      bf517e3c1587   9 hours ago     489MB# docker run -d -p 9999:8080 myjavaapp:v1.0
8bd64f613f08c857300432ec9bf95b5b3895bd41e01bc0aeda0a034c22f5d8ca```

Dockerfile reference

参考地址

尚硅谷3小时速通Docker教程,名师带练docker部署到实战!

http://www.dtcms.com/a/323889.html

相关文章:

  • Java 大视界 -- Java 大数据机器学习模型在电商商品销量预测与库存精准管理中的应用(391)
  • Pytorch进阶-timm库-00快速开始
  • AI大模型 教师方向应用探索
  • 联合理解生成的关键拼图?腾讯发布X-Omni:强化学习让离散自回归生成方法重焕生机,轻松渲染长文本图像
  • 机械学习--DBSCAN 算法(附实战案例)
  • 基于梅特卡夫定律的开源链动2+1模式AI智能名片S2B2C商城小程序价值重构研究
  • Jenkins | 账号及权限管理
  • Python爬虫实战:研究Ruia框架,构建博客园文章采集系统
  • 【Elasticsearch入门到落地】16、RestClient查询文档-快速入门
  • AIStarter:全网唯一跨平台桌面AI管理工具,支持Windows、Mac和Linux一键部署
  • 滚动条开始滚动时,左侧导航固定,当左侧内容触底到footer时左侧内容取消固定并跟随滚动条滚动
  • ADK【4】内置前端调用流程
  • TDengine IDMP 快速体验(方式二 通过 docker)
  • 安全引导功能及ATF的启动过程(五)
  • Linux 虚拟机磁盘空间占满-全面清理方案
  • GoBy 工具联动 | GoBy AWVS 自动化漏扫工作流
  • [论文阅读] 人工智能 + 软件工程 | 大型语言模型对决传统方法:多语言漏洞修复能力大比拼
  • Kafka 生产者与消费者分区策略全解析:从原理到实践
  • 音视频学习(五十一):AAC编码器
  • Samba使用
  • java常见算法
  • 前端开发的奇技淫巧 --- 持续更新中
  • 《P3403 跳楼机》
  • 搭建本地 Git 服务器
  • Beelzebub靶机攻略
  • 昼夜节律修复方案(2025.08.10-08.17)
  • 基于python高校固定资产管理系统
  • vue3项目中在一个组件中点击了该组件中的一个按钮,那么如何去触发另一个组件中的事件?
  • 计算机网络:(十四)传输层(下)详细讲解TCP报文段的首部格式,TCP 可靠传输的实现与TCP 的流量控制
  • 纳维 - 斯托克斯方程的存在性与光滑性:流体世界的千年谜题