创建镜像
docker run -tid --name 容器名 -p 宿主机端口:容器端口 镜像 命令 (和-v一致,也可多个-p)
(宿主机端口在前,访问宿主机的某个端口【服务】,通过iptables规则,映射到容器内的端口)
-p:是映射端口的(将容器内的服务端口映射到宿主机上,因为外部访问的时候是访问的宿主机的ip地址;容器是基于宿主机内核创建的一个进程)
容器内服务之间的一个相互通信协作是通过docker0这个虚拟网桥(类交换机)进行实现的
参数分析
-t 创建容器的时候,-t是创建了一伪终端~ (非常重要)
-i是标准输入(非常重要)
-v是容器内/var/lib/registry和宿主机的myregistry进行映射的
(映射可以映射多个;多个-v,同时从宿主机映射的文件在容器内也可也看到)
-d:后台运行
在run运行容器的时候,后面的/bin/bash命令解释器需要作为容器标准输入解释命令,进而执行的!
删除容器的时候docker rm 短id/容器名称(可同时删除多个;空格隔开)
进入容器是attach;exit退出时候,容器也相对应的结束(要进入容器前需要启动容器)
Docker start 短ID/名字(查看短id可以通过docker ps -a)进行查看
不进入容器只是执行命令的:exec(联想find 的执行命令-exec)
容器数据管理(实验)
将docker宿主机上的目录或者文件映射给容器,相当于linux系统中的挂载操作
1) 创建容器时,指定容器使用目录作为数据卷
docker run -tid --name c1 -v /root/CS:/root/test centos /bin/bash
查看 c1容器/root下test文件存在
docker exec c1 ls /root
宿主机touch一个f1文件(touch CS/f1)
查看 f1 文件存在
docker exec c1 ls /root/test
也就相当于在容器内挂载了一个宿主机的目录,在宿主机对应下目录的操作(可以放入程序或者文件,容器内也可以使用)
2) 创建容器时,指定容器使用文件作为数据卷
docker run -tid --name 容器名 -v 宿主机文件:容器内部文件 镜像名 命令
首先 宿主机创建一个文件
echo aaaaaaaaa > /root/file1
然后创建容器,并挂载文件
docker run -tid --name c2 -v /root/file1:/root/file2 centos /bin/bash
备注:宿主机上的文件需要事先存在
查看容器里面file2文件存在
docker exec c2 ls /root
查看容器c2 文件追加的内容
docker exec c2 cat /root/file2
宿主机再追加bbbbbbbbbbb内容
echo bbbbbbbbbbb >> file1
在次查看追加内容
docker exec c2 cat /root/file2
数据卷
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多可用的特征
数据卷可以在容器之间共享和重用。
对数据卷的修改会立马生效。
对数据卷的更新,不会影响镜像。
卷会一直存在,直到没有容器使用。
对数据卷的使用,类似于 Linux 下对目录或文件进行 mount 操作
数据卷容器(实验)
构建一个容器,然后后续的容器是基于这个创建的容器进行继续创建的,再来创建c2和c3的时候,不让他找宿主机做映射了,直接让他找容器c1。
将一个容器专门用作其他容器的数据卷使用
创建其他容器使用的数据卷容器
docker run -tid --name 容器名 -v 宿主机目录:容器内部目录 镜像名 命令
创建容器并指定使用的数据卷容器
docker run -tid --name 容器名 --volumes-from 数据卷容器名 镜像名 命
例子如下
docker run -tid --name c1 -v /root/CS:root/test centos /bin/bash
docker run -tid --name c2 --volumes-from c1 centos /bin/bash
docker run -tid --name c3 --volumes-from c1 centos /bin/bash
创建数据卷容器 c1
docker run -tid --name c1 -v /root/CS:/root/test centos /bin/bash
(/root/test宿主机里没有的话,它会自己创建。)
查看已经创建的容器 (docker ps -a)
ls 查看当前目录下的宿主机里有CS测试 (ls)
查看 c1容器 /root目录下多了一个test (docker exec c1 ls /root)
接下来我们再来创建c2和c3的时候,不让他找宿主机做映射了,直接让他找容器c1
docker run -tid --name c2 --volumes-from c1 centos /bin/bash
再看一下docker exec c2下的root 下是否有test (docker exec c2 ls /root)
再创建c3容器
docker run -tid --name c3 --volumes-from c1 centos /bin/bash
查看c3 (docker exec c3 ls /root)
在宿主机下touch一个文件 (touch CS/1.txt)
查看容器c1 c2 c3
docker exec c1 ls /root/test
docker exec c2 ls /root/test
docker exec c3 ls /root/test
以上都有1.txt文件