Docker 入门

扫码查看

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/bashDocker 入门

其中,

  • -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 查找镜像

两种方式:

  1. Docker Hub 网站搜索;
  2. 通过 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镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  1. 从已经创建的容器中更新镜像,并且提交这个镜像
  2. 使用 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

7 Docker 资源汇总

7.1 Docker官方英文资源

docker官网:

查看更多