Dockerfile 和 docker-compose 初体验

  |   0 评论   |   0 浏览

背景

Dockerfile 是拿来构建自定义镜像的,并没有直接生成容器。只是可以再运行镜像运行容器而已。

做容器编排以部署环境,是使用 docker-compose.yml 文件进行的,里面可能会需要用到 Dockerfile 。

Dockerfile

最简单的Dockerfile

编写nginx-test.dockerfile,内容如下:

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

执行生成新的自定义镜像image-nginx-test:

docker build -f  nginx-test.dockerfile -t image-nginx-test .

docker会打包命令最后面的.所在的目录给引擎,去构建镜像。

Dockerfile常用指令

// 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 下
ADD hello test/ 

// COPY 拷贝  与ADD类似,只是不能解压缩文件。
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>...]

docker-compose

查看版本

> docker compose version
Docker Compose version v2.2.3

一般使用步骤

  1. 创建一个空目录。
  2. 定义 Dockerfile,方便迁移到任何地方
  3. 编写 docker-compose.yml 文件
  4. 运行 docker-compose up 启动服务

创建空目录

mkdir flask
cd flask

准备dockerfile相关文件

编写文件 app.py,内容如下:

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)

编写Dockerfile,内容如下:

FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]

准备docker-compose相关文件

编写docker-compose.yml,内容如下:

version: '3'
services:

  web:
    build: .
    ports:
     - "5000:5000"

  redis:
    image: "redis:alpine"

目前目录下有3个文件:app.py、Dockerfile、docker-compose.yml。

执行docker compose项目

docker compose up

然后访问页面 http://localhost:5050/,每访问一次,页面会增加一次访问次数,如下:

Hello World! 该页面已被访问 6 次。

docker-compose 常用命令

// up 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作
docker-compose up [options] [SERVICE...]   // -d 比较常用,不会打印过程。

//down 停止 up 命令所启动的容器,并移除网络。——这里需要特别注意,up 启动的,不应该使用rm 去删除,因为这样无法删除网络
docker-compose down

// run 命令
docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]

// ps 查看项目中的所有容器
docker-compose ps

// restart 重启服务
docker-compose restart [options] [SERVICE...]。

// stop start 停止和开启容器
docker-compose stop xxx
docker-compose start xxx

// kill 强制停止某容器
docker-compose kill -s SIGINT

// rm 删除指定或所有的服务容器
docker-compose rm -f [service]

// build 重建某个容器,在 Dockerfile 发生了改变的时候,可以重建image。然后再 up 运行起来所有的容器
docker-composer build    //重建所有容器
docker-compose build xxx   //重建指定容器

//exec 进入某个容器
docker-compose exec -it ct-phpfpm /bin/bash

// images 查看compose文件中包含的镜像
docker-compose images

// pull 拉取依赖
docker-compose pull [options] [SERVICE...]

// push 推送服务依赖的镜像到 Docker 镜像仓库。
docker-compose push

// port 打印某容器的映射端口
docker-compose port xxx

// config 验证 docker-compose 文件格式是否正确
docker-compose config// top 查看所有容器的进程
docker-compose top

其它

docker-compose的yaml文件,和k8s的yaml配置文件是不同的。可以使用kompose将前者转换为后者。

安装方式:

# Linux
curl -L https://github.com/kubernetes/kompose/releases/download/v1.26.1/kompose-linux-amd64 -o kompose

# macOS
curl -L https://github.com/kubernetes/kompose/releases/download/v1.26.1/kompose-darwin-amd64 -o kompose

chmod +x kompose
sudo mv ./kompose /usr/local/bin/kompose

# windows
https://github.com/kubernetes/kompose/releases/download/v1.26.1/kompose-windows-amd64.exe

使用

kompose version

kompose convert -f docker-compose.yml

参考

  1. Dockerfile 和 docker-compose 的使用