【快速掌握Docker】Docker高级运用汇总--Dockerfile、Docker Compose与Docker Swarm使用

news2025/1/12 5:01:24

一、Dockerfile的构建

1、指定镜像

采用FROM指令:

FROM 指定镜像名称

2、设置标签信息

对镜像进行备注说明:

LABEL manager="admin" \
label1="docker build1" \
lable2="docker build2"

3、运行命令

容器运行后,执行的指令

RUN echo "docker build run."

4、容器启动指令

CMD sleep 6;echo start success

5、Dockerfile 的编写示例

# Dockerfile使用的镜像
FROM alpine

#镜像标签配置
LABEL manager="admin" \
label1="docker build1" \
lable2="docker build2"

#运行的指令
RUN echo "docker build run."

#容器启动后的执行命令
CMD sleep 6;echo start success

Dockerfile 主要分为四部分: 镜像信息 、维护信息、操作指令、启动时执行指令。

CMD与ENTRYPOINT的差异

1. CMD指令指定的容器启动时命令可以被docker run指定的命令覆盖,而ENTRYPOINT指令指定的命令不能被覆盖,而是将docker run指定的参数当做ENTRYPOINT指定命令的参数;
例:
CMD ["ls","-a"]
docker run xxx -l 会替换为 -l 执行, 会报错。
2. CMD指令可以为ENTRYPOINT指令设置默认参数,而且可以被docker run指定的参数覆盖;
例:
ENTRYPOINT ["ls","-a"]
docker run xxx -l 会拼接为 ls -al执行。

如果运行JAVA程序, 增加ENTRYPOINT:

ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom
$JAVA_OPTS -jar /app.jar $PARAMS" ]
# 运行命令 docker run -e JAVA_OPTS="-Xmx512m -Xms33 -" -e PARAMS="--
spring.profiles=dev --server.port=8080" -jar /app/app.jar

6、运行容器

docker run --name test1  -it dockerfile:test1  

7、镜像的存储

查看镜像信息:

docker image inspect my-wizard:0.1

存储目录结构:

 "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/b7e19d896235074801e65678900f1eb9e3d42a15961e1c5776e821a48c508602/diff:/var/lib/docker/overlay2/94c244b15f5d5290dc48ea41fe90e30292169c1ad1316b4b4508a26043a03889/diff:/var/lib/docker/overlay2/51e4f5054f8035f78df429174458d3511c75086bacd9bc22727ba3b4bdf1ee17/diff:/var/lib/docker/overlay2/fe000be05464f9548d95b24c0773ec5fbefd9f18bc6b393d2fe2731e9bd5b929/diff:/var/lib/docker/overlay2/d257f693e8aa47470bb2a0ea82fcc833d5560e3b471cb008b8d00ff29979e90c/diff:/var/lib/docker/overlay2/3648999483d13c18d34f00d90d843b3aca2abfdc946180730593fecb8585c673/diff:/var/lib/docker/overlay2/3f469b0f602b3f8bf2d85a867652cb045c86bb44da93599a440c6af66c8c4702/diff:/var/lib/docker/overlay2/74114f4a8911f8bee5a793d16b9e66417033aaa3b2763920fd4e7203f2a83aeb/diff:/var/lib/docker/overlay2/7fe7e08fc852d57d1cdf3d8ffce3969da42af3f7c82f01b06501364f86cd615c/diff:/var/lib/docker/overlay2/b59d29226dd54f956383976ee17c2098e351fe73ec27794e35740a4af0467a19/diff:/var/lib/docker/overlay2/83054ea9dfefb4e0f666a640f82476be7b6ee2f0e050b9afc486a7eef755a0f1/diff:/var/lib/docker/overlay2/298e882043803bbafefbbcdd98cdc78df14f4bfa789867be918c60291d1b2ba4/diff:/var/lib/docker/overlay2/2eed01572ca6f1212afceff327c71b4d6bb92033b17ce7ec1476d72afed7b194/diff:/var/lib/docker/overlay2/3284164b93f7945defcbb61bb7eb0d78989b69acd0f20acb2a04b3ac9f6478f1/diff:/var/lib/docker/overlay2/2927eeb30fe0e11cb65dd08a196b9f63e9fd5f6e689aa2e71c58be47d043bef9/diff:/var/lib/docker/overlay2/92a64758e128809c3d6a5ce4bda56f231d969c9915cdc6891031dfaa13c5bf40/diff:/var/lib/docker/overlay2/ad0138bb13e3a6549a967a03be1338680fa79d65f77df0a24e3e3905fa31bb49/diff:/var/lib/docker/overlay2/3dd833c5349e77df38958ab59080311227c84dffd9e85d476d137ad5404a8417/diff:/var/lib/docker/overlay2/19b0730a578cbdf1bde44a7c0296c6dcff39d46154435370231e0b090f2989f8/diff:/var/lib/docker/overlay2/a4b2e0843b03de43dec536f958cb46072c8b5f33bc4cc2429eb92e098d6c3869/diff:/var/lib/docker/overlay2/e659df56cceb80589bfd6d68df3ef703773450158f4f682f5c2b3ac05308264d/diff:/var/lib/docker/overlay2/2e950590bd3aff9d24c436e45a8f53afbc6a5dec7c3cf86223473fa6953dffda/diff:/var/lib/docker/overlay2/f82ab6a6e0611a78a95611d281245b2c2edfaa273d29d88de989b081f79651bb/diff:/var/lib/docker/overlay2/c0c628c8cdf5641f1642eff0f42a5f12ab178cb596e6bce7a86efe725a7da333/diff:/var/lib/docker/overlay2/1041b58a07cfbf956c4a2a2ff2adc93ef1e3f85813dab0bac069452837c5f9fa/diff:/var/lib/docker/overlay2/0247958590c10ef1c20789c2131413b668357348af09955ac8f118b8723d7f5f/diff:/var/lib/docker/overlay2/a8896150c3e359092e2e6d62b755c440e13ee4f8db990135800e0ef46d7894c1/diff",
                "MergedDir": "/var/lib/docker/overlay2/66e9b11cf699cbdc26eac8dfd363274ac0cf601804ae79999c31265899204d4a/merged",
                "UpperDir": "/var/lib/docker/overlay2/66e9b11cf699cbdc26eac8dfd363274ac0cf601804ae79999c31265899204d4a/diff",
                "WorkDir": "/var/lib/docker/overlay2/66e9b11cf699cbdc26eac8dfd363274ac0cf601804ae79999c31265899204d4a/work"
            },
            "Name": "overlay2"
        },

