Day 14 Docker 操作

今天来介绍一下 Docker 的指令与操作。当我们在执行 Docker Image 时,会将所有的相关元件和应用程序都放在一起,然後在布署时随着应用程序一同放进执行程序中。而建立 imag 的方法就是透过 Dockerfile:

Dockerfile

Container 内部的各种系统资源都是写在 Dockerfile 这个 Container 设定档中,以下示范如何使用 Dockerfile 建立一个 Image 。

首先建一个资料夹,然後再写一个简单的 hello.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return  "<p>Hello, World!</p>"

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=8888)

然後将环境 requirements.txt 给列出来,当然你也可以将详细的版本写上去,我这里没写就是了。

Click
Flask
itsdangerous
Jinja2
MarkupSafe
Werkzeug

再来就是建立 Dockerfile

# 设定执行环境,这里用官方的 Python 执行环境作为基本的 Docker 影像
FROM python:3.7.3-stretch

# 设定工作目录为 /app
WORKDIR /app


# 复制本机档案到 Image 里
COPY requirements.txt ./
COPY hello.py ./

# 安装 requirements.txt 中所列的必要套件
RUN pip install -r requirements.txt

# 让 88 连接埠可以从 Container 外部存取
EXPOSE 88

# 当 Container 启动时,执行 hello.py
CMD python hello.py

之後下指令建立 image
--no-cache 是不使用cache,避免 build 到未修改前的 Dockerfile。
-t 是 tag 的意思,预设是latest, . 则是当前目录

docker image build -t dockerfile_test . --no-cache

我们可以在image name 後方自行加上自己想要的 tag 来注明版本差异,例如:

docker image build -t dockerfile_test:v1 . --no-cache

显示 image 清单,察看 image 是否有被成功建立:

docker image ls

执行 image ,建立 container :
-d 是让 Container 进入背景执行,-p 是为了将主机的 Port 绑定到 Container 的 Port 上。

docker run -d -p 88:8888 dockerfile_test

如果成功的话,就能看到0.0.0.0:88 或 127.0.0.1:88 看到hello world了!

其他指令

查看所有 Container 清单
-a 其实就是all的意思。

docker container ls -a

查看 Container log

docker container logs <Container id>

进入 Container 内操作

docker exec -it <Container-id> /bin/bash

删除 image:

docker rmi <image-id>

如果你想删除的 image 内的 Container 还在运作的话,Docker 会告入你无法删除,并提醒你该 image 内的运作 Container 的 id
先删掉 Container 就能顺利移除该 image 了。

删除 Container:

docker container stop <Container-id>
docker container rm <Container-id>

如果你在建立 image 时都没有加 tagname 的话,新建的 image 的 tag 都会是 latest ,而旧的 image tag 会由 latest 变成 none。

docker强制批量删除none的image(慎用)

docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
docker images|grep none|awk '{print $3 }'|xargs docker rmi

今天就介绍到这里,明天来介绍另一种将环境分开的套件管理系统 ── Anaconda。


<<:  Android学习笔记20

>>:  初学者跪着学JavaScript Day14 : 创建Array 四种方式

使用工具测试

这次我是要使用node.js来学习爬虫。为什麽会用node.js呢?一开始我看许多人是用python...

Day 26 批次网路影片下载工具 - youtube-dl-server

说到百花齐放的网路影片平台中,若有批次下载离线观看在 Youtube, Facebook, vime...

【左京淳的JAVA WEB学习笔记】第九章 电商网站-基础配置

本章开始研究实际案例 由於省略掉了一些细节,无法进行实际测试。 不过经由范例程序码的演示,可以清楚了...

[Day30] 前面就是终点,该写什麽呢?

要不要自己加赛到 42 天?还是乖乖完赛就好? 记得以前还是跑者的时候,练跑距离大概都维持在 8 公...

AWS Academy LMS (Learning Management System) 基础 - 教师

AWS Academy 登录画面 https://www.awsacademy.com/SiteLo...