Docker基础教程(4)进阶命令-1-网络,数据卷等内容

来源:互联网 发布:javascript new关键字 编辑:程序博客网 时间:2024/06/16 21:13

  • 准备工作
  • 进入容器
    • 1 ssh登录
    • 2 第三方工具nsenter
    • 3 Docker工具
  • 关闭和启动docker服务
  • 管理容器端口
  • link
  • Docker网络管理
  • 数据卷
  • 小结

0. 准备工作

为了跟随本教程的内容,需要创建一个具备一定网络功能的镜像。
首先从之前的ubuntu:16.04创建一个容器:

sudo docker run -ti --name Exercise ubuntu:16.04 bash

进入之后依次执行下述命令:

apt-get updateapt-get install vimapt-get install net-toolsapt install iputils-ping apt install apache2apt install apache2-utilsapt install openssh-serverapt install openssh-client

之后使用vim修改:

vim /etc/ssh/sshd_config

把“PermitRootLogin”的内容改为yes,保存。
输入:

passwd

修改root密码。
完成之后退出容器。使用docker ps -a找到你刚才运行的容器,找到之后从这个容器创建新镜像:

zsc@Berry:~$ sudo docker commit -m "My network exercise" Exercise net:v0.1

说明:-m是添加一个对镜像的简短说明;
其后一个参数是刚刚容器的名字或者ID;
最后是新镜像的名字:标签对。
完成后使用sudo docker images查看可以找到新的镜像:
这里写图片描述

1. 进入容器

在前面的教程里面,我们都是运行容器之后就只有一个终端,很多情况下我们都有进入容器的需求。进入容器有很多种方法:

  • ssh登录
  • 第三方工具
  • docker提供的工具
    首先运行一个容器:
sudo docker run -ti --name second -p 22:22 net:v0.1 bash

1.1 ssh登录

首先在容器内运行下面的命令启动ssh服务:

service ssh start

在容器里使用“ifconfig”命令查看容器的私有IP地址,我的IP是172.17.0.2,所以我在一个新的终端里运行:

ssh root@172.17.0.2

按照要求输入密码就可以进入到容器里面操作了。

1.2 第三方工具——nsenter

Docker1.3之后添加了exec工具,因此nsenter工具用的不是很多了。建议使用本文1.3小节介绍的exec命令。如果你就是想用nsenter,请自行搜索。

1.3 Docker工具

  • attach(不推荐)
    attach使用起来并不是很方便,比方说我们现在运行着一个容器second,执行以下指令可以进入这个容器:
sudo docker attach second

需要注意的是,在attach进入的控制台执行exit也会导致容器的终止。

  • exec(推荐)
sudo docker exec -ti second bash

这里执行exit并不会导致容器的终止。

2. 关闭和启动docker服务

sudo service docker stopsudo service docker start

3. 管理容器端口

在本文第1节,我们执行了这样一条命令:

sudo docker run -ti --name second -p 22:22 net:v0.1 bash

这条指令里面,-p指定了端口映射,格式是:

-p hostPort:containerPort

hostPort指的是宿主主机的端口,containerPort是容器内部的端口。
我们可以通过暴露容器的端口来进行容器之间的网络通信。

4. link

现在我们使用link参数进行container之间的通信。首先从之前创建的net:v0.1镜像运行2个容器,一个作为server,一个作为client。

sudo docker run -ti --name server net:v0.1 bashsudo docker run -ti --name client --link server:ss net:v0.1 bash

注意:第二条指令里的–link server:ss 就是将这个容器和名字叫做server的容器连接起来,并且在client容器里server的名字映射为ss。此时我们在client容器里输入env指令可以看到如下结果,说明我们的client可以根据ss这个别名找到server并与之通信。
这里写图片描述

5. Docker网络管理

你在本机终端运行ifconfig指令可以看到有一个名字为“docker0”的Docker网络适配器:
这里写图片描述
这是一个docker host和linux host之间的桥梁,在你安装Docker的时候就安装好了。
运行如下指令可以看到你当前的Docker网络:

sudo docker network ls

这里写图片描述
使用如下命令查看网络的具体信息:

sudo docker network inspect name_of_network

创建新的网络:

sudo docker network create --drive drivename name_of_network

比如创建一个名字为myNet的网络:

sudo docker network create --driver bridge myNet

你可以在运行容器的时候指定网络:

sudo docker run -ti --name testNet --net myNet -p 22:22 net:v1.0 bash

使用网络的好处是无需指定link就可以根据容器名字找到对应的容器,比如我们运行2个容器,一个叫做ss,一个叫做cc,它们都在网络myNet里面:

sudo docker run -ti --name ss --net myNet net:v0.1 bashsudo docker run -ti --name cc --net myNet net:v0.1 bash

然后在ss里用ping cc是可以直接找到cc的,同理在cc里ping ss也是可以的。
并且使用指定网络的方式,在任意时间新添加进来的容器都可以用容器的名字相互通信。

  • 其他网络命令
    • 删除网络

      sudo docker network rm name_of_net
    • 连接和断开连接

      sudo docker network connect name_of_container
      sudo docker network disconnect name_of_container

6. 数据卷

在Docker里你可以使用一个单独的数据卷,数据卷可以是主机上的一个文件夹,数据卷有如下特点:

  • 容器启动时被初始化;
  • 数据卷可以在多个容器间共享;
  • 可以直接操作数据卷的内容;
  • 容器终止后数据卷依然存在。

你可以使用-v参数指定一个数据卷:

sudo docker run -ti -v /home/zsc/workspace:/workDir --name data_volume net:v0.1 bash

-v /home/zsc/workspace:/workDir 是指把宿主主机的/home/zsc/workspace目录映射到容器内的/workDir目录,这样就可以在容器里对文件进行操作,并且所作的改变在容器终止后也不会消失。你直接在宿主主机做的修改也会影响容器内对应目录下的内容。数据卷是Docker的一种数据持久化方法,很多情况下都很有用。

7. 小结

本文主要介绍了一些进阶用法。后续的教程会继续讲解Docker file, security等内容,最后会有一个Docker结合Apache部署网站的实例。

原创粉丝点击