Introduction to Docker
本文最后更新于:1 年前
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 |
|