Docker(一)

 

部署环境

NameVersioncapacity
CentOS 73.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux 
Dockerdocker-ce-17.09.0.ce-1.el7.centos.x86_64 

PS:以#开头的命令是宿主机的命令。

 

docker介绍

  • 官网 www.docker.com

  • github https://github.com/docker/docker.github.io

  • 开源的容器引擎,可以让开发者打包应用以及依赖的库,然后发布到任何流行的linux发行版上,移植很方便

  • 由go语言编写,基于apache2.0协议发布

  • 基于linux kernel,要想在win下运行需要借助一个vm(虚拟机)来实现

  • 自2013年开始,近些年发展迅猛

  • docker从1.13x开始,版本分为社区版ce和企业版ee,并且基于年月的时间线形式,当前最新稳定版为17.09 参考http://blog.csdn.net/chenhaifeng2016/article/details/68062414

Docker的优势

  • 启动非常快,秒级实现

  • 资源利用率高,一台高配置服务器可以跑上千个docker容器

  • 更快的交付和部署,一次创建和配置后,可以在任意地方运行

  • 内核级别的虚拟化,不需要额外的hypevisor支持,会有更高的性能和效率

  • 易迁移,平台依赖性不强

Docker核心概念

  • 镜像,是一个只读的模板,类似于安装系统用到的那个iso文件,我们通过镜像来完成各种应用的部署。

  • 容器,镜像类似于操作系统,而容器类似于虚拟机本身。它可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。

  • 仓库,存放镜像的一个场所,仓库分为公开仓库和私有仓库。 最大的公开仓库是Docker hub(hub.docker.com),国内公开仓库(dockerpool.com)

 

 

Docker安装

两种安装方式;

第一种:下载Docker官方最新yum源,再yum安装;速度比较慢,因为用的是国外的源

# curl https://download.docker.com/linux/centos/docker-ce.repo -o  /etc/yum.repos.d/docker.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2424  100  2424    0     0    288      0  0:00:08  0:00:08 --:--:--   569
# yum install -y docker-ce

第二种:直接下载Docker的rpm安装包,直接yum安装这个rpm包,可以自动解决依赖关系,速度快

# yum install -y docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm

启动Docker方式;

# systemctl start docker
# ps aux |grep docker
root      1890  2.5  1.4 434836 26892 ?        Ssl  19:57   0:00 /usr/bin/dockerd
root      1893  0.0  0.4 264084  7552 ?        Ssl  19:57   0:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc
root      2015  0.0  0.0 112720   972 pts/0    S+   19:57   0:00 grep --color=auto docker

启动Docker的进程,会自动生成iptables规则

# iptables -nvL
Chain INPUT (policy ACCEPT 519 packets, 155K bytes)
 pkts bytes target     prot opt in     out     source               destination         
​
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER-USER  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 DOCKER-ISOLATION  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           
​
Chain OUTPUT (policy ACCEPT 470 packets, 154K bytes)
 pkts bytes target     prot opt in     out     source               destination         
