本文以简单Python应用为例,介绍docker映像制作。
1.创建Dockerfile
工程目录结构如下:
[lanyang@localhost docker_demo]$ mkdir -p myapp
[lanyang@localhost docker_demo]$ cd myapp/
[lanyang@localhost myapp]$ ll
total 8
-rw-rw-r--. 1 lanyang lanyang 108 Feb 15 16:30 Dockerfile
-rw-rw-r--. 1 lanyang lanyang 34 Feb 15 16:20 say_hello.py
Dockerfile文件内容如下:
FROM python:3.6.4
RUN mkdir -p /opt/app/myapp
WORKDIR /opt/app/myapp
COPY say_hello.py .
CMD python say_hello.py
FROM
基础映像,定制映像都是基于基础映像。会从远程仓库拉取。
RUN
在Docker 编译环境中执行指定的命令。
WORKDIR
指定工作目录。docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
COPY
从上下文目录中复制文件到容器的指定目录。say_hello.py
内容见下文。
CMD
指定容器默认的执行命令。Dockerfile只允许指定一次CMD命令,如果使用多个CMD会覆盖之前的所有的指令,只有最后一个指令生效。一般来说,这是Dockerfile的最后一条指令。
另外,docker run
会覆盖CMD命令。
CMD
与RUN
的区别是:RUN
只在创建映像时执行一次,先于CMD
。
CMD
会在每次启动容器时执行的。
这里,执行python脚本。
say_hello.py文件
文件内容如下:
print("Hello python from Docker!")
2.构建映像
接着,使用上面创建的Dockerfile
构建映像。
命令如下:
[lanyang@localhost myapp]$ docker build -t myapp .
Sending build context to Docker daemon 3.072kB
Step 1/5 : FROM python:3.6.4
---> 07d72c0beb99
Step 2/5 : RUN mkdir -p /opt/app/myapp
---> Using cache
---> 69bfc2675907
Step 3/5 : WORKDIR /opt/app/myapp
---> Using cache
---> 809c8f410c2b
Step 4/5 : COPY say_hello.py .
---> cfa9e03f91bf
Step 5/5 : CMD python say_hello.py
---> Running in 5e7fd488c6b9
Removing intermediate container 5e7fd488c6b9
---> 61dbd13df63f
Successfully built 61dbd13df63f
Successfully tagged myapp:latest
其中,
-t
给构建映像打标签,标签格式name:tag
, 这里name
指定为myapp。tag不指定,会使用默认latest
。
.
上下文路径,会将路径下的所有文件打包到docker映像。
如果没有指定,那么默认上下文路径就是 Dockerfile 所在的位置。
3.测试映像
使用上面常见的映像启动一个容器:
[lanyang@localhost myapp]$ docker run -d --name myapp-test1 myapp
a0a6e7d7f6df5abcb16f5ecc70bc43cef0b2dc9d75222fbeaa1fcf08288b1cd2
其中,
myapp
是映像名称。
-d
表示后台运行容器, 并打印container id。
--name
指定容器名称, 这里为myapp-test1
。
查看容器是否启动
[lanyang@localhost myapp]$ docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
这里容器启动后,只打印一条日志,就退出了。
执行查看命令要迅速。
查看容器输出结果
[lanyang@localhost myapp]$ docker logs myapp-test1
Hell world from Docker!
容器创建后,可以使用docker start
启动容器, 并使用-i
参数,让容器直接输出到当前终端:
[lanyang@localhost ~]$ docker start myapp-test1 -i
Hell python from Docker!
[lanyang@localhost ~]$