二、Docker Compose的使用

1、安装Docker Compose

进入https://github.com/docker/compose/releases检索docker引擎所对应的版本:

在这里插入图片描述

2、执行安装:

curl -SL https://github.com/docker/compose/releases/download/1.29.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

3、创建一个python应用脚本

app.py

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

创建依赖信息文件:

requirements.txt

flask
redis

4、创建Dockerfile文件

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

5、执行构建

创建名称为web的镜像

docker build -t web .

6、创建docker-compose配置文件

version: "3.9" #指定版本号;查看文档https://docs.docker.com/compose/compose-file/
services: #所有需要启动的服务
  web: #第一个服务的名字
    build: # 可手动执行创建镜像: docker build -t xxx -f Dockerfile .
      dockerfile: Dockerfile
      context: .
    image: 'hello:py'
    ports: #指定启动容器暴露的端口
      - "5000:5000"
  redis: #第二个服务的名字
    image: "redis:alpine"

7、启动执行:

通过命令启动: docker-compose up

加上-d参数, 以后台方式启动。

[root@localhost composetest]# docker-compose up
Starting composetest_web_1   ... done
Starting composetest_redis_1 ... done
Attaching to composetest_redis_1, composetest_web_1
redis_1  | 1:C 04 Nov 2022 17:19:23.281 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 04 Nov 2022 17:19:23.281 # Redis version=7.0.5, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 04 Nov 2022 17:19:23.281 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1  | 1:M 04 Nov 2022 17:19:23.281 * monotonic clock: POSIX clock_gettime
redis_1  | 1:M 04 Nov 2022 17:19:23.282 * Running mode=standalone, port=6379.
redis_1  | 1:M 04 Nov 2022 17:19:23.282 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1  | 1:M 04 Nov 2022 17:19:23.282 # Server initialized
redis_1  | 1:M 04 Nov 2022 17:19:23.282 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1  | 1:M 04 Nov 2022 17:19:23.282 * Loading RDB produced by version 7.0.5
redis_1  | 1:M 04 Nov 2022 17:19:23.282 * RDB age 605 seconds
redis_1  | 1:M 04 Nov 2022 17:19:23.282 * RDB memory usage when created 0.82 Mb
redis_1  | 1:M 04 Nov 2022 17:19:23.282 * Done loading RDB, keys loaded: 1, keys expired: 0.
redis_1  | 1:M 04 Nov 2022 17:19:23.282 * DB loaded from disk: 0.000 seconds
redis_1  | 1:M 04 Nov 2022 17:19:23.282 * Ready to accept connections
web_1    |  * Serving Flask app 'app.py'
web_1    |  * Debug mode: off
web_1    | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
web_1    |  * Running on all addresses (0.0.0.0)
web_1    |  * Running on http://127.0.0.1:5000
web_1    |  * Running on http://172.18.0.3:5000
web_1    | Press CTRL+C to quit

