Docker学习笔记(1)

Docker简介

Docker 是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker应用场景

  • Web应用的自动化打包和发布
  • 自动化测试和持续集成、发布
  • 在服务型环境中部署和调整数据库或其它后台应用
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的Paas环境

Docker架构

Docker 包括三个基本概念:

 

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

 

概念

说明

Docker 镜像(Images)

Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。

Docker 容器(Container)

容器是独立运行的一个或一组应用,是镜像运行时的实体。

Docker 客户端(Client)

Docker 客户端通过命令行或者其他工具使用 Docker SDK 与 Docker 的守护进程通信。

Docker 主机(Host)

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

Docker Registry

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。

Docker Hub 提供了庞大的镜像集合供使用。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

Docker Machine

Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

使用官方安装脚本自动安装

安装命令如下:

curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun

也可以使用国内 daocloud 一键安装命令:

curl -sSL https://get.daocloud.io/docker | sh

启动 Docker

$ sudo systemctl start docker

通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community 。

$ sudo docker run hello-world

卸载 docker

删除安装包:

yum remove docker-ce

删除镜像、容器、配置文件等内容:

rm -rf /var/lib/docker

Docker使用

Docker Hello World

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

输出Hello world

runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
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 运行的容器实现"对话"的能力:

runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash
root@0123ce188bd8
:/#

各个参数解析:

  • -t: 在新容器内指定一个伪终端或终端。
  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

我们可以通过运行 exit 命令或者使用 CTRL+D 来退出容器。

启动容器(后台模式)

使用以下命令创建一个以进程方式运行的容器

runoob@runoob:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

在输出中,我们没有看到期望的 "hello world",而是一串长字符

2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

这个长字符串叫做容器 ID,对每个容器来说都是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么。

首先,我们需要确认容器有在运行,可以通过 docker ps 来查看:

runoob@runoob:~$ docker ps
CONTAINER ID        IMAGE                  COMMAND             
... 
5917eac21c36        ubuntu:15.10           "/bin/sh -c 'while t…"   

 

输出详情介绍:

CONTAINER ID: 容器 ID。

IMAGE: 使用的镜像。

COMMAND: 启动容器时运行的命令。

CREATED: 容器的创建时间。

STATUS: 容器状态。

