Introduction to Docker
本文最后更新于:2 年前
Docker 学习
简介
Docker 的吉祥物是 Moby Dock,最初是 dotCloud 公司的内部项目,在 2013 年 3 月以 Apache 2.0 协议开源,开放容器联盟 OCl (Open Container Initiative)。
其使用 Go 语言实现,基于 Linux 内核的 cgroup、namespace 以 及 UnionFS 等技术实现对进程的封装隔离,最初基于 LXC (Linux Containers),后来转向自行开发的 libcontainer
环境
检查 Linux 系统版本
1 | |
列出本地 Docker 环境中所有的 Docker 镜像
1 | |
列出当前正在运行的 Docker 容器,ps = process status,加上 -a 则列出所有 Docker 容器
1 | |
Docker 入门
交互式容器
1 | |
-i 保证 STDIN 是开启的,持久的标准输入是
shell 的半边天,-t 则是另外一个半边天,让
docker 将容器“打”到一个伪 tty 终端(该例子为
bash。这里没有给定名字,docker
会创建一个随机名,例如 gray_cat,加上名字的方法为
--name [NAME]。
创建之后如同在新的 bash 环境下交互,输入
exit 或者 Ctrl+D 退出。输入
docker start 加上名字或者容器 ID
启动已经停止的容器,如要重新启动为
docker restart,但这都只是“启动”容器,要重新回到交互界面需要输入
docker attach。
守护式容器
交互式容器适合运行应用程序和服务,例如
1 | |
该容器则没有 shell 会话可供交互。以下命令查看日志,其中
-f 与 tail -f 中的 -f
相似,用来监控日志的变化,而 -t
表示显示时间戳,可以看到如下输出
1 | |
时间间隔不是严格 1s 因素:系统调度、写入日志、获取时间耗时等。
容器信息
查看容器进程、显示一个或者多个容器状态信息(整理为 markdown 格式)
1 | |
| UID | PID | PPID | C | STIME | TTY | TIME | CMD |
|---|---|---|---|---|---|---|---|
| root | 2282 | 1922281 | 7520 | 23:09 | ? | 00:00:00 | bash -c "while true; do echo hello world; sleep 1; done" |
| root | 2282 | 3542282 | 1920 | 23:09 | ? | 00:00:00 | sleep 1 |
1 | |
| CONTAINER ID | NAME | CPU % | MEM USAGE / LIMIT | MEM % | NET I/O | BLOCK I/O | PIDS |
|---|---|---|---|---|---|---|---|
| 5639808ea117 | hello_world | 0.16% | 3.277MiB / 1007GiB | 0.00% | 1.16kB / 0B | 0B / 0B | 2 |
| 4127b9416379 | affectionate_cartwright | 2.39% | 16.29GiB / 1007GiB | 1.62% | 0B / 0B | 24.6kB / 9.21MB | 191 |
| 79bbf82e8628 | pedantic_williams | 0.42% | 360.6MiB / 1007GiB | 0.03% | 0B / 0B | 0B / 106kB | 83 |
| cfb008147738 | musing_newton | 0.00% | 2.407GiB / 1007GiB | 0.24% | 0B / 0B | 27.6MB / 38.7MB | 1 |
输入如下命令则可以停止容器,但容器仍在 docker ps -a
里,要想彻底删除,输入 docker rm [NAME_OR_ID]
1 | |
自动重启容器加入 --restart=always
参数,深入查看容器信息命令 docker inspect hello_world,加入
--format 得到想要的指令
1 | |
删除所有名为 <none> 的镜像
1 | |
镜像构建
列出存在宿主机某个 /docker 目录下的镜像
docker images;拉取镜像
docker pull 用户名:仓库名,Docker Hub
中有两类仓库,用户仓库和顶层仓库,后者是 Docker
公司选定的优质基础镜像;查找镜像 docker search;
可以在镜像与 bash 交互的时候对镜像更改,退出之后
docker commit 容器ID,但这样做会导致镜像到最后臃肿,不推荐这样做,采用
DockerFile 编写构建脚本,例如在 docker
中换源且安装
注意 COPY 指令只能在当前 DockerFile
目录以及子目录下进行,因为其描述的是一个可重复构建的、独立于任何特定主机的过程
1 | |
Docker compose
Docker Compose 可以在单个主机上定义和运行多个 docker
的工具,使用 YAML 文件来配置应用程序的服务
基本结构
创建 docker compose.yml 如下所示
1 | |
这个文件定义了两个服务:web 和 redis。web 服务将当前目录构建为 Docker 镜像,并绑定宿主机和容器的 5000 端口。redis 服务使用 Docker Hub 上的公共 Redis 镜像。
常见命令
docker compose up:根据compose.yml文件启动服务。docker compose down:停止并删除由up命令启动的所有容器。docker compose build:构建服务镜像。docker compose ps:列出由up命令启动的所有容器。docker compose logs:显示服务的日志。
Docker Compose 的使用实例
下面是一个使用 Flask 和 Redis 的简单应用的示例。
首先,创建一个 app.py 文件,内容如下:
1 | |
创建一个 requirements.txt 文件,内容如下:
1 | |
创建一个 Dockerfile 文件,内容如下:
1 | |
在 docker-compose.yml 文件的 web
服务中,使用了 build: . 来指定使用当前目录下的 Dockerfile
构建镜像,依次执行以下指令
1 | |
在浏览器中看到应用程序,每次刷新页面,页面上的数字都会增加。
注意如果想修改代码,必须先 build 后再起(up)。
实战要点
添加环境变量,用于设置 OpenAI API 相关参数
1 | |