一、Docker镜像的创建方法

1、基于现有镜像的创建
docker commit -m "shuoming" -a "zuozhe" 容器ID docker:apache
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行
Docker数据管理与网络通信
2、基于本地模板创建
从对应的网站下载centos模板,并上传
Docker数据管理与网络通信
3、基于Dockerfile创建
除了手动生成Docker镜像之外,还可以用Dockerfile自动生成镜像。Dockerfile是由一组指令组成的文件,其中每条指令对应Linux中的一条命令,Docker程序将读取Dockerfile中的指定生成指定镜像。
Dockerfile结构大致分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”开头的注释。

(1)Dockerfile编写规则
在编写Dockerfile时,有严格的格式需要遵循:
1)第一行必须使用FROM指令指明所基于的镜像名称
2)之后使用MAINTAINER指令说明维护该镜像的用户信息
3)然后时镜像操作相关指令,如RUN指令,每运行一条指令,都会给基础镜像添加新的一层
4)最后使用CMD指令,来指定启动容器时需要运行的命令操作。

(2)Dockerfile操作指令
FROM 镜像:指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER 名字:说明新镜像的维护人信息
RUN 命令:在所基于的镜像上执行命令,并提交到新的镜像中
CMD["要运行的程序","参数1","参数2"]:指定启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指多条则只有最后一条被执行
EXPOSE 端口号:指定新镜像加载到Docker时要开启的端口
ENV 环境变量 变量值:设置一个环境变量的值,会被后面的RUN使用
ADD 源文件/目录 目标文件/目录:将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL
COPY 源文件/目录 目标文件/目录:将本地主机上的源文件/目录复制到目标地址点,源文件/目录要与Dockerfile在相同的目录中
VOLUME["目录"]:在容器中创建一个挂载点
USER 用户名/UID:指定运行容器时的用户
WORKDIR 路径:为后续的RUN、CMD、ENTRYPOINT指定工作目录
ONBUILD 命令:指定所生成的镜像作为一个基础镜像时所要运行的命令

(3)docker案例展示

mkdir apache        //建工作目录
cd apache
vi Dockerfile   //编写dockerfile

添加以下内容(#为注释)
#基于的基础镜像为centos
FROM centos
#维护该镜像的用户信息
MAINTAINER The Centos Project<cloud-ops@centos.org>
#镜像操作指令安装apache软件包
#RUN yum -y update
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]

vi run.sh //编写apache启动脚本
添加以下内容
rm -rf /run/httpd/* //清理httpd的缓存
exec /usr/sbin/apachectl -D FOREGROUND //启动apache服务

vi index.html //编写测试页
添加测试页内容
this is test

docker build -t httpd1:centos7 . //生成镜像 //使用Dockerfile生成镜
-t:指定镜像的标签信息
Docker数据管理与网络通信

注意:指定该命令注意要在Dockerfile所在的目录下面执行,其中“.”为当前路径
,如果不在dockfile目录下面,后面要加dockfile的路径如:docker build -t httpd1:centos7 /apche

docker run -d -p 80:80 ID //启动镜像并进行本地端口映射
Docker数据管理与网络通信
网页访问192.168.80.100
Docker数据管理与网络通信
4、构建私有仓库并将镜像上传

docker pull registry        //下载私有仓库的镜像
vi /etc/docker/daemon.json  //创建json文件

添加以下内容
{ "insecure-registries":["192.168.80.100:5000"]}

systemctl daemon-reload //重启加载json文件
systemctl restart docker        //重启容器服务

Docker数据管理与网络通信

docker tag http1:centos7 192.168.80.100:5000/apache //给dockfile生成的镜像打标签格式如上,否则无法上传打私有仓库
docker push 192.168.80.100:5000/apache  //上传到私有仓库

Docker数据管理与网络通信
curl http://192.168.80.100:5000/v2/_catalog //获取私有仓库列表
Docker数据管理与网络通信
打开另外一台部署docker的虚拟机,对应的IP为:192.168.80.110保证网络互通测试私有仓库
vi /etc/docker/daemon.json //同样创建json文件
添加私有仓库的地址
{ "insecure-registries":["192.168.80.100:5000"]}

systemctl daemon-reload //重启加载json文件
systemctl restart docker        //重启容器服务

curl http://192.168.80.100:5000/v2/_catalog //查看仓库列表
Docker数据管理与网络通信
docker pull 192.168.80.100:5000/apache //从私有仓库拉取上传的镜像
Docker数据管理与网络通信

二、Docker的数据管理

在Docker中,为了方便查看容器内产生的数据或者将多个容器中的数据实现共享,就是涉及到容器的数据管理操作。主要有两种方式:数据卷(Data Volumes)和数据卷容器(Data Volumes Containers)。
1、数据卷
数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似Linux下对目录进行mount操作。
docker run -v /var/www:/data1 --name web1 -it centos /bin/bash //将宿主机目录/var/www挂载容器中的/data1
Docker数据管理与网络通信
-v:在容器内创建数据卷,多次使用-v选项可以创建读个数据卷
--name:给容器创建一个友好的自定义名称
注意:宿主机本地目录的路径必须使用绝对路径,如果路径不存在,Docker会自动创建相应的路径
2、数据卷容器
如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器就是一个普通的容器,专门提供数据卷给其他容器挂载使用。使用的方法如下:首先,需要创建一个容器作为数据卷容器,之后在其他容器创建时用 --volumes-from 挂载数据卷容器中的数据卷使用。

docker run -d --name web100 -v /data1 -v /data2 -it centos /bin/bash    //创建新的数据卷容器
docker run -it --volumes-from web100 --name db1 centos /bin/bash        //创建新的容器,并挂载到数据卷容器web100上

Docker数据管理与网络通信

三、Docker网络通信

1、端口映射
在启动容器的时候,如果不指定对应的端口,在容器外将无法通过网络来访问容器内的服务。Docker提供端口映射机制来将容器内的服务提供给外部网络访问,实质上就是将宿主主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。
docker run -d -P httpd //端口的随机映射
-P(大写):实现端口的随机映射
-p(小写):指定要映射的端口
Docker数据管理与网络通信
Docker数据管理与网络通信
网页访问随机映射端口32768
Docker数据管理与网络通信
网页访问指定端口49280
Docker数据管理与网络通信
2、容器互联
容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道从而实现容器的互联。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。
在运行docker run命令时使用 --link选项可以实现容器之间的互联通信。
格式为 --link name:alias,其中name是要连接的容器名称,alias是这个连接的别名。

docker run -d -P --name web11 -it centos /bin/bash      //创建源容器并启动
docker run -P --name web2 --link web11:web11 -it centos /bin/bash       //创建目标容器

Docker数据管理与网络通信