部署环境
Name | Version | capacity |
---|---|---|
CentOS 7 | 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux | |
Docker | docker-ce-17.09.0.ce-1.el7.centos.x86_64 |
PS:以#开头的命令是宿主机的命令。
docker介绍
开源的容器引擎,可以让开发者打包应用以及依赖的库,然后发布到任何流行的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