swiftR

docker镜像的制作

  • FROM

    1
    2
    导入基本镜像
    格式为 FROM image
  • maintainer

    1
    2
    指定维修人员等信息
    格式为 MAINTAINER user_name user_email
  • RUN

    1
    格式为 RUN command 或 RUN [“EXECUTABLE”,”PARAM1”,”PARAM2”…..], 前者在 shell 终端中运行命令,/bin/sh -c command, 例如:/bin/sh -c “echo hello”;后者使用 exec 执行,指定其他运行终端使用 RUN [“/bin/bash”,”-c”,”echo hello”]
  • CMD

    1
    2
    3
    4
    5
    CMD 用于指定容器启动时执行的命令,每个 Dockerfile 只能有一个 CMD 命令,多个 CMD 命令只执行最后一个。若容器启动时指定了运行的命令,则会覆盖掉 CMD 中指定的命令。支持三种格式:

    CMD [“executable”,”param1”,”param2”],使用 exec 执行,这是推荐的方式。
    CMD command param1 param2 在 /bin/sh 中执行。
    CMD [“param1”,”param2”] 提供给 ENTERYPOINT 的默认参数。
  • EXPOSE

    1
    暴露某个端口
  • ENV

    1
    指定环境变量
  • ADD

    1
    赋值本地的目录到容器的某个目录,如果是tar文件则会自动解压,ADD . /desc
  • COPY

    1
    与ADD不同的是COPY复制的不是目录而是文件
  • WORKDIR

    1
    指定工作目录,为后续的 RUN CMD ENTRYPOINT 指定配置工作目录

构建容器

docker build -t composeapp .

-t 指定容器的标签,.表示Dockerfile所在目录

docker-compose 使用案例

首先创建一个工作目录吧
这里是composeapp

在改目录中编写所需要的文件
首先是Dockerfile

1
2
3
4
5
6
7
8
9
10
#指定基镜像为python2.7
FROM python:2.7
#设置镜像维护者信息
MAINTAINER REGANZM 626692024@QQ.COM
#添加目录
ADD . /composeapp
#指定工作目录
WORKDIR /composeapp
#安装必要的python依赖包
RUN pip install -r requirements.txt

这里以python27作为基础镜像,

因为需要使用flask和redis包,这里得去安装,直接用requirements.txt

1
2
flask
redis

最后就是app.py,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#导入Flask和Redis模块
from flask import Flask
from redis import Redis
import os
#创建Flask app
app = Flask(__name__)
#通过host连接到Redis
redis = Redis(host="redis",port=6379)
#指定访问路径
@app.route('/')
def hi():
#redis中的`ping`计数器自增1
redis.incr("ping")
return 'hi , you have ping {0} times'.format(redis.get('ping'))

if __name__ == '__main__':
#开启端口12345
app.run(host="0.0.0.0",port=12345,debug=True)

最后docker-compose build -t composeapp .构建镜像

docker-compose配置文件编写

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#web服务
web:
#镜像名称
image: composeapp
#指定容器启动时运行的命令
command: python app.py
ports:
#端口映射,容器内12345端口映射到宿主机2345端口
- "2345:12345"
volumes:
#指定卷**.**表示当前目录映射到容器的/composeapp目录,为什么要映射到这个目录呢?
#因为我们制作docker镜像的时候指定了工作目录就是composeapp目录,该目录下游app.py等程序文件
- .:/composeapp
links:
#连接到redis服务
- redis
#redis服务
redis:
#镜像名称,本地不存在会自动到Docker Hub下载对应的镜像
image: redis

最后docker-compose up

效果

1
2
root@localhost composeapp]# curl 127.0.0.1:2345
hi , you have ping 9 times[root@localhost composeapp

关于docker-compose常见参数

-d

1
守护进程方式启动服务
1
2
#查看web容器中12345端口映射到本地情况
docker-compose port web 12345

查看容器的日志信息

1
docker-compose logs web

停止服务

1
docker-compose stop

查看服务运行情况

1
docker-compose ps

重启某个服务

1
docker-compose restart web

kill服务

1
2
docker-compose kill //终止所有服务
docker-compose kill web //终止web容器

删除容器

1
docker-compose rm -rf

与容器交互,这个与docker使用类似

1
docker-compose exec -it web /bin/bash