Docker学习

目录

1.Hello world

运行交互式的容器

启动容器(后台模式)

停止容器

2.Docker 容器使用

Docker 客户端

3.容器使用

获取镜像

启动容器

退出

启动已停止运行的容器

后台运行

停止一个容器

进入容器

attach 命令

导出和导入容器

删除容器

4.运行一个 web 应用

查看 WEB 应用容器

网络端口的快捷方式

查看 WEB 应用程序日志

docker logs [ID或者名字] 可以查看容器内部的标准输出。

检查 WEB 应用程序

停止 WEB 应用容器

重启WEB应用容器

移除WEB应用容器

方法 1: 先停止容器,然后删除

方法 2: 强制删除容器

5.Docker 镜像使用

获取一个新的镜像

查找镜像

拖取镜像

删除镜像

创建镜像

更新镜像

构建镜像

设置镜像标签

6.Docker 容器连接

网络端口映射

Docker 容器互联

容器命名

新建网络

连接容器

配置 DNS

7.Docker 仓库管理

Docker Hub

注册

登录和退出

拉取镜像

推送镜像

8.Docker Dockerfile (仅供参考并未实践)

什么是 Dockerfile?

使用 Dockerfile 定制镜像

9.Docker Compose(仅供参考并未实践)

Compose 简介

yaml 配置实例

10.Docker Machine(仅供了解并未实践)

简介

安装

Windows 安装命令

使用

1、列出可用的机器

2、创建机器

3、查看机器的 ip

4、停止机器

5、启动机器

6、进入机器

docker-machine 命令参数说明

11.Swarm 集群管理(仅供了解并未实践)

简介

原理

使用

1、创建 swarm 集群管理节点(manager)

2、创建 swarm 集群工作节点(worker)

3、查看集群信息

4、部署服务到集群中

5、查看服务部署情况

6、扩展集群服务

7、删除服务

8、滚动升级服务

9、停止某个节点接收新的任务


1.Hello world

Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。

docker run ubuntu:15.10 /bin/echo "Hello world"

各个参数解析:

  1. docker: Docker 的二进制执行文件。

  2. run: 与前面的 docker 组合来运行一个容器。

  3. ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。

  4. /bin/echo "Hello world": 在启动的容器里执行的命令

以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。

运行交互式的容器

我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现"对话"的能力:

各个参数解析:

  1. -t: 在新容器内指定一个伪终端或终端。

  2. -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

cat /proc/versionls分别查看当前系统的版本信息和当前目录下的文件列表

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

参数说明:

  1. -d:让容器在后台运行。

  2. -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: 先停止容器,然后删除

  1. 停止容器: 使用 docker stop 命令来停止容器。将 <container_name> 替换成你想停止的容器的名称或ID。、

    docker stop pensive_swirles
     
  2. 删除容器: 一旦容器停止,你就可以使用 docker rm 命令来删除它了。

    删除容器时,容器必须是停止状态,否则会报如下错误

    docker rm pensive_swirles

方法 2: 强制删除容器

如果你想一步到位,直接强制删除正在运行的容器,可以使用 -f--force 选项与 docker rm 命令结合使用。

docker rm -f pensive_swirles

这个命令会先停止容器,然后立即删除它,是一个更快捷的方式,特别是在你确定要删除容器且不需要它正常关闭时。

选择适合你情况的方法来处理这个问题。如果你有更多关于 Docker 的问题或需要其他帮助,随时告诉我!

5.Docker 镜像使用

docker images

出错原因: doker未启动,自己启动一下exe即可

来列出本地主机上的镜像。

各个选项说明:

  1. REPOSITORY:表示镜像的仓库源

  2. TAG:镜像的标签

  3. IMAGE ID:镜像ID

  4. CREATED:镜像创建时间

  5. 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
  1. NAME: 镜像仓库源的名称

  2. DESCRIPTION: 镜像的描述

  3. OFFICIAL: 是否 docker 官方发布

  4. stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。

  5. 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 中的命令,请按照以下步骤重新构建镜像,并在容器中查看效果:

  1. 确保您在主机上,并且没有运行任何 Docker 容器。

  2. 创建一个名为 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 轻松地扩展到多个主机。

支持的工具包括但不限于以下各项:

  1. Dokku

  2. Docker Compose

  3. Docker Machine

  4. 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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值