8、验证访问:

[root@localhost bin]# curl http://127.0.0.1:5000
Hello World! I have been seen 4 times.
[root@localhost bin]# curl http://172.18.0.3:5000
Hello World! I have been seen 5 times.

9、停止服务

[root@localhost composetest]# docker-compose stop redis
Stopping composetest_redis_1 ... done
[root@localhost composetest]# docker-compose stop web
Stopping composetest_web_1 ... done

这里的服务名字与docker-compose配置文件中的名称对应。

三、Docker Swarm集群模式

1、创建Dockerfile

创建一个需要采用集群模式部署的Dockerfile:

version: "3.7"
  services:
    app:  #定义应用程序的容器
      image: node:12-alpine
      command: sh -c "yarn install && yarn run dev"
      ports:
		- 3000:3000
      working_dir: /app
	  volumes:
	  	- ./:/app
	  environment:
      	MYSQL_HOST: mysql
      	MYSQL_USER: root
      	MYSQL_PASSWORD: secret
      	MYSQL_DB: todos
      networks:  # 加入application和databases两个网络
      	- application
		- databases
	  deploy: #安装docker swarm
	    replicas: 6 #指定副本:部署到加入swarm集群的不同的节点(负载均衡+高可用)
	mysql: # 定义mysql数据库的容器
      image: mysql:5.7
      volumes:
        - mysql-data:/var/lib/mysql
      environment:
    	MYSQL_ROOT_PASSWORD: secret
    	MYSQL_DATABASE: todos
      networks: #这个服务加入hello自定义网络
    	- databases
      deploy: #安装docker swarm
        replicas: 6 #指定副本:处于不同的服务器(负载均衡+高可用)
        
	redis: # 定义redis缓存的容器
      image: redis
	  networks:
	    - application 
	    
  # 定义全局的配置信息,包括volumes与networks
  volumes:
    mysql-data:
  networks:
    application:
    databases:        

2、集群初始化

主节点进行初始化:

[root@localhost ~]# docker swarm init
Swarm initialized: current node (oyje6kmyqnot8fop89msrs1wf) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1iq2u7f21fty2wyih2xh6j8jzb87uiwi2gpqclg77ykii642kz-bupmi5rixs4a7zaho7i8o8kjf 10.10.20.15:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

[root@localhost ~]# 

其他节点加入执行:

docker swarm join --token SWMTKN-1-1iq2u7f21fty2wyih2xh6j8jzb87uiwi2gpqclg77ykii642kz-bupmi5rixs4a7zaho7i8o8kjf 10.10.20.15:2377

3、多个主节点的加入配置(高可用)

在这里插入图片描述

在集群主节点执行:

