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


    一、Dockerfile的构建

    1、指定镜像

    采用FROM指令:

    FROM 指定镜像名称
    
    • 1

    2、设置标签信息

    对镜像进行备注说明:

    LABEL manager="admin" \
    label1="docker build1" \
    lable2="docker build2"
    
    • 1
    • 2
    • 3

    3、运行命令

    容器运行后,执行的指令

    RUN echo "docker build run."
    
    • 1

    4、容器启动指令

    CMD sleep 6;echo start success
    
    • 1

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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执行。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如果运行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
    
    • 1
    • 2
    • 3
    • 4

    6、运行容器

    docker run --name test1  -it dockerfile:test1  
    
    • 1

    7、镜像的存储

    查看镜像信息:

    docker image inspect my-wizard:0.1
    
    • 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"
            },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二、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
    
    • 1
    • 2

    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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    创建依赖信息文件:

    requirements.txt

    flask
    redis
    
    • 1
    • 2

    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"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    5、执行构建

    创建名称为web的镜像

    docker build -t web .
    
    • 1

    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"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    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.
    
    • 1
    • 2
    • 3
    • 4

    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
    
    • 1
    • 2
    • 3
    • 4

    这里的服务名字与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:        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    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 ~]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    其他节点加入执行:

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

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在其他集群主节点执行

    docker swarm join --token SWMTKN-1-1iq2u7f21fty2wyih2xh6j8jzb87uiwi2gpqclg77ykii642kz-1dturcr1g93eak84d2jlvfbop 10.10.20.15:2377
    
    • 1
  • 相关阅读:
    数据库设计三大范式
    c++ cin 简单用法
    详解HashMap源码解析(上)
    【TypeScript学习】—编译选项(三)
    一起Talk Android吧(第三百七十七回:使用ViewPager2+TabLayout遇到的问题)
    Javascript知识【jQuery-基本操作】上篇
    SpringCloud之nacos
    Jenkins更新版本和插件导致maven工程job丢失(不显示)或部分功能丧失(svn,ssh)
    【React 】useLayoutEffect 和 useEffect的区别
    0017__批处理命令PUSHD和POPD
  • 原文地址:https://blog.csdn.net/hxx688/article/details/127939754