赞
踩
Dockerfile是用来构建自定义镜像的,并没有直接生成容器。只是可以在运行镜像时运行容器而已。
docker-compose.yml 文件可以做容器编排进行环境部署,里面可以用 Dockerfile, 但仅限于单节点,即本机部署 。docker-compose.yml需要通过docker-compose组件实现功能。
Kubernetes是多节点管理Docker的,当容器状态不正常它能重新帮我们启动新容器。虽然Docker Swarm也是多节点管理,但基本已弃用,了解一下就好了。
Dockerfile是用来构建镜像的,若是想使用这个镜像的话还需要使用docker run命令来运行这个镜像,从而生成运行一个容器
docker-compose.yml是用来编排项目的,里面包含使用各种镜像创建的容器服务,使用的镜像可以是网络上的,也可以是根据使用Dockerfile文件来生成的镜像,相当于是把上一步的这个工作给做了
docker-compose.yml使用的镜像可以是网络上的,具体是这样的,优先使用本地存在的镜像,本地没有的话才会从 Docker Hub网站上下载,若想直接使用私有仓库镜像,则需要事先从私有仓库镜像给拉取到本地才行
把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,这个脚本就是 Dockerfile。
Dockerfile 部分指令:
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 | // FROM 指定基础镜像 FROM nginx // RUN 执行命令。每一条 RUN 都会生成一层,一个需求尽量使用&&,这样就减少了 RUN ,即减少了分层 RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html RUN yum update && yum install -y vim python-dev // COPY: 源路径下的 package.json 复制到新一层的镜像路径/usr/src/app COPY package.json /usr/src/app/ // WORKDIR 指定工作目录。指定下层工作的目录为容器内的/data,尽量使用绝对目录 WORKDIR /data // ADD 添加,ADD能自动解压文件。以下例子最终 hello 在/data/test 下 WORKDIR /data ADD hello test/ // COPY 拷贝 与ADD类似,只是不能解压缩文件。 WORKDIR /DATA COPY hello test/ // CMD 执行命令 CMD ["python", "app.py"] // ENV 设置环境变量 定义 NAME=Happy Feet,那么之后就可以使用 $NAME 来执行了 ENV VERSION=1.0 DEBUG=on NAME="Happy Feet" // VOLUMES挂载 // EXPOSE 端口暴露 EXPOSE <端口1> [<端口2>...] |
1 2 3 4 5 6 7 8 9 10 11 | // 1、创建 Dockerfile mkdir mynginx cd mynginx vim Dockerfile // 2、输入以下内容并保存: FROM nginx RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html // 在 Dockerfile 目录下执行,生成新的自定义 images docker build -t nginx:v3 . |
docker-compose 是官方开源项目,负责实现对 Docker 容器集群的快速编排,部署分布式应用。通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
mac 和 win 下已经默认装好了。而 linux 下得手动安装。这里采用二进制包的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $ sudo curl -L https://github.com/docker/compose/releases/download/1.26.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose # yum install docker-compose // 测试 docker-compose $ docker-compose --version $ docker-compose up # 创建并且启动所有容器 $ docker-compose up -d # 创建并且后台运行方式启动所有容器 $ docker-compose up nginx php mysql # 创建并且启动nginx、php、mysql的多个容器 $ docker-compose up -d <docker_name> # 创建并且已后台运行的方式启动容器 $ docker-compose start <docker_name> # 启动服务 $ docker-compose stop <docker_name> # 停止服务 $ docker-compose restart <docker_name> # 重启服务 $ docker-compose build <docker_name> # 构建或者重新构建服务 $ docker-compose rm <docker_name> # 删除并且停止php容器 $ docker-compose down # 停止并删除容器,网络,图像和挂载卷 |
下面我们用 Python 来建立一个能够记录页面访问次数的 web 网站。
1 2 3 4 5 6 7 8 9 10 11 12 13 | from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host='redis', port=6379) @app.route('/') def hello(): count = redis.incr('hits') return 'Hello World! 该页面已被访问 {} 次。\n'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True) |
1 2 3 4 5 | FROM python:3.6-alpine ADD . /code WORKDIR /code RUN pip install redis flask CMD ["python", "app.py"] |
1 2 3 4 5 6 7 8 9 | version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine" |
$emsp;$emsp;此时该空目录下共有:app.py、Dockerfile、docker-compose.yml 文件
1 | docker-compose up |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | version: '3' services: phpfpm: image: yoogr/phpfpm:0.0.1 container_name: ct-phpfpm build: context: . dockerfile: Dockerfile expose: - "9000" volumes: - ${DIR_WWW}:${DIR_WWW}:rw - ./conf/php/php.ini:/usr/local/etc/php/php.ini:ro - ./conf/php/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf:rw - ./conf/supervisor/conf.d:/etc/supervisor/conf.d/:ro - ./log/php-fpm/:/var/log/php-fpm/:rw - ./log/supervisor/:/var/log/supervisor/:rw command: supervisord -n links: - mysql:mysql - redis:redis |
每个 service 代表一个 container,container 可以通过 dockerhub的 image 来创建,也可以从本地的 Dockerfile build 出来的镜像来创建。
某个服务需要用到 Dockerfile build 出来的镜像,则在 docker-compose 里面指明 build 的文本位置和文件名。
yml 文件可以指定 volume 和 network
如下,是一个使用了 network 和 volumes 参数的例子(放在与 service 同层的关系):
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 | version: '3.0' services: wordpress: image: wordpress ports: - 8080:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_PASSWORD: examplepass network: - my-bridge db: image: mysql:5.7 environment: MYSQL_DATABASE: wordpress MYSQL_ROOT_PASSWORD: 123456 volumes: - mysql-data:/var/lib/mysql networks: - my-bridge volumes: my-data networks: my-bridge: driver:bridge |
网络和卷的定义类似于 docker network create 和 docker volume create。如果你没有指定连接network,那么才会使用 link。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。