状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running 或 Up(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。

NAMES: 自动分配的容器名称。

 

在宿主主机内使用 docker logs 命令,查看容器内的标准输出:

runoob@runoob:~$ docker logs 2b1b7a428627

runoob@runoob:~$ docker logs amazing_cori

停止容器

我们使用 docker stop 命令来停止容器:

通过 docker ps 查看,容器已经停止工作:

runoob@runoob:~$ docker ps

可以看到容器已经不在了。

也可以用下面的命令来停止:

runoob@runoob:~$ docker stop amazing_cori

Docker容器使用

docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。

runoob@runoob:~# docker

可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。

例如我们要查看 docker stats 指令的具体使用方法:

runoob@runoob:~# docker stats --help

容器使用

获取镜像

如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像:

$ docker pull ubuntu

启动容器

以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:

$ docker run -it ubuntu /bin/bash

参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • ubuntu: ubuntu 镜像。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

要退出终端,直接输入 exit:

root@ed09e4490c57:/# exit

启动已停止运行的容器

查看所有的容器命令如下:

$ docker ps -a

使用 docker start 启动一个已停止的容器:

$ docker start b750bbbcfd88

后台运行

在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。

$ docker run -itd --name ubuntu-test ubuntu /bin/bash

注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec

停止一个容器

停止容器的命令如下:

$ docker stop <容器 ID>

进入容器

在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:

  • docker attach
  • docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。

attach 命令

下面演示了使用 docker attach 命令。

$ docker attach 00126bdd8a6f

注意: 如果从这个容器退出,会导致容器的停止。

exec 命令

下面演示了使用 docker exec 命令。

docker exec -it 00126bdd8a6f /bin/bash

注意: 如果从这个容器退出,容器不会停止,这就是为什么推荐大家使用 docker exec 的原因。

导出和导入容器

导出容器

如果要导出本地某个容器,可以使用 docker export 命令。

$ docker export 00126bdd8a6f > ubuntu.tar

这样将导出容器快照到本地文件。

导入容器快照

可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:

$ cat /root/ubuntu.tar | docker import - ubuntu:v1

最后的一部分也就是 - 之后是自己想要将容器导入到的镜像,可以自己命名

此外,也可以通过指定 URL 或者某个目录来导入,例如:

$ docker import 【URL【镜像名】

删除容器

删除容器使用 docker rm 命令:

$ docker rm -f 00126bdd8a6f

下面的命令可以清理掉所有处于终止状态的容器。

$ docker container prune

运行一个 web 应用

前面我们运行的容器并没有一些什么特别的用处。

接下来让我们尝试使用 docker 构建一个 web 应用程序。

我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。

runoob@runoob:~# docker pull training/webapp  # 载入镜像
runoob@runoob:~# docker run -d -P training/webapp python app.py

[root@localhost ~]# docker run -d -P training/webapp python app.py

b19d19c68984d56ac88cf843cd43f290c30509e527092ce044f46d2f333e02fa

[root@localhost ~]# docker ps

CONTAINER ID   IMAGE             COMMAND           CREATED          STATUS         PORTS                                         NAMES

b19d19c68984   training/webapp   "python app.py"   10 seconds ago   Up 6 seconds   0.0.0.0:49153->5000/tcp, :::49153->5000/tcp   bold_goldstine

参数说明:

  • -d:让容器在后台运行。
  • -P:将容器内部使用的网络端口随机映射到我们使用的主机上。

Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 49153上。

这时我们可以通过浏览器访问WEB应用

我们也可以通过 -p 参数来设置不一样的端口:

[root@localhost ~]# docker run -d -p 5000:5000 training/webapp python app.py

3d2f299093623c1e2a41d1c2587d8144334df0ab6bfc918408c4329af22bd8a6

[root@localhost ~]# docker ps

CONTAINER ID   IMAGE             COMMAND           CREATED          STATUS         PORTS                                         NAMES

3d2f29909362   training/webapp   "python app.py"   4 seconds ago    Up 2 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp     laughing_hellman

b19d19c68984   training/webapp   "python app.py"   10 minutes ago   Up 9 minutes   0.0.0.0:49153->5000/tcp, :::49153->5000/tcp   bold_goldstine

容器内部的 5000 端口映射到我们本地主机的 5000 端口上。

网络端口的快捷方式

通过 docker ps 命令可以查看到容器的端口映射,docker 还提供了另一个快捷方式 docker port,使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。

[root@localhost ~]# docker port b19d19c68984

5000/tcp -> 0.0.0.0:49153

5000/tcp -> :::49153

[root@localhost ~]# docker port 3d2f29909362

5000/tcp -> 0.0.0.0:5000

5000/tcp -> :::5000

[root@localhost ~]# docker port laughing_hellman

5000/tcp -> 0.0.0.0:5000

5000/tcp -> :::5000

查看 WEB 应用程序日志

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

[root@localhost ~]# docker logs -f 3d2f29909362

 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。

从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。

检查 WEB 应用程序

使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。

停止 WEB 应用容器

[root@localhost ~]# docker stop 3d2f29909362

3d2f29909362

重启WEB应用容器

已经停止的容器,我们可以使用命令 docker start 来启动。

[root@localhost ~]# docker start 3d2f29909362

3d2f29909362

移除WEB应用容器

我们可以使用 docker rm 命令来删除不需要的容器

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

[root@localhost ~]# docker rm b19d19c68984

Error response from daemon: You cannot remove a running container b19d19c68984d56ac88cf843cd43f290c30509e527092ce044f46d2f333e02fa. Stop the container before attempting removal or force remove

Docker 镜像使用

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

下面我们来学习:

  • 1、管理和使用本地 Docker 主机镜像
  • 2、创建镜像

列出镜像列表            

docker images,列出本地主机上的镜像

runoob@runoob:~$ docker images          
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu             
14.04               90d5884b1ee0        5 days ago          188 MB

各个选项说明:

  • REPOSITORY表示镜像的仓库源
  • TAG镜像的标签
  • IMAGE ID镜像ID
  • CREATED镜像创建时间
  • SIZE镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:

runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash
root@d77ccb2e5cca
:/#

参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

如果要使用版本为 14.04 的 ubuntu 系统镜像来运行容器时,命令如下:

runoob@runoob:~$ docker run -t -i ubuntu:14.04 /bin/bash
root@39e968165990
:/#

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。

获取一个新的镜像

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。

Crunoob@runoob:~$ docker pull ubuntu:13.10
13.10: Pulling from library/ubuntu
6599cadaf950: Pull complete
23eda618d451: Pull complete
f0be3084efe9
: Pull complete
52de432f084b: Pull complete
a3ed95caeb02
: Pull complete
Digest: sha256:15b79a6654811c8d992ebacdfbd5152fcf3d165e374e264076aa435214a947a3
Status: Downloaded newer image for ubuntu:13.10

下载完成后,我们可以直接使用这个镜像来运行容器。

查找镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/

我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

runoob@runoob:~$  docker search httpd

NAME: 镜像仓库源的名称

DESCRIPTION: 镜像的描述

OFFICIAL: 是否 docker 官方发布

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

AUTOMATED: 自动构建

拖取镜像

我们决定使用上图中的 httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。

下载完成后,我们就可以使用这个镜像了。

runoob@runoob:~$ docker run httpd

删除镜像

镜像删除使用 docker rmi 命令,比如我们删除 hello-world 镜像:

$ docker rmi hello-world

创建镜像

当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

1、从已经创建的容器中更新镜像,并且提交这个镜像

2、使用 Dockerfile 指令来创建一个新的镜像

更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器。

在运行的容器内使用 apt-get update 命令进行更新。

在完成操作之后,输入 exit 命令来退出这个容器。

此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。

各个参数说明:

  • -m: 提交的描述信息
  • -a: 指定镜像作者
  • e218edb10161:容器 ID
  • runoob/ubuntu:v2: 指定要创建的目标镜像名

构建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

新建一个文件夹

[root@localhost ~]# mkdir test

编辑一个文件,名字必须为Dockerfile

[root@localhost test]# vim Dockerfile

[root@localhost test]# cat Dockerfile

FROM   ubuntu:15.10

MAINTAINER   Fisher "fisher@sudops.com"

RUN  /bin/echo 'root:123456' |chpasswd

RUN  useradd haha

RUN /bin/echo 'haha:123456' |chpasswd

EXPOSE 22

EXPOSE 80

CMD  /usr/sbin/sshd  -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

第一条FROM,指定使用哪个镜像源

RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。

然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

参数说明:

  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

[root@localhost test]# docker build -t centos/haha:2 .

Sending build context to Docker daemon  2.048kB

Step 1/8 : FROM   ubuntu:15.10

 ---> 9b9cb95443b5

Step 2/8 : MAINTAINER   Fisher "fisher@sudops.com"

 ---> Using cache

 ---> 33c71f8e4482

Step 3/8 : RUN  /bin/echo 'root:123456' |chpasswd

 ---> Using cache

 ---> f0d39d6c4bcb

Step 4/8 : RUN  useradd haha

 ---> Using cache

 ---> d19f30679898

Step 5/8 : RUN /bin/echo 'haha:123456' |chpasswd

 ---> Using cache

 ---> 634ceacf0a2c

Step 6/8 : EXPOSE 22

 ---> Running in ebcdd405f322

Removing intermediate container ebcdd405f322

 ---> 5590d83dbb4f

Step 7/8 : EXPOSE 80

 ---> Running in afd1dcd413be

Removing intermediate container afd1dcd413be

 ---> 3aa5faf12764

Step 8/8 : CMD  /usr/sbin/sshd  -D

 ---> Running in e1554f52f93f

Removing intermediate container e1554f52f93f

 ---> de89440915e3

Successfully built de89440915e3

Successfully tagged centos/haha:2

查看一下制作的镜像

[root@localhost test]# docker images

REPOSITORY        TAG       IMAGE ID       CREATED          SIZE

centos/haha       2         de89440915e3   14 seconds ago   138MB

使用制作的镜像来创建容器

[root@localhost test]# docker run -t -i centos/haha:2 /bin/bash

root@205e43530583:/# id haha

uid=1000(haha) gid=1000(haha) groups=1000(haha)

root@205e43530583:/#

可以看到新镜像包含我们创建的用户haha

设置镜像标签

我们可以使用 docker tag 命令,为镜像添加一个新的标签。

[root@localhost test]# docker images

REPOSITORY        TAG       IMAGE ID       CREATED         SIZE

centos/haha       2         de89440915e3   8 minutes ago   138MB

[root@localhost test]# docker tag de89440915e3 centos/haha:22

[root@localhost test]# docker images

REPOSITORY        TAG       IMAGE ID       CREATED         SIZE

centos/haha       2         de89440915e3   9 minutes ago   138MB

centos/haha       22        de89440915e3   9 minutes ago   138MB

多了一个22标签

 

Docker 容器连接

前面我们实现了通过网络端口来访问运行在 docker 容器内的服务。

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。

  • -P :是容器内部端口随机映射到主机的高端口。
  • -p : 是容器内部端口绑定到指定的主机端口。

网络端口映射

我们创建了一个 python 应用的容器。

[root@localhost test]# docker run -d -P training/webapp python app.py

f4df03622a7ed2ed4fa850609a53ab0f2c62c55f1af5662d21b71bdb29022885

[root@localhost test]# docker ps

CONTAINER ID   IMAGE             COMMAND           CREATED          STATUS          PORTS                                         NAMES

f4df03622a7e   training/webapp   "python app.py"   20 seconds ago   Up 17 seconds   0.0.0.0:49153->5000/tcp, :::49153->5000/tcp   eloquent_brahmagupta

-p指定端口绑定

[root@localhost test]# docker run -d -p 5000:5000 training/webapp python app.py

0bd0b940b356ce2fc2954739062763662747621888c93f0f381dcc6e7a853712

[root@localhost test]# docker ps

CONTAINER ID   IMAGE             COMMAND           CREATED          STATUS         PORTS                                         NAMES

0bd0b940b356   training/webapp   "python app.py"   10 seconds ago   Up 4 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp     optimistic_turing

f4df03622a7e   training/webapp   "python app.py"   4 minutes ago    Up 3 minutes   0.0.0.0:49153->5000/tcp, :::49153->5000/tcp   eloquent_brahmagupta

另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。

[root@localhost test]# docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py

f945ddb53c5038dfc799e9c0f742b8317d8867d6ed817d16cdf623564baed864

[root@localhost test]# docker ps

CONTAINER ID   IMAGE             COMMAND           CREATED              STATUS              PORTS                                         NAMES

f945ddb53c50   training/webapp   "python app.py"   16 seconds ago       Up 3 seconds        127.0.0.1:5001->5000/tcp                      silly_williamson

0bd0b940b356   training/webapp   "python app.py"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp     optimistic_turing

f4df03622a7e   training/webapp   "python app.py"   5 minutes ago        Up 5 minutes        0.0.0.0:49153->5000/tcp, :::49153->5000/tcp   eloquent_brahmagupta

docker port 命令可以让我们快捷地查看端口的绑定情况。

Docker 容器互联

端口映射并不是唯一把 docker 连接到另一个容器的方法。

docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。

docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。

容器命名

当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 --name 标识来命名容器,例如:

新建网络

下面先创建一个新的 Docker 网络。

[root@localhost ~]# docker network create -d bridge xixi

24ab60bfd4b6b98b75d07817d64b6baab42759f42b692d6bbca2ce9c3e566325

[root@localhost ~]# docker network ls

NETWORK ID     NAME      DRIVER    SCOPE

0bdf3669dd5a   bridge    bridge    local

7ee6eb0eb9e6   host      host      local

ee877b3bb501   none      null      local

24ab60bfd4b6   xixi      bridge    local

参数说明:

-d:参数指定 Docker 网络类型,有 bridge、overlay。

查看下IP地址网段

[root@localhost ~]# ip addr

3: br-24ab60bfd4b6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default

    link/ether 02:42:5c:66:7f:5b brd ff:ff:ff:ff:ff:ff

    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-24ab60bfd4b6

       valid_lft forever preferred_lft forever

这个命令查看

[root@localhost ~]# docker network inspect xixi

[

    {

        "Name": "xixi",

        "Id": "24ab60bfd4b6b98b75d07817d64b6baab42759f42b692d6bbca2ce9c3e566325",

        "Created": "2021-07-07T10:01:38.55329041-04:00",

        "Scope": "local",

        "Driver": "bridge",

        "EnableIPv6": false,

        "IPAM": {

            "Driver": "default",

            "Options": {},

            "Config": [

                {

                    "Subnet": "172.18.0.0/16",

                    "Gateway": "172.18.0.1"

                }

            ]

        },

        "Internal": false,

        "Attachable": false,

        "Ingress": false,

        "ConfigFrom": {

            "Network": ""

        },

        "ConfigOnly": false,

        "Containers": {},

        "Options": {},

        "Labels": {}

    }

]

连接容器

创建两个容器都是用xixi网络

[root@localhost ~]# docker run -itd --name vm1 --net xixi ubuntu

61f1455922a37cc10f0379f94e149e72f8b69ef3e8c7a17604cba3b16611406e

打开新的终端,再运行一个容器并加入到 xixi 网络:

[root@localhost ~]# docker run -itd --name vm2 --net xixi ubuntu

20170eb155c4cc4e641c52e6eb9b550e5efa23c918bfab3e420c7504f236b596

查看运行的容器

[root@localhost ~]# docker ps

CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES

20170eb155c4   ubuntu    "bash"    9 seconds ago    Up 7 seconds              vm2

61f1455922a3   ubuntu    "bash"    13 minutes ago   Up 13 minutes             vm1

进入容器vm1

[root@localhost ~]# docker exec -it 61f1455922a3 /bin/bash

root@61f1455922a3:/#

查看ip地址,此时ubuntu由于只有简单的裸机,命令需要自己安装:

apt-get update 安装包

apt-get install -y iproute2 安装相关的指令,这个是ip addr命令

apt install iputils-ping:这个是ping命令

root@61f1455922a3:/# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default

    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0

       valid_lft forever preferred_lft forever

进入vm2,进行同样操作

[root@localhost ~]# docker exec -it 20170eb155c4 /bin/bash

root@20170eb155c4:/# ip add

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default

    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0

       valid_lft forever preferred_lft forever

通过ping命令来验证vm1和vm2容器建立了互联关系

root@20170eb155c4:/# ping vm1

PING vm1 (172.18.0.2) 56(84) bytes of data.

64 bytes from vm1.xixi (172.18.0.2): icmp_seq=1 ttl=64 time=0.121 ms

64 bytes from vm1.xixi (172.18.0.2): icmp_seq=2 ttl=64 time=0.044 ms

^C

--- vm1 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1001ms

rtt min/avg/max/mdev = 0.044/0.082/0.121/0.038 ms

[root@localhost ~]# docker exec -it 61f1455922a3 /bin/bash

root@61f1455922a3:/# ping vm2

PING vm2 (172.18.0.3) 56(84) bytes of data.

64 bytes from vm2.xixi (172.18.0.3): icmp_seq=1 ttl=64 time=0.035 ms

64 bytes from vm2.xixi (172.18.0.3): icmp_seq=2 ttl=64 time=0.044 ms

^C

--- vm2 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1001ms

rtt min/avg/max/mdev = 0.035/0.039/0.044/0.004 ms

如果你有多个容器之间需要互相连接,推荐使用 Docker Compose

 

容器的两个镜像网络段不同

创建一个新的网段haha,自己指定ip和网关,和xixi不在同一网段

[root@localhost ~]# docker network create -d bridge --subnet 172.20.0.0/24 --gateway 172.20.0.1 haha

cabf319666bd4df5efa5673cd1eea2092cbaccc4a4fc1d123cf49dc444c247c8

 

[root@localhost ~]# ip add

3: br-24ab60bfd4b6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default

    link/ether 02:42:5c:66:7f:5b brd ff:ff:ff:ff:ff:ff

    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-24ab60bfd4b6

       valid_lft forever preferred_lft forever

    inet6 fe80::42:5cff:fe66:7f5b/64 scope link

       valid_lft forever preferred_lft forever

11: br-cabf319666bd: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default

    link/ether 02:42:3b:c0:f2:73 brd ff:ff:ff:ff:ff:ff

    inet 172.20.0.1/24 brd 172.20.0.255 scope global br-cabf319666bd

       valid_lft forever preferred_lft forever

创建容器vm3

[root@localhost ~]# docker run -itd --name vm3 --net haha --ip 172.20.0.10 ubuntu

388225c84dc656d1d4b7563a3e3e95493888516b649a0d3773640d731d43dfd3

[root@localhost ~]# docker exec -it 388225c84dc6 /bin/bash

root@388225c84dc6:/# apt-get update

root@388225c84dc6:/# apt-get install -y iproute2

root@388225c84dc6:/# apt-get install -y iputils-ping

建立容器之间的连接

[root@localhost ~]# docker network connect xixi vm3

[root@localhost ~]# docker attach vm3

root@388225c84dc6:/# ping vm1

PING vm1 (172.18.0.2) 56(84) bytes of data.

64 bytes from vm1.xixi (172.18.0.2): icmp_seq=1 ttl=64 time=0.163 ms

64 bytes from vm1.xixi (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms

64 bytes from vm1.xixi (172.18.0.2): icmp_seq=3 ttl=64 time=0.077 ms

^C

--- vm1 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2001ms

rtt min/avg/max/mdev = 0.054/0.098/0.163/0.046 ms

配置 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

手动指定容器的配置

如果只想在指定的容器设置 DNS,则可以使用以下命令:

$ docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

参数说明:

--rm:容器退出时自动清理容器内部的文件系统。

-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。

--dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。

--dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。

如果在容器启动时没有指定 --dns 和 --dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS。

Docker Hub

登录和退出

登录需要输入用户名和密码,登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像。

$ docker login

退出

退出 docker hub 可以使用以下命令:

$ docker logout

拉取镜像

你可以通过 docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地。

推送镜像

用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub。

$ docker push username/ubuntu:18.04

Docker Dockerfile

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。

Linux 安装命令

base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
  chmod +x /usr/local/bin/docker-machine

查看是否安装成功:

$ docker-machine version
docker
-machine version 0.16.0, build 9371605

1、列出可用的机器

 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

    NAME      ACTIVE   DRIVER         STATE     URL
    dev      
    -        virtualbox     Running   tcp://192.168.99.103:2376
    staging   *        digitalocean   Running   tcp://203.0.113.81:2376

    $ echo $DOCKER_HOST
    tcp
    ://203.0.113.81:2376

    $ docker-machine active
    staging
  • 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: 显示帮助信息

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值