​
Chain DOCKER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
​
Chain DOCKER-ISOLATION (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           
​
Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0

 

 

Docker镜像管理

下载(拉取)镜像centos,一些特殊的资源速度很慢

# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
256b176beaff: Pull complete 
Digest: sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf
Status: Downloaded newer image for centos:latest

觉得慢,可以配置docker加速器(参考 http://blog.csdn.net/xlemonok/article/details/71403534

配置如下内容,该文件不存在(即空文件)

vi /etc/docker/daemon.json
{
  "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}

说明:这个url为加速器地址,需要自行到阿里云申请。配置完加速器,重启docker服务,再次docker pull centos会快很多

查看本地镜像

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              5182e96772bf        4 weeks ago         200MB

搜索镜像,最后的xxx参数为关键词

# docker search xxx

给镜像打标签,还是同一个镜像,但打上标签后就会显示一个新的名称的镜像(因为ID是一样的)

# docker tag centos zyshan_centos
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              5182e96772bf        4 weeks ago         200MB
zyshan_centos       latest              5182e96772bf        4 weeks ago         200MB

不单可以给REPOSITORY指定标签名,还可以给TAG指定名字;只要在它们之间加上个冒号

# docker tag centos zyshan_centos:180906
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              5182e96772bf        4 weeks ago         200MB
zyshan_centos       180906              5182e96772bf        4 weeks ago         200MB
zyshan_centos       latest              5182e96772bf        4 weeks ago         200MB

注意:命令的tag和输出结果的TAG不是一个意思。

把镜像启动为容器,-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名字前面

# docker run -itd centos
0933bbca8e9d17b1a92cbae8c128edfe4a96d873ab4a65baf8737c005d34a8ff

查看运行的容器,加上-a选项后可以查看所有容器,包括未运行的

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0933bbca8e9d        centos              "/bin/bash"         47 seconds ago      Up 46 seconds                           youthful_cori
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
0933bbca8e9d        centos              "/bin/bash"         About a minute ago   Up About a minute                       youthful_cori

删除指定镜像, 其中后面的参数可以是tag,如果是tag时,实际上是删除该tag。当后面的参数为镜像ID时,则会彻底删除整个镜像,所有标签也会一同删除

# docker rmi zyshan_centos
Untagged: zyshan_centos:latest
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zyshan_centos       180906              5182e96772bf        4 weeks ago         200MB
centos              latest              5182e96772bf        4 weeks ago         200MB
# docker tag centos zyshan_centos:180
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              5182e96772bf        4 weeks ago         200MB
zyshan_centos       180                 5182e96772bf        4 weeks ago         200MB
zyshan_centos       180906              5182e96772bf        4 weeks ago         200MB
# docker rmi zyshan_centos:180
Untagged: zyshan_centos:180
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              5182e96772bf        4 weeks ago         200MB
zyshan_centos       180906              5182e96772bf        4 weeks ago         200MB
# docker rmi zyshan_centos
Error: No such image: zyshan_centos
# docker rmi zyshan_centos:180906
Untagged: zyshan_centos:180906
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              5182e96772bf        4 weeks ago         200MB

 

 

通过容器创建镜像

docker run启动容器后,可以通过下面命令进入容器

# docker exec -it 0933bbca8e9d bash

其中0933bbca8e9d为容器id,这个id可以用docker ps查看,最后面的bash为进入容器后我们要执行的命令,这样就可以打开一个终端。这是一个阉割版的系统,很多软件命令都没有,因为大小只有200M

进入到该容器中,我们做一些变更,比如安装一些东西,然后针对这个容器进行创建新的镜像

[root@0933bbca8e9d /]# ifconfig
bash: ifconfig: command not found
[root@0933bbca8e9d /]# yum install -y net-tools
[root@0933bbca8e9d /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 5597  bytes 12617482 (12.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3460  bytes 190294 (185.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
​
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

安装完net-tools后,退出容器Ctrl+d

[root@0933bbca8e9d /]# exit
# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:70ff:fef2:436f  prefixlen 64  scopeid 0x20<link>
        ether 02:42:70:f2:43:6f  txqueuelen 0  (Ethernet)
        RX packets 3460  bytes 141854 (138.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5589  bytes 12616834 (12.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
...
veth541bc07: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::bc58:65ff:fe6c:37ea  prefixlen 64  scopeid 0x20<link>
        ether be:58:65:6c:37:ea  txqueuelen 0  (Ethernet)
        RX packets 3460  bytes 190294 (185.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5597  bytes 12617482 (12.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

退出容器后,再次执行命令ifconfig,可以看到前面多了一个docker的虚拟网卡(还是一个很陌生的网段,这个是docker的自带网段),后面多出了一个veth541bc07虚拟网卡,就是我们启动过的容器联网的虚拟网卡是NAT连接,只要宿主机可以联网容器也可以联网的

创建新镜像,-m选项后是镜像更改的描述说明,-a指定作者相关信息,后面跟CONTAINER ID,最后跟新镜像的名字

# docker commit -m "install net-tools" -a "zyshan" 0933bbca8e9d centos_with_net-tools
sha256:6fa479bb73fd1ad153471fa6c8d46486f5dee9ad698394ef02e9cd08f2e60d48
# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
centos_with_net-tools   latest              6fa479bb73fd        9 seconds ago       293MB
centos                  latest              5182e96772bf        4 weeks ago         200MB

运行新的镜像并进入

# docker run -itd centos_with_net-tools
9be386701c69850807765b987889d440ad1ecacddea6f92e1d073454a06c22f9
# docker exec -it 9be386701c69 bash
[root@9be386701c69 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 648 (648.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
​
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
​
[root@9be386701c69 /]# exit
# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:70ff:fef2:436f  prefixlen 64  scopeid 0x20<link>
        ether 02:42:70:f2:43:6f  txqueuelen 0  (Ethernet)
        RX packets 3460  bytes 141854 (138.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5589  bytes 12616834 (12.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
...
veth541bc07: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::bc58:65ff:fe6c:37ea  prefixlen 64  scopeid 0x20<link>
        ether be:58:65:6c:37:ea  txqueuelen 0  (Ethernet)
        RX packets 3460  bytes 190294 (185.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5597  bytes 12617482 (12.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
​
vetha01af34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::78a1:bdff:fef6:8d7c  prefixlen 64  scopeid 0x20<link>
        ether 7a:a1:bd:f6:8d:7c  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 648 (648.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

可以看到进入后该镜像系统是自带net-tools包的,可以直接运行Ifconfig命令;得到一个新的网段,退出后执行ifconfig命令在最后又多出一个虚拟网卡,这就是第二个自己制作容器的虚拟网卡

 

 

Docker使用模板创建镜像

下载一个centos6的模板

# wget http://openvz.org/Download/templates/precreated/centos-6-x86-minimal.tar.gz

导入该镜像的命令为:

#  cat centos-6-x86-minimal.tar.gz|docker import - centos6

docker images查看导入的镜像 把现有镜像,导出为一个文件:选项-o后跟镜像名+文件名

# docker save -o zyshan-centos.tar zyshan

我们还可以用该文件恢复本地镜像: docker load --input zyshan-centos.tar 或者 docker load < zyshan-centos.tar docker push image_name //可以把自己的镜像传到dockerhub官方网站上去,但前提是需要先注册一个用户

关闭容器的两种方法

第一种:停止

# docker ps
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS               NAMES
9be386701c69        centos_with_net-tools   "/bin/bash"         28 minutes ago      Up 28 minutes                           modest_babbage
0933bbca8e9d        centos                  "/bin/bash"         About an hour ago   Up About an hour                        youthful_cori
# docker stop 9be386701c69
9be386701c69
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0933bbca8e9d        centos              "/bin/bash"         About an hour ago   Up About an hour                        youthful_cori

第二种:强制删除

# docker rm -f 0933bbca8e9d
0933bbca8e9d
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

 

 

容器管理

这样可以创建一个容器,但该容器并没有启动,没有选项d即没有后台启动

# docker create -it centos6 bash

docker start  container_id   //启动容器后,可以使用 docker ps  查看到,有start 就有stop,和restart

之前我们使用的docker run 相当于先create再start

# docker run -it centos bash

这样进入了一个虚拟终端里面,我们可以运行一些命令,使用命令exit或者ctrl d 退出该bash,当退出后这个容器也会跟着停止。

让容器在后台运行

# docker run -d 
比如:docker run -d centos bash -c "echo 123"
docker run --name web -itd centos bash //选项 --name 给容器自定义名字(NAMES)web
docker run --rm -it centos bash -c "sleep 30" //--rm 可以让容器退出后直接删除,在这里命令执行完容器就会退出

获取到容器的运行历史信息docker logs  container_id

# # docker logs 9be386701c69
[root@9be386701c69 /]# 
#

注意容器ID(CONTAINER ID)和镜像ID(IMAGE ID)的区别

docker attach 可以进入一个后台运行的容器,比如

docker attach  container_id    //但是attach命令不算好用,比如我们想要退出终端,就得exit了,这样容器也就退出了,还有一种方法

docker exec -it container_id  bash  //可以临时打开一个虚拟终端,并且exit后,容器依然运行着

  • docker rm  container_id  //container_id是ps的时候查看到的,这样就可以把container删除,如果是运行的容器,可以加-f

  • docker  export  container_id  > file.tar  // 导出容器,可以迁移到其他机器上,需要导入

  • cat file.tar |docker import - aming_test   //这样会生成aming_test的镜像

 

 

Docker仓库管理

创建本地docker私有仓库,需要下载registry镜像,registy为docker官方提供的一个镜像。

# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
4064ffdc82fe: Pull complete 
c12c92d1c5a2: Pull complete 
4fbc9b6835cc: Pull complete 
765973b0f65f: Pull complete 
3968771a7c3a: Pull complete 
Digest: sha256:51bb55f23ef7e25ac9b8313b139a8dd45baa832943c8ad8f7da2ddad6355b3c8
Status: Downloaded newer image for registry:latest
# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
centos                    latest              5182e96772bf        4 weeks ago         200MB
registry                  latest              b2b03e9146e1        2 months ago        33.3MB
dongweiming/web_develop   latest              5c99b9e833b7        2 years ago         6.18GB
dongweiming/web_develop   dev                 43fb02d9c1a3        2 years ago         293MB

以registry镜像启动容器,-p会把容器的端口映射到宿主机上,:左边为宿主机监听端口,:右边为容器监听端口

# docker run -d -p 5000:5000 registry
8fb18c624b2fe78b81dc130cf9870ddc9c3b3dbc81d09adb6456143c50d38c3d
# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
8fb18c624b2f        registry            "/entrypoint.sh /e..."   6 seconds ago       Up 5 seconds        0.0.0.0:5000->5000/tcp   modest_wescoff

可以在宿主机中进行访问,[]里面是空的,因为还没有镜像在里面

# curl 127.0.0.1:5000/v2/_catalog
{"repositories":[]}

上传镜像到创建的私有仓库:

第一步先打标记,必须要带有私有仓库的ip:port【docker tag+上传的镜像名(不是latest可以加上“:TAG”)+宿主机IP/新的镜像名字】

# docker tag dongweiming/web_develop:dev 192.168.106.128:5000/ubu_web_dev
# docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
centos                             latest              5182e96772bf        4 weeks ago         200MB
registry                           latest              b2b03e9146e1        2 months ago        33.3MB
dongweiming/web_develop            latest              5c99b9e833b7        2 years ago         6.18GB
dongweiming/web_develop            dev                 43fb02d9c1a3        2 years ago         293MB
192.168.106.128:5000/ubu_web_dev   latest              43fb02d9c1a3        2 years ago         293MB

第二步把标记的镜像给推送到私有仓库

# docker push 192.168.106.128:5000/ubu_web_dev
The push refers to a repository [192.168.106.128:5000/ubu_web_dev]
Get https://192.168.106.128:5000/v2/: http: server gave HTTP response to HTTPS client

报错:仓库不支持HTTP响应,需要在配置文件/etc/docker/daemon.json里增加这段"insecure-registries":["192.168.106.128:5000"]指定私有仓库的地址

# vi /etc/docker/daemon.json
{
  "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"],
  "insecure-registries":["192.168.106.128:5000"]
}

重启docker服务加载配置,启动registry私有仓库容器,再推送镜像

# systemctl restart docker
# docker start 8fb18c624b2f
# docker push 192.168.106.128:5000/ubu_web_dev
The push refers to a repository [192.168.106.128:5000/ubu_web_dev]
97b6a1055160: Pushed 
cef0e7caeb2c: Pushed 
9f8cc633c7b5: Pushed 
13b8aa272499: Pushed 
8767356cb2d8: Pushed 
1123dbc51d59: Pushed 
34b439cefd94: Pushed 
5f70bf18a086: Pushed 
737f40e80b7f: Pushed 
82b57dbc5385: Pushed 
19429b698a22: Pushed 
9436069b92a3: Pushed 
latest: digest: sha256:0321ce066576fa1031b3d8984d9194cc96265204e114383eadfe4d5731782c62 size: 2818

查看推送到私有仓库的镜像,["ubu_web_dev"]显示上传镜像的名称,即上传成功。

# curl 127.0.0.1:5000/v2/_catalog
{"repositories":["ubu_web_dev"]}

从本地仓库拉取镜像去要加上IP,不加IP即从共有仓库中拉取。

 

 

Docker数据管理

1、挂载本地目录到容器,防止容器意外关闭停止删除等;-v 用来指定挂载目录,:前面的/data/为宿主机本地目录,:后面的/data/为容器里的目录,会在容器中自动创建;

挂载目录的时候,可以指定容器name,如果不指定就随机定义了。比如下面就没有指定,它就生成了一个名字为lucid_lichterman,这个名字可以使用命令 docker ps -a 看最右侧一列;

# docker run -tid -v /data/:/data ubuntu bash
ff86647987b1dd1ad120273ef0936788ca2ad101a7ec40a01da16d19c898d11a
# docker ps -a
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                         PORTS                                  NAMES
ff86647987b1        ubuntu                        "bash"                   28 seconds ago      Up 27 seconds                  22/tcp, 3141/tcp, 5000/tcp, 9000/tcp   lucid_lichterman
cac771143684        dongweiming/web_develop:dev   "/bin/zsh"               About an hour ago   Exited (0) About an hour ago                                          upbeat_raman
8fb18c624b2f        registry                      "/entrypoint.sh /e..."   4 hours ago         Up 43 minutes                  0.0.0.0:5000->5000/tcp                 modest_wescoff
86480e145d20        dongweiming/web_develop:dev   "/bin/zsh"               17 hours ago        Exited (0) 17 hours ago                                               web_dev
3ccba1144621        centos                        "bash -c 'echo 123'"     41 hours ago        Exited (0) 41 hours ago                                               determined_hamilton

演示:在ubuntu容器/data/创建文件123.txt,在宿主机的/data/也会有123.txt

ubuntu@ff86647987b1:/data$ # touch 123.txt
ubuntu@ff86647987b1:/data$ # ls
123.txt  ftp  gitroot  mariadb  mysql  svnroot  wwwroot
​
# ls /data/
123.txt  ftp  gitroot  mariadb  mysql  svnroot  wwwroot

2、挂载不定义的数据卷;使用centos镜像创建了新的容器,并且使用了 lucid_lichterman容器的数据卷。

# docker run -tid --volumes-from lucid_lichterman centos bash
51b52839edfef8be2b010e98171ddf40f837c34ebff769e2f7158be82213e8f1
# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                  NAMES
51b52839edfe        centos              "bash"                   14 seconds ago      Up 12 seconds                                              hardcore_bose
ff86647987b1        ubuntu              "bash"                   5 minutes ago       Up 5 minutes        22/tcp, 3141/tcp, 5000/tcp, 9000/tcp   lucid_lichterman
8fb18c624b2f        registry            "/entrypoint.sh /e..."   4 hours ago         Up About an hour    0.0.0.0:5000->5000/tcp                 modest_wescoff

演示:在centos容器/data/创建文件456.txt,在 lucid_lichterman容器(即ubuntu容器)的/data/也会有456.txt

[root@51b52839edfe data]# touch 456.txt
[root@51b52839edfe data]# ls
123.txt 456.txt  ftp  gitroot  mariadb  mysql  svnroot  wwwroot
​
ubuntu@ff86647987b1:/data$ # ls
123.txt 456.txt  ftp  gitroot  mariadb  mysql  svnroot  wwwroot

3、定义数据卷容器;有时候,我们需要多个容器之间相互共享数据,类似于linux里面的NFS,所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。

首先建立数据卷容器(类似共享);注意这里的/data/是容器的/data目录,并非本地的/data/目录。 选项--name后面跟自定义的名字,后面是镜像,再后面是终端bash

# docker run -itd -v /data/ --name testvol centos  bash

然后让其他容器挂载该数据卷

# docker run -tid --volumes-from testvol centos bash

演示:指定了名字testvol

CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                    PORTS                                  NAMES
bb9091086f90        centos                        "\u00a0bash"             2 minutes ago       Created                                                          testvol

 

 

Docker数据卷的备份与恢复

备份:首先使用lucid_lichterman数据卷新开一个容器,同时还需要把宿主机的/data/backup/目录挂载到该容器的/backup下,这样在容器中/backup目录里面新建的文件,就可以直接在宿主机/data/backup/目录中看到了。 然后再把容器/data/目录(因为上面都是把容器的数据放到容器/data/下,备份也就是备份该目录了)下面的文件打包成data.tar文件放到容器/backup目录下面(也就相当于放到宿主机/data/backup/目录)。

# mkdir /data/backup
# docker run --volumes-from lucid_lichterman -v /data/backup/:/backup centos tar cvf /backup/data.tar /data/

演示:

# ls -lh /data/backup
总用量 357M
-rw-r--r-- 1 root root 357M 9月   8 16:47 data.tar

恢复:先新建一个数据卷容器,再建一个新的容器并挂载该数据卷容器,然后再把挂载了宿主机目录的/data/backup/data.tar包解包,恢复到最先新建的数据卷容器中;下面第一条命令是后台运行的容器,第二条命令只是执行了恢复数据命令就退出容器的操作,所以第二个容器并没有再运行。

# docker run -itd -v /data/ --name testvol2 centos bash
# docker run --volumes-from testvol2  -v /data/backup/:/backup centos tar xf /backup/data.tar

PS:不带选项-d的容器是退出该条命令即停止运行的,多数用来执行相应的操作并不持续运行。

 

 

 

Docker网络模式

  • host模式,使用docker run时使用--net=host指定

  • docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机ip

  • container模式,使用--net=container:container_id/container_name ,多个容器使用共同的网络,看到的ip是一样的

  • none模式,使用--net=none指定,这种模式下,不会配置任何网络

  • bridge模式,使用--net=bridge指定默认模式,不用指定默认就是这种网络模式。这种模式会为每个容器分配一个独立的Network Namespace。类似于vmware的nat网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。

 

 

Docker网络管理-外部访问容器

  • 首先使用centos镜像新建一个容器,然后在该容器中安装httpd服务,并启动再把该容器导成一个新的镜像(centos-httpd),然后再使用新镜像创建容器,并指定端口映射docker run -itd -p 5123:80 centos-httpd bash  //-p 可以指定端口映射,本例中将容器的80端口映射为本地的5123端口docker exec -it container_id  bash 启动httpd: httpd -k start 编辑1.html: vi /var/www/html/1.html 随便写点东西退出该容器:exit测试: curl 127.0.0.1:5123/1.html -p后面也支持IP:port:ip:port 的格式,比如-p 127.0.0.1:8080:80 也可以不写本地的端口,只写ip,这样会随意分配一个端口-p 127.0.0.1::80 //注意这里是两个冒号

 

  • 新建的容器,启动nginx或者httpd服务的时候会报错:Failed to get D-Bus connection: Operation not permitted这是因为dbus-daemon没有启动,解决该问题可以这样做启动容器时,要加上--privileged -e "container=docker" ,并且最后面的命令改为/usr/sbin/initdocker run -itd --privileged -e "container=docker" centos_with_nginx /usr/sbin/init

 

 

Docker网络管理-配置桥接网络

  • 为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求。这个需求其实很容易实现,我们只要将Docker容器和宿主机的网卡桥接起来,再给Docker容器配上IP就可以了。

  • cd /etc/sysconfig/network-scripts/; cp ifcfg-eth0 ifcfg-br0

  • vi ifcfg-eth0 //增加BRIDGE=br0,删除IPADDR,NETMASK,GATEWAY,DNS1

  • vi ifcfg-br0//修改DEVICE为br0,Type为Bridge,把eth0的网络设置设置到这里来

  • systemctl restart network

  • 安装pipwork

  • git clone https://github.com/jpetazzo/pipework

  • cp pipework/pipework /usr/local/bin/

  • 开启一个容器

  • docker run -itd --net=none --name aming123 centos_with_nettool bash

  • pipework br0 aming123 172.7.15.201/24@172.7.15.3 #201为容器的ip,@后面的ip为网关ip

  • docker exec -it aming123 bash #进去后ifconfig查看就可以看到新添加的ip

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值