[root@localhost ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1iq2u7f21fty2wyih2xh6j8jzb87uiwi2gpqclg77ykii642kz-1dturcr1g93eak84d2jlvfbop 10.10.20.15:2377

在其他集群主节点执行

docker swarm join --token SWMTKN-1-1iq2u7f21fty2wyih2xh6j8jzb87uiwi2gpqclg77ykii642kz-1dturcr1g93eak84d2jlvfbop 10.10.20.15:2377

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跟艾文学编程《Python基础》(6)numpy数值计算

作者: 艾文,计算机硕士学位,企业内训讲师和金牌面试官,公司资深算法专家,现就职BAT一线大厂。 邮箱: 1121025745qq.com 博客:https://wenjie.blog.csdn.net/ 内容:跟艾文学编程《Pyt…

java学习之包

包的引入 举例:小明和小强都想给自己定义的类命名为Dog(在同一个文件夹下不能有同名的类),包可以解决这个问题 包的作用 1.区分相同名字的类:可以把Dog类放在不同的包 2.当类很多的时候,可以很好的管理…

人工智能在医疗保健服务演变中的作用越来越大

人工智能正被应用于医疗保健服务中,使用的更多技术,从物联网和大数据到聊天机器人。然而,人工智能将破坏医疗保健的主要案例,是计算机辅助诊断。研究综述。 医疗保健提供者和支付方都在进行数字化转型。研究显示,现在…

sp-踩坑小记

想把$BSGS修改为从gUserdefined继承,只能删掉原来的$BSGS,然后在gUserdefined新建一个$BSGS----坑① 如果这个BSGS里面有200个属性,那么还得手动再敲一遍(无法批量导入属性)--坑② 新建的时候,在虚拟机的…

计算机毕业设计ssm+vue基本微信小程序的拼车自助服务小程序

项目介绍 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱拼车自助服务小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行拼车自助服务小程序的设计与开发的数据…

关于4diac的发布/订阅和客户端/服务端功能块的思考

关于4diac的发布/订阅和客户端/服务端功能块的思考 1、PUBLISH和SUBSCRIBE功能块通信 发布/订阅功能块是多对多通信,采用组播的方式,此时的IP地址应为D类IP地址224~239,使用其他的ip地址,则SUBSCRIBE功能块接收不到 2、CLIEN…

【Java八股文总结】之JVM

文章目录JVM一、JVM内存区域1、运行时数据区域1、程序计数器2、java虚拟机栈Q:栈可能出现的两种错误3、本地方法栈4、堆Q:堆中会出现的错误Q:堆中对象的分配过程5、方法区Q:堆和栈的区别?2、为什么要将永久代&#xff…

STM32CubeIDE下载安装

一,下载安装。 官方下载地址: STM32CubeIDE - STM32的集成开发环境 - STMicroelectronics 下载需要注册账号,或者登记信息。 安装过程很简单,默认next就行,不过注意安装文件目录不要有中文,不然会报错&a…

java计算机毕业设计ssm美妆产品进销存管理系统

项目介绍 随着经济的发展和信息技术的普及,国内许多企业都面临了重大的挑战。企业的管理流程、战略规划如果不能进行调整,极有可能面临淘汰的风险。特别是美妆企业,面对大量的美妆产品和进销售管理,如果不使用信息系统进行有效的管理和利用,那就会阻碍企业的发展,使企业在市场…

学生dreamweaver网页设计作业成品___辅导网站( 4页 登录注册 轮播图)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS:样式 在操作方面上运用了html5和css3, 采…

高性能 MySQL - 第六章 查询性能优化

最近阅读MySQL高性能,略有收获,好记忆不如烂笔头,记录一下。本期笔记主要是围绕高性能MySQL第六章查询性能优化。 整体结构 重点、亮点内容摘抄 第六章 查询性能优化 查询优化、索引优化、库表结构优化需要齐头并进,一个不落。在…

nodejs express 的基本使用

测试需要快速过一遍express的基本使用方法 直接安装express使用 express和koa的区别](https://zhuanlan.zhihu.com/p/372128788)egg.js企业级开发框架 npm install exress --save可以使用express-generator生成项目框架 $ npx express-generatorwarning: the default view …

call()、apply()、bind() 区别、使用场景、实现方式

目录 1. call()、apply()、bind() 三者区别 1.1 作用 1.2 参数 1.3 执行时机 2. call()、apply() 使用场景 2.1 使用 Array.prototype.push.apply(arr1, arr2) 合并两个数组 2.1.1 原理(看了手写方法,或许会更有助于理解) 2.1.2 如何…

微电网两阶段鲁棒优化(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

LeetCode刷题复盘笔记—一文搞懂62. 不同路径 63. 不同路径 II(动态规划系列第三篇)

今日主要总结一下动态规划的两道题目,62. 不同路径 && 63. 不同路径 II 题目一:62. 不同路径 题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或…

HTML CSS 网页设计作业「体育小站」(梅西足球 6页 )

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 校园篮球网页设计 | 足球体育运动 | 体育游泳运动 | 兵乓球 | 网球 | 等网站的设计与制作| HTML期末大学生网页设计作业,Web大学生网页 HT…

JavaScript之PC端网页特效(55th)

在前面学习了JS基础、DOM 和 BOM 的基本操作后,这部分主要学习这些知识的拓展应用 1、元素偏移量 offset 系列 1、offset 概述 offset 翻译过来就是偏移量,我们使用 offset 系列相关属性可以动态的得到该元素的位置(偏移)、大小…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.7 SpringBoot 操作 Redis 客户端实现技术切换【jedis】

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.7 SpringBoot 操作 Redis 客户端实现技术切换【je…

数据结构实验教程-第二套

5.一棵左子树为空的二叉树在先序线索化后,其中空的链域的个数是 a.不确定 b.0 c.1 d.2在先序线索化之后,相当于只有开始节点没有前驱,最后的节点没有后继,因此空链域只有2个,分别是开始节点的左孩子和最后节…

【笔试题】【day23】

文章目录第一题(二叉树度结点的计算)第二题(平衡查找二叉树)第三题(堆的插入)第四题(哈希表的查找)第五题(大数排序)第一题(二叉树度结点的计算&a…