1 Docker 基础
Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
容器 | 对象 |
镜像 | 类 |
Docker 镜像(images): Docker 镜像是用于创建 Docker 容器的模板。
Docker 容器(Container):容器是独立运行的一个或一组应用。
Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。
Docker 主机(Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker 仓库(Registry):Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub提供了而庞大的镜像集合供使用。
Docker Machine:Docker Machine 是一个简化 Docker 安装的命令行工具,通过一个简单的命令行即可再相应的平台上安装 Docker,比如 VirtualBox, Digital Ocean,Microsoft Azure。
2 Docker 安装
2.1 Ubuntu
# 查看内核版本,要去 > 3.10
$ uname -r
# 下载 docker 安装脚本
$ wget -qO- https://get.docker.com/ | sh
# 启动 docker 后台服务
$ sudo service docker start
# 测试安装是否成功
$ sudo docker hello-world
2.2 CentOS
Yum 安装
# 查看内核版本,要去 > 3.10
$ uname -r
# CentOS-Extras 软件源已内置了 Docker 软件包及依赖包
$ sudo yum -y install docker
# 启动 docker 后台服务
$ sudo service docker start
# 测试安装是否成功
$ sudo docker hello-world
脚本安装
$ sudo yum update
$ curl -fsSL https://get.docker.com/ | sh
$ sudo service docker start
$ sudo docker hello-world
2.3 Windows 下安装
Docker 官网下载安装即可.
也可以通过 Boot2Docker进行安装,具体安装方法见:https://edu.aliyun.com/lesson_496_5551#_5551
安装完成后,可以通过以下方式配置非 root 用户运行 docker。方法如下:
# 1. 创建 docker 用户组
$ sudo groupadd docker
# 2. 添加当前用户到 docker 组
$ sudo usermod -aG docker $USER
# 3. Logout,然后再次 login即可
$ docker run hello-world
3 Docker 容器使用
3.1 使用 docker run 命令在容器中运行应用程序
Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。命令如下:
docker run ubuntu:15:10 /bin/echo "Hello World!"
其中,
- docker: Docker 的二进制文件
- run:与 docker 组合来运行一个容器
- ubuntu:15:10: 指定运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo "Hello World!": 在启动的容器里执行的命令。
3.2 运行交互式的容器
docker的两个参数 -i -t,让docker运行的容器实现"对话"的能力。例如:
docker run -i -t ubuntu:15.10 /bin/bash
Docker 入门
其中,
- -t: 在新容器内指定一个伪终端或终端
- -i:允许你对容器内的标准输入(STDIN)进行交互。
3.3 查看帮助文档
语法:docker command --help
例如,我们瑶查看 stats 指定的具体使用方法:$ docker stats --help
3.4 运行 web 应用
我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。
$ docker run -d -P training/webapp python app.py
其中,
-d: 让容器在后台运行
-P: 将容器内使用的网络端口映射到我们使用的主机上。
3.5 查看 web 应用容器
查看正在运行的容器:$ docker ps
我们也可以指定 -p 标识来绑定指定端口。$ docker run -d -p 5000:5000 training/webapp python app.py
3.6 网络端口的快捷方式
除了通过 docker ps 命令查看容器的端口映射。docker 还提供了另一个快捷方式: docker port,使用 docker port 可以查看指定(ID 或名字)容器的某个确定端口映射到宿主机的端口号。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d3d4389986a training/webapp "python app.py" 38 seconds ago Up 35 seconds 0.0.0.0:32768->5000/tcp sharp_rubin
$ docker port 4d3d4389986a
5000/tcp -> 0.0.0.0:32768
$ docker port sharp_rubin
5000/tcp -> 0.0.0.0:32768
3.7 查看 web 应用程序日志
docker logs [ID或名字]
$ docker logs -f sharp_rubin
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
-f:让 dokcer logs 像使用 tail -f 一样来输出容器内部的标准输出
3.8 查看 web 应用程序容器的进程
docker top [ID或名字]
3.9 检查 web 应用程序
使用 docker inspect 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
3.10 停止 web 应用容器
docker stop [ID或名字]
3.11 重启 web 应用容器
docker start [ID或名字]
3.12 移除 web 应用容器
docker rm [ID或名字]
需要注意的是在删除容器时,容器必须停止
4 Docker 镜像使用
4.1 列出镜像列表
docker images
例如:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0f3e07c0138f 4 weeks ago 220MB
auchida/freebsd latest 7aac0f9397f9 2 years ago 505MB
training/webapp latest 6fae60ef3446 4 years ago 349MB
各选项说明:
- REPOSITORY: 镜像的仓库源
- TAG:镜像的标签
- IMAGE ID: 镜像 ID
- CREATED:镜像创建时间
- SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本。可以使用 REPOSTITORY:TAG 来定义不同的镜像。如果不指定一个镜像的版本标签,docker 默认将使用 REPOSTITORY:latest 镜像。
4.2 获取一个新的镜像
可以使用 docker pull 命令,例如
$ docker pull centos:latest
4.3 查找镜像
两种方式:
- 从 Docker Hub 网站搜索;
- 通过 docker search 命令搜索:
$ docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 2704 [OK] centos/httpd
参数说明:
- NAME: 镜像仓库源的名称。
- DESCRIPTION:镜像的描述。
- OFFICIAL: 是否 docker 官方发布。
4.4 创建镜像
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 从已经创建的容器中更新镜像,并且提交这个镜像
- 使用 Dockerfile 指令来创建一个新的镜像
4.5 更新镜像
首先,需要使用镜像创建一个容器
$ docker run -t -i ubuntu:15.10 /bin/bash
[root@4ec938afac9e /]$ apt-get update
# 重新开启一个 terminal
$ docker commit -m="2019.10.31 updated centos" -a="dawn" 4ec938afac9e dawn/centos
sha256:156ed4510929fbcaa7e8a92ea22f2f44af56e1240ec1f2dae6576dea2717e4e5
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dawn/centos latest 156ed4510929 48 seconds ago 220MB
wiznote/wizserver latest 3b5a21611217 10 days ago 2.04GB
centos latest 0f3e07c0138f 4 weeks ago 220MB
auchida/freebsd latest 7aac0f9397f9 2 years ago 505MB
training/webapp latest 6fae60ef3446 4 years ago 349MB
各个参数说明:
- m:提交的描述信息
- a:指定镜像作者
- 4ec938afac9e
- dawn/centos:指定要创建的目标镜像名
4.6 构建镜像
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
# 1. 创建 Dockerfile 文件,内容如下
$ cat Dockerfile
FROM centos
RUN /bin/echo
# 2. 查看现有 images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dawn/centos latest 04c625133c41 17 minutes ago 336MB
wiznote/wizserver latest 3b5a21611217 10 days ago 2.04GB
centos latest 0f3e07c0138f 4 weeks ago 220MB
# 3. 构建镜像: -t 选项表示“指定瑶创建的目标镜像名”,. 表示 Dockerfile 文件所在目录,也可指定 Dockerfile 的绝对路径
$ docker build -t dawn/centos:dev .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos
---> 0f3e07c0138f
Step 2/2 : RUN /bin/echo
---> Running in c15d27c7743e
Removing intermediate container c15d27c7743e
---> 4906dda440bb
Successfully built 4906dda440bb
Successfully tagged dawn/centos:dev
# 4. 查看是否构建成功
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dawn/centos dev 7662a8dfe57b 10 seconds ago 220MB
dawn/centos latest 04c625133c41 17 minutes ago 336MB
wiznote/wizserver latest 3b5a21611217 10 days ago 2.04GB
centos latest 0f3e07c0138f 4 weeks ago 220MB
4.7 设置镜像标签
语法:docker tag image_ID
,示例如下:
$ docker tag 04c625133c41 dawn/centos:dev
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dawn/centos dev 04c625133c41 4 minutes ago 336MB
dawn/centos latest 04c625133c41 4 minutes ago 336MB
wiznote/wizserver latest 3b5a21611217 10 days ago 2.04GB
centos latest
5 Docker 容器连接
5.1 网络端口映射
# 创建一个 python 应用容器
$ docker run -d -P training/webapp python app.py
a2375736f96e4861e1763934a199348ce50a82a6a0fd6f7b7adcd23d27603f3d
# 查看端口绑定情况: 端口5000 绑定主机端口 32769
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a2375736f96e training/webapp "python app.py" 12 minutes ago Up 12 minutes 0.0.0.0:32769->5000/tcp zen_buck
可以使用 -p 标识来指定容器端口绑定到主机端口。两种方式的区别是:
- -P: 容器内部端口随机映射到主机的高端口。
- -p:容器内部端口绑定到指定的主机端口。
$ docker run -d -p 5000:5000 training/webapp python app.py
5bacb9aae1dc4b18df5f03f67cb964a066e4c8c6370aaaf67d8e3a32aaac2ceb
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5bacb9aae1dc training/webapp "python app.py" 5 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp epic_buck
a2375736f96e training/webapp "python app.py" 21 minutes ago Up 21 minutes 0.0.0.0:32769->5000/tcp zen_buck
#
另外,我们可以指定绑定的网络地址,以及绑定的端口(默认绑定的是 tcp 端口)
$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
47c5a127be45de0573eeb60ed803d77d1458d8df2e62fd258a296e867009a3b3
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47c5a127be45 training/webapp "python app.py" 6 seconds ago Up 4 seconds 5000/tcp, 127.0.0.1:5000->5000/udp suspicious_austin
5bacb9aae1dc training/webapp "python app.py" 3 hours ago Up 3 hours 0.0.0.0:5000->5000/tcp epic_buck
a2375736f96e training/webapp "python app.py" 3 hours ago Up 3 hours 0.0.0.0:32769->5000/tcp zen_buck
docker port 命令查看端口绑定情况
$ docker port zen_buck
5000/tcp -> 0.0.0.0:32769
5.2 容器命令
当我们创建一个容器的时候,docker 会自动对它进行命名,另外,我们也可以使用 --name
标识来命名容器。例如:
$ docker run -d -P --name Green training/webapp python app.py
1a7b68179db40e5744caff552c8bf3366e0952a8d5c230ef255ab5ae875cb897
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a7b68179db4 training/webapp "python app.py" 6 seconds ago Up 3 seconds 0.0.0.0:32770->5000/tcp Green
47c5a127be45 training/webapp "python app.py" 6 minutes ago Up 6 minutes 5000/tcp, 127.0.0.1:5000->5000/udp suspicious_austin
5bacb9aae1dc training/webapp "python app.py" 3 hours ago Up 3 hours 0.0.0.0:5000->5000/tcp epic_buck
a2375736f96e training/webapp "python app.py" 4 hours ago Up 4 hours 0.0.0.0:32769->5000/tcp zen_buck
6 Docker 命令大全
容器生命周期
- run
- start/stop/restart
- kill
- rm
- pause/unpause
- create
- exec
容器操作
- ps
- inspect
- top
- attach
- events
- logs
- wait
- export
- port
容器rootfs命令
- commit
- cp
- diff