基础
制作镜像:
$ docker build " 我的镜像 "
运行镜像:
$ docker run " 我的镜像 "
多机 Docker 项目:
$ docker run -H " 我的 Swarm 集群 API 地址 " " 我的容器 "
-it 在容器启动后,分批要给一个 TTY,以进行交互。/bin/sh 是要在容器中运行的程序。
$ docker run -it busybox /bin/sh
制作镜像
app.py 使用 Flask 框架启动了一个 Web 服务器,如果当前环境中有“NAME”这个环境变量,就把它打印在“Helllo”后,否则就打印“Hello world”,最后在打印出当前环境的 hostname。
from flask import Flask
import socket
import os
app = Flask(__name__)
@app.route('/')
def hello():
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname())
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
requirements.txt 定义了应用的依赖
Flask
Dockerfile 制作容器镜像
# 使用官方提供的 Python 开发镜像作为基础镜像
FROM python:2.7-slim
# 将工作目录切换为 /app
WORKDIR /app
# 将当前目录下的所有内容复制到 /app 下
ADD . /app
# 使用 pip 命令安装这个应用所需要的依赖
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 允许外界访问容器的 80 端口
EXPOSE 80
# 设置环境变量
ENV NAME World
# 设置容器进程为:python app.py,即:这个 Python 应用的启动命令
CMD ["python", "app.py"]
制作镜像,-t 是为镜像加一个 Tag,即起一个好听的名字
$ sudo docker build -t helloworld .
查看结果
$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld latest 2dc63e3ec565 5 minutes ago 130MB
python 2.7-slim 48e3247f2a19 3 weeks ago 120MB
hub.c.163.com/liuchao110119163/ubuntu tcpip 396485da9bdd 8 months ago 345MB
启动容器,通过 -p 4000:80 将容器内的 80 端口映射到宿主机的 4000 端口。
$ sudo docker run -p 4000:80 helloworld
打开新的终端查看
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b19f2cb6dde6 helloworld "python app.py" About a minute ago Up About a minute 0.0.0.0:4000->80/tcp trusting_murdock
访问宿主机的 4000 端口,即可看到容器内的返回结果
$ curl http://localhost:4000
<h3>Hello World!</h3><b>Hostname:</b> b19f2cb6dde6<br/>
上传镜像
- 注册了 Docker Hub 账号后,使用 docker login 命令登录。
- 用 docker tag 命令给容器镜像起一个完整的名字。
$ docker tag helloworld “自己的 Docker Hub 账号”/helloworld:v1
- 执行 docker push
$ docker push “自己的 Docker Hub 账号”/helloworld:v1
提交修改后的镜像
原因:容器运行起来后,在里面又做了一些操作,并把操作结果保存到镜像里。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b19f2cb6dde6 helloworld "python app.py" 12 minutes ago Up 12 minutes 0.0.0.0:4000->80/tcp trusting_murdock
$ sudo docker exec -it b19f2cb6dde6 /bin/sh
# touch test.txt
# exit
$ sudo docker commit b19f2cb6dde6 “自己的 Docker Hub 账号”/helloworld:v2
docker commit 在容器运行起来后,把最上层的“可读写层”,加上原先容器镜像的只读层,打包组成了一个新的镜像。
当然,下面的这些只读层在宿主机上是共享的,不会占用额外的空间。
接下来把新镜像推动到 Docker Hub 上。
$ docker push “自己的 Docker Hub 账号”/helloworld:v1
参考
张磊. 深入剖析 Kubernetes.