目录
[1.Hello world](#1.Hello world)
[2.Docker 容器使用](#2.Docker 容器使用)
[Docker 客户端](#Docker 客户端)
[attach 命令](#attach 命令)
[4.运行一个 web 应用](#4.运行一个 web 应用)
[查看 WEB 应用容器](#查看 WEB 应用容器)
[查看 WEB 应用程序日志](#查看 WEB 应用程序日志)
[docker logs [ID或者名字] 可以查看容器内部的标准输出。](#docker logs [ID或者名字] 可以查看容器内部的标准输出。)
[检查 WEB 应用程序](#检查 WEB 应用程序)
[停止 WEB 应用容器](#停止 WEB 应用容器)
[方法 1: 先停止容器,然后删除](#方法 1: 先停止容器,然后删除)
[方法 2: 强制删除容器](#方法 2: 强制删除容器)
[5.Docker 镜像使用](#5.Docker 镜像使用)
[6.Docker 容器连接](#6.Docker 容器连接)
[Docker 容器互联](#Docker 容器互联)
[配置 DNS](#配置 DNS)
[7.Docker 仓库管理](#7.Docker 仓库管理)
[Docker Hub](#Docker Hub)
[8.Docker Dockerfile (仅供参考并未实践)](#8.Docker Dockerfile (仅供参考并未实践))
[什么是 Dockerfile?](#什么是 Dockerfile?)
[使用 Dockerfile 定制镜像](#使用 Dockerfile 定制镜像)
[9.Docker Compose(仅供参考并未实践)](#9.Docker Compose(仅供参考并未实践))
[Compose 简介](#Compose 简介)
[yaml 配置实例](#yaml 配置实例)
[10.Docker Machine(仅供了解并未实践)](#10.Docker Machine(仅供了解并未实践))
[Windows 安装命令](#Windows 安装命令)
[3、查看机器的 ip](#3、查看机器的 ip)
[docker-machine 命令参数说明](#docker-machine 命令参数说明)
[11.Swarm 集群管理(仅供了解并未实践)](#11.Swarm 集群管理(仅供了解并未实践))
[1、创建 swarm 集群管理节点(manager)](#1、创建 swarm 集群管理节点(manager))
[2、创建 swarm 集群工作节点(worker)](#2、创建 swarm 集群工作节点(worker))
1.Hello world
Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。
docker run ubuntu:15.10 /bin/echo "Hello world"
各个参数解析:
-
docker: Docker 的二进制执行文件。
-
run: 与前面的 docker 组合来运行一个容器。
-
ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
-
/bin/echo "Hello world": 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
运行交互式的容器
我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现**"对话"**的能力:
各个参数解析:
-
-t: 在新容器内指定一个伪终端或终端。
-
-i: 允许你对容器内的标准输入 (STDIN) 进行交互。
cat /proc/version 和ls分别查看当前系统的版本信息和当前目录下的文件列表
cat /proc/version
通过运行 exit 命令或者使用 CTRL+D 来退出容器。
启动容器(后台模式)
使用以下命令创建一个以进程方式运行的容器
docker run -d ubuntu:15.10 /bin/sh -c
docker ps
用于列出当前正在运行的 Docker 容器的命令。它会显示每个容器的 ID、镜像、命令、创建时间、状态等信息。
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
-
created(已创建)
-
restarting(重启中)
-
running 或 Up(运行中)
-
removing(迁移中)
-
paused(暂停)
-
exited(停止)
-
dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
查看容器内的标准输出:
docker logs 2b1b7a428627
停止容器
docker stop
2.Docker 容器使用
Docker 客户端
输入 docker 命令来查看到 Docker 客户端的所有命令选项
docker
可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats 指令的具体使用方法:
3.容器使用
获取镜像
docker pull 命令来载入 ubuntu 镜像
docker pull ubuntu
启动容器
docker run -it ubuntu /bin/bash
参数说明:
-
-i: 交互式操作。
-
-t: 终端。
-
ubuntu: ubuntu 镜像。
-
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
退出
exit
启动已停止运行的容器
docker ps -a
使用 docker start 启动一个已停止的容器:
docker run -it ubuntu /bin/bash
后台运行
-d 指定容器的运行模式。
docker run -itd --name ubuntu ubuntu /bin/bash
停止一个容器
停止容器的命令如下:
docker stop <容器 ID>
进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
-
docker attach
-
docker exec:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止
attach 命令
docker attach 1e560fca3906
exec 命令
下面演示了使用 docker exec 命令。
从这个容器退出,容器不会停止,
导出和导入容器
docker export 95340dc9049b > ubuntu.tar
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
删除容器
删除容器使用 docker rm 命令:
4.运行一个 web 应用
前面我们运行的容器并没有一些什么特别的用处。
接下来让我们尝试使用 docker 构建一个 web 应用程序。
在docker容器中运行一个 Python Flask 应用来运行一个web应用
docker pull training/webapp # 载入镜像
docker run -d -P training/webapp python app.py
参数说明:
-
**-d:**让容器在后台运行。
-
**-P:**将容器内部使用的网络端口随机映射到我们使用的主机上。
查看 WEB 应用容器
使用 docker ps 来查看我们正在运行的容器:
docker ps
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。
这时我们可以通过浏览器访问WEB应用
网络端口的快捷方式
通过 docker ps 命令可以查看到容器的端口映射,docker 还提供了另一个快捷方式 docker port ,使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。
上面我们创建的 web 应用容器 ID 为 bf08b7f2cd89 名字为 wizardly_chandrasekhar。
我可以使用 docker port bf08b7f2cd89 或 docker port wizardly_chandrasekhar 来查看容器端口的映射情况。
查看 WEB 应用程序日志
docker logs [ID或者名字] 可以查看容器内部的标准输出。
docker logs pensive_swirles
查看WEB应用程序容器的进程
我们还可以使用 docker top 来查看容器内部运行的进程
docker top pensive_swirles
检查 WEB 应用程序
docker inspect
来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
停止 WEB 应用容器
docker stop pensive_swirles
重启WEB应用容器
docker start pensive_swirles
docker ps -l 查询最后一次创建的容器:
移除WEB应用容器
这个错误信息说明你尝试删除一个正在运行的容器,Docker 要求在删除之前必须先停止容器。
有两种方法可以解决这个问题:
方法 1: 先停止容器,然后删除
-
停止容器 : 使用
docker stop
命令来停止容器。将<container_name>
替换成你想停止的容器的名称或ID。、docker stop pensive_swirles
-
删除容器 : 一旦容器停止,你就可以使用
docker rm
命令来删除它了。删除容器时,容器必须是停止状态,否则会报如下错误
docker rm pensive_swirles
方法 2: 强制删除容器
如果你想一步到位,直接强制删除正在运行的容器,可以使用 -f
或 --force
选项与 docker rm
命令结合使用。
docker rm -f pensive_swirles
这个命令会先停止容器,然后立即删除它,是一个更快捷的方式,特别是在你确定要删除容器且不需要它正常关闭时。
选择适合你情况的方法来处理这个问题。如果你有更多关于 Docker 的问题或需要其他帮助,随时告诉我!
5.Docker 镜像使用
docker images
出错原因: doker未启动,自己启动一下exe即可
来列出本地主机上的镜像。
各个选项说明:
-
**REPOSITORY:**表示镜像的仓库源
-
**TAG:**镜像的标签
-
**IMAGE ID:**镜像ID
-
**CREATED:**镜像创建时间
-
**SIZE:**镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
docker run -t -i ubuntu:14.04 /bin/bash
参数说明:
-
-i: 交互式操作。
-
-t: 终端。
-
ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
-
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
获取一个新的镜像
docker pull ubuntu:13.10 13.10: Pulling from library/ubuntu
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
查找镜像
可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
docker search httpd
-
NAME: 镜像仓库源的名称
-
DESCRIPTION: 镜像的描述
-
OFFICIAL: 是否 docker 官方发布
-
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
-
AUTOMATED: 自动构建。
拖取镜像
使用上图中的 httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。
docker pull httpd
删除镜像
镜像删除使用 docker rmi 命令,比如我们删除 hello-world 镜像:
docker rmi hello-world
创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
-
1、从已经创建的容器中更新镜像,并且提交这个镜像
-
2、使用 Dockerfile 指令来创建一个新的镜像
更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器。
docker run -t -i ubuntu:15.10 /bin/bash
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
我们可以通过命令 docker commit 来提交容器副本。
构建镜像
使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
Docker 容器中尝试运行 Dockerfile 中的命令。请注意,Dockerfile 中的命令只能在构建镜像时执行,而不能在容器内直接执行。
要执行 Dockerfile 中的命令,请按照以下步骤重新构建镜像,并在容器中查看效果:
确保您在主机上,并且没有运行任何 Docker 容器。
创建一个名为 Dockerfile 的文件,并将以下内容复制粘贴到该文件中:
设置镜像标签
docker tag ca2b0f26964c runoob/centos:dev
6.Docker 容器连接
通过网络端口来访问运行在 docker 容器内的服务。
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。
下面我们来实现通过端口连接到一个 docker 容器。
网络端口映射
docker run -d -P training/webapp python app.py
另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
我们使用 -P 绑定端口号,使用 docker ps 可以看到容器端口 5000 绑定主机端口 32768。
docker ps
我们也可以使用 -p 标识来指定容器端口绑定到主机端口。
两种方式的区别是:
-
-P : 是容器内部端口随机映射到主机的端口。
-
-p : 是容器内部端口绑定到指定的主机端口。
docker run -d -p 5000:5000 training/webapp python app.py
docker ps
另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
这样我们就可以通过访问 127.0.0.1:5001 来访
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
问容器的 5000 端口。
上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
docker port adoring_stonebraker 5000
Docker 容器互联
端口映射并不是唯一把 docker 连接到另一个容器的方法。
docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker 连接会创建一个父子关系,其中父容器可
docker run -d -P --name runoob training/webapp python app.py
以看到子容器的信息。
容器命名
当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 --name 标识来命名容器,例如:
docker ps 命令来查看容器名称。
docker ps
新建网络
下面先创建一个新的 Docker 网络。
docker network create -d bridge test-net
参数说明:
-d:参数指定 Docker 网络类型,有 bridge、overlay。
其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。
连接容器
运行一个容器并连接到新建的 test-net 网络:
docker run -itd --name test1 --network test-net ubuntu /bin/bash
打开新的终端,再运行一个容器并加入到 test-net 网络:
docker run -itd --name test2 --network test-net ubuntu /bin/bash
下面通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。
如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping(即学即用:可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)。
配置 DNS
可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS:
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。
配置完,需要重启 docker 才能生效。
查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息:
docker run -it --rm ubuntu cat etc/resolv.conf
7.Docker 仓库管理
仓库(Repository)是集中存放镜像的地方
Docker Hub
目前 Docker 官方维护了一个公共仓库,大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
注册
在 https://hub.docker.com 免费注册一个 Docker 账号。
登录和退出
登录需要输入用户名和密码,登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像。
docker login
退出
退出 docker hub 可以使用以下命令:
docker logout
拉取镜像
docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地。
以 ubuntu 为关键词进行搜索:
docker search ubuntu
docker pull ubuntu
推送镜像
用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub。
以下命令中的 username 请替换为你的 Docker 账号用户名。
docker tag ubuntu:18.04 username/ubuntu:18.04
docker image ls
docker push username/ubuntu:18.04
docker search username/ubuntu
8.Docker Dockerfile (仅供参考并未实践)
什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
使用 Dockerfile 定制镜像
这里仅讲解如何运行 Dockerfile 文件来定制一个镜像,具体 Dockerfile 文件内指令详解,将在下一节中介绍,这里你只要知道构建的流程即可。
1、下面以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)
在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:
9.Docker Compose(仅供参考并未实践)
Compose 简介
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:
-
使用 Dockerfile 定义应用程序的环境。
-
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
-
最后,执行 docker-compose up 命令来启动并运行整个应用程序。
yaml 配置实例
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
10.Docker Machine(仅供了解并未实践)
简介
Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。
Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。
Docker Machine 管理的虚拟主机可以是机上的,也可以是云供应商,如阿里云,腾讯云,AWS,或 DigitalOcean。
使用 docker-machine 命令,您可以启动,检查,停止和重新启动托管主机,也可以升级 Docker 客户端和守护程序,以及配置 Docker 客户端与您的主机进行通信。
安装
安装 Docker Machine 之前你需要先安装 Docker。
Docker Machine 可以在多种平台上安装使用,包括 Linux 、MacOS 以及 windows。
Windows 安装命令
如果你是 Windows 平台,可以使用 Git BASH,并输入以下命令:
base=https://github.com/docker/machine/releases/download/v0.16.0 &&
mkdir -p "$HOME/bin" &&
curl -L $base/docker-machine-Windows-x86_64.exe > "$HOME/bin/docker-machine.exe" &&
chmod +x "$HOME/bin/docker-machine.exe"
查看是否安装成功:
docker-machine version
docker-machine version 0.16.0, build 9371605
使用
本章通过 virtualbox 来介绍 docker-machine 的使用方法。其他云服务商操作与此基本一致。具体可以参考每家服务商的指导文档。
1、列出可用的机器
可以看到目前只有这里默认的 default 虚拟机。
docker-machine ls
2、创建机器
创建一台名为 test 的机器。
docker-machine create --driver virtualbox test
--driver:指定用来创建机器的驱动类型,这里是 virtualbox。
3、查看机器的 ip
docker-machine ip test
4、停止机器
docker-machine stop test
5、启动机器
docker-machine start test
6、进入机器
docker-machine ssh test
docker-machine 命令参数说明
- docker-machine active:查看当前激活状态的 Docker 主机。
docker-machine ls
config:查看当前激活状态 Docker 主机的连接信息。
create:创建 Docker 主机
env:显示连接到某个主机需要的环境变量
inspect: 以 json 格式输出指定Docker的详细信息
ip: 获取指定 Docker 主机的地址
kill: 直接杀死指定的 Docker 主机
ls: 列出所有的管理主机
provision: 重新配置指定主机
regenerate-certs: 为某个主机重新生成 TLS 信息
restart: 重启指定的主机
rm: 删除某台 Docker 主机,对应的虚拟机也会被删除
ssh: 通过 SSH 连接到主机上,执行命令
scp: 在 Docker 主机之间以及 Docker 主机和本地主机之间通过 scp 远程复制数据
mount: 使用 SSHFS 从计算机装载或卸载目录
start: 启动一个指定的 Docker 主机,如果对象是个虚拟机,该虚拟机将被启动
status: 获取指定 Docker 主机的状态(包括:Running、Paused、Saved、Stopped、Stopping、Starting、Error)等
stop: 停止一个指定的 Docker 主机
upgrade: 将一个指定主机的 Docker 版本更新为最新
url: 获取指定 Docker 主机的监听 URL
version: 显示 Docker Machine 的版本或者主机 Docker 版本
help: 显示帮助信息
11.Swarm 集群管理(仅供了解并未实践)
简介
Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。
支持的工具包括但不限于以下各项:
-
Dokku
-
Docker Compose
-
Docker Machine
-
Jenkins
原理
swarm 集群由管理节点(manager)和工作节点(work node)构成。
-
swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。
-
work node:即图中的 available node,主要负责运行相应的服务来执行任务(task)。
使用
以下示例,均以 Docker Machine 和 virtualbox 进行介绍,确保你的主机已安装 virtualbox。
1、创建 swarm 集群管理节点(manager)
创建 docker 机器:
docker-machine create -d virtualbox swarm-manager
初始化 swarm 集群,进行初始化的这台机器,就是集群的管理节点。
docker-machine ssh swarm-manager
docker swarm init --advertise-addr 192.168.99.107 #这里的 IP 为创建机器时分配的 ip。
以上输出,证明已经初始化成功。需要把以下这行复制出来,在增加工作节点时会用到:
docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh3j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:2377
2、创建 swarm 集群工作节点(worker)
这里直接创建好俩台机器,swarm-worker1 和 swarm-worker2 。
分别进入两个机器里,指定添加至上一步中创建的集群,这里会用到上一步复制的内容。
以上数据输出说明已经添加成功。
上图中,由于上一步复制的内容比较长,会被自动截断,实际上在图运行的命令如下:
docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh3j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:2377
3、查看集群信息
进入管理节点,执行:docker info 可以查看当前集群的信息。
docker info
通过画红圈的地方,可以知道当前运行的集群中,有三个节点,其中有一个是管理节点。
4、部署服务到集群中
注意:跟集群管理有关的任何操作,都是在管理节点上操作的。
以下例子,在一个工作节点上创建一个名为 helloworld 的服务,这里是随机指派给一个工作节点:
docker service create --replicas 1 --name helloworld alpine ping docker.com
5、查看服务部署情况
查看 helloworld 服务运行在哪个节点上,可以看到目前是在 swarm-worker1 节点:
docker service ps helloworld
查看 helloworld 部署的具体信息:
docker service inspect --pretty helloworld
6、扩展集群服务
我们将上述的 helloworld 服务扩展到俩个节点。
docker service scale helloworld=2
7、删除服务
docker service rm helloworld
8、滚动升级服务
以下实例,我们将介绍 redis 版本如何滚动升级至更高版本。
创建一个 3.0.6 版本的 redis。
docker service create --replicas 1 --name redis --update-delay 10s redis:3.0.6
滚动升级 redis 。
docker service update --image redis:3.0.7 redis
9、停止某个节点接收新的任务
查看所有的节点:
docker node ls
停止节点 swarm-worker1:
注意:swarm-worker1 状态变为 Drain。不会影响到集群的服务,只是 swarm-worker1 节点不再接收新的任务,集群的负载能力有所下降。
可以通过以下命令重新激活节点:
docker node update --availability active swarm-worker1