[root@localhost ~]# docker ps -a #查看容器的ID
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06bbfa9e79b8 11426a19f1a2 "/bin/bash" 7 seconds ago Created nostalgic_boyd
[root@localhost ~]# docker commit -m "new" -a "daoke" 06bbfa9e79b8 daoke:test #创建新的镜像
sha256:eb0c9295c27a4efc020bc7985476b45a9d2e2cb6d80f4f9d8cdd4d9bcc87b4e1
[root@localhost ~]# docker images #查看镜像的信息
REPOSITORY TAG IMAGE ID CREATED SIZE
daoke test eb0c9295c27a 15 seconds ago 178 MB
docker.io/httpd latest 11426a19f1a2 12 days ago 178 MB 基于本地模板创建
通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载,下载地址为http://openvz.org/Download/template/precreated
使用docker导入命令将下载的debian模板压缩包导入为本地镜像
数据卷
数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。
1.创建数据卷
在docker run 命令中使用-v 选项可以在容器内创建数据卷。多次使用-v可以创建多个数据卷。使用--name选项可以给容器创建一个友好的自定义名称。
1)使用httpd:centos镜像创建一个名为web1的容器,并将宿主机的/var/www目录挂载到容器的/data1目录上,如:
[root@localhost ~]# docker run -v /var/www:/data1 --name web1 -it centos /bin/bash
[root@7b584c5f1d20 /]# ls
anaconda-post.log bin data1 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
2)在宿主机本地/var/www目录中创建一个文件,进入运行的容器中。在相应的挂载目录下可以看到刚才在宿主机上创建的文件,实现了从宿主机到容器的数据迁移。
[root@localhost ~]# cd /var/www/
[root@localhost www]# ls
[root@localhost www]# touch test123
[root@localhost www]# ls
test123
[root@localhost www]# docker start 7b584c5f1d20 #启动容器
[root@localhost www]# docker exec -it web1 /bin/bash
[root@7b584c5f1d20 /]# cd data1/
[root@7b584c5f1d20 data1]# ls
test123
同理在容器数据卷中创建的数据在宿主机相应的挂载目录中也可以访问。
[root@localhost www]# docker run --name web100 -v /data1 -v /data2 -it centos /bin/bash
[root@ab7632329eee /]# ls
anaconda-post.log bin data1 data2 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
2.使用--volumes-from 来挂载web100容器中的数据卷到新的容器,新的容器名为db1。
[root@localhost www]# docker run --name db1 --volumes-from web100 -it centos /bin/bash
[root@eb56026f763c /]# ls
anaconda-post.log bin data1 data2 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
3.在db1容器数据卷/data2目录中创建一个文件file。在web100容器中的/data2目录中可以查看到文件file。
[root@localhost ~]# docker run -d -P httpd:centos
4749e5d0ac4b7b42f74e27e0aebf611ce11fb1f92248751c8e66349f7ada4019
2.查看本机的32768端口是否被映射到了容器中的80端口。
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4749e5d0ac4b httpd:centos "/run.sh" 16 seconds ago Up 14 seconds 0.0.0.0:32768->80/tcp romantic_mcclintock
3.还可以在运行docker run命令时使用-p(小写)选项指定要映射的端口,例如:
[root@localhost ~]# docker run -d -p 49280:80 httpd:centos
[root@localhost ~]# docker ps -a #端口映射成功
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17251b86a2b0 httpd:centos "/run.sh" 3 seconds ago Up 1 second 0.0.0.0:49280->80/tcp keen_rosalind 容器互联
容器互联就是通过容器的名称在容器间建立一条专门的网络通信隧道从而实现容器的互联。
注意:如果已经命名了一个相同的容器,当要再次使用这个名称时,需要使用docker rm命令删除之前创建的同名容器。
1.创建源容器
使用docker run命令建立容器,使用--name指定容器的名称为web1。
[root@localhost ~]# docker run -P --name web1 -it httpd:centos /bin/bash
[root@localhost ~]# docker start ec056f796f5c #开启容器web1
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec056f796f5c httpd:centos "/bin/bash" 8 minutes ago Up 5 minutes 0.0.0.0:32771->80/tcp web1
.....//省略
2.创建接收容器
使用docker run命令建立容器,使用--name指定容器的名称为web2,使用--link指定连接容器以实现容器互联。
[root@localhost ~]# docker run -P --name web2 --link web1:web1 -it httpd:centos /bin/bash
[root@localhost ~]# docker start 853da4a8f368 #开启容器web2
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
853da4a8f368 httpd:centos "/bin/bash" 6 minutes ago Up 3 minutes 0.0.0.0:32774->80/tcp web2
.....//省略
3.测试容器互联
进入容器web2中,使用ping命令查看容器web2是否能互相连通。
[root@localhost ~]# docker exec -it 853da4a8f368 /bin/bash
[root@853da4a8f368 /]# ping web1
PING web1 (172.17.0.3) 56(84) bytes of data.
64 bytes from web1 (172.17.0.3): icmp_seq=1 ttl=64 time=0.282 ms
64 bytes from web1 (172.17.0.3): icmp_seq=2 ttl=64 time=0.118 ms
64 bytes from web1 (172.17.0.3): icmp_seq=3 ttl=64 time=0.121 ms
64 bytes from web1 (172.17.0.3): icmp_seq=4 ttl=64 time=0.118 ms
^C
--- web1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 0.118/0.159/0.282/0.072 ms
此时/可以看到容器web2与容器web1已经建立互联关系。Docker在两个互联的容器之间创建了一条安全隧道,而且不用映射它们的端口到宿主机上,从而避免暴露端口给外部网络。