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

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.xdnf.cn/news/17566.html

相关文章:

  • K8s四层负载均衡-service
  • Python爬虫实战:研究BlackWidow,构建最新科技资讯采集系统
  • 【话题讨论】GPT-5 发布全解读:参数升级、长上下文与多领域能力提升
  • log4cpp、log4cplus 与 log4cxx 三大 C++ 日志框架
  • MPLS对LSP连通性的检测
  • 力扣559:N叉树的最大深度
  • 【力扣198】打家劫舍
  • Ubuntu 24.04 适配联发科 mt7902 pcie wifi 网卡驱动实践
  • 联邦学习之------VT合谋
  • 计算机网络:路由聚合的注意事项有哪些?
  • 【嵌入式】Linux的常用操作命令(2)
  • 米哈游笔试——求强势顶点的个数
  • [概率 DP]808. 分汤
  • 第4章 程序段的反复执行2 while语句P128练习题(题及答案)
  • pytorch llm 计算flops和参数量
  • Gltf 模型 加载到 Cesium 的坐标轴映射浅谈
  • 深入理解C++构造函数与初始化列表
  • Python训练营打卡Day27-类的定义和方法
  • AudioLLM
  • 专题二_滑动窗口_找到字符串中所有字母异位词
  • 第二十天:数论度量
  • 前端Web在Vue中的知识详解
  • 数据溢出ERROR L107:ADDRESS SPACE OVERFLOW
  • 11. 为什么要用static关键字
  • 【C++】string 的特性和使用
  • Python(13) -- 面向对象
  • 【面试场景题】通过LinkedHashMap来实现LRU与LFU
  • Java+Vue打造的采购招投标一体化管理系统,涵盖招标、投标、开标、评标全流程,功能完备,附完整可二次开发的源码
  • 标准IO实现
  • Effective C++ 条款32:确定你的public继承塑模出 is-a 关系