准备工作:
主机名操作系统磁盘大小IP地址DockerCentOS750G192.168.1.1 实验所需软件包从这个连接下载:https://pan.baidu.com/s/1CgMBAnFJbrEckyLPe6rmaw提取码:8qf2安装 Docker 服务:
[root@Docker ~]# ls anaconda-ks.cfg centos7 docker-18.03.1-ce.tgz [root@Docker ~]# tar xf docker-18.03.1-ce.tgz [root@Docker ~]# cp docker/* /usr/bin/ [root@Docker ~]# dockerd &载入 centos7 镜像:
[root@Docker ~]# docker load < centos7 f972d139738d: Loading layer 208.8MB/208.8MB Loaded image: centos:latestDocker 镜像除了是 Docker 的核心技术之外也是应用发布的标准格式。一个完整的 Docker 镜像可以支撑一个 Docker 容器的运行。
创建镜像的三种方法:基于已有镜像创建、基于本地模板创建、基于 Dockerfile 创建。主要使用 docker commit 命令,其实质就是把一个容器里面运行的程序及该程序的运行环境打包起来生成新的镜像。
命令格式:docker commit [选项] 容器ID/名称 仓库名称:[标签]常用选项:
-m:说明信息-a:作者信息-p:生成过程中停止容器的运行下面介绍的是 ubuntu 模板压缩包,将下载好的压缩包拖入:
[root@Docker ~]# ls anaconda-ks.cfg centos7 docker docker-18.03.1-ce.tgz ubuntu-12.04-x86-minimal.tar.gz [root@Docker ~]# cat ubuntu-12.04-x86-minimal.tar.gz | docker import - ubuntu:v12 [root@Docker ~]# docker images | grep ubuntu除了手动生成 Docker 镜像之外,可以使用 Dockerfile 自动生成镜像。Dockerfile 是由一组指令组成的文件,其中每条指令对应 Linux 中的一条命令,Docker 程序将读取 Dockerfile 中的指令生成指定镜像。Dockerfile 结构大致分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
Dockerfile 每行支持一条指令,每条指令可携带多个参数,支持使用以"#"号开头的注释。
在编写 Dockerfile 时,有严格的格式要遵循:
第一行必须使用 FROM 指令指明所基于的镜像;之后使用 MAINTAINER 指令说明维护该镜像的作者信息;然后是镜像操作相关指令,如 RUN 指令;最后使用 CMD 指令来指定容器要运行的命令操作。常用的 Dockerfile 操作指令:
指令含义FROM 镜像指定新镜像所基于的镜像,第一条指明必须为 FROM指令,每创建一个镜像就需要一条 FROM指令MAINTAINER 名字说明新镜像的维护人信息RUN 命令在所基于的镜像上执行命令,并提交到新的镜像中CMD[“要运行的程序”,“参数1”,“参数2”]指定启动容器时要运行的命令或者脚本,Dockerfile只能有一条 CMD命令,如果指定多条则只有最后一条被执行EXPOSE 端口号指定新镜像加载到 Docker时要开启的端口ENV 环境变量 变量值设置一个环境变量的值,会被后面的 RUN 使用ADD 源文件/目录 目标文件/目录将源文件复制到目标文件,源文件要与 Dockerfile位于相同目录中,或者是一个 URLCOPY 源文件/目录 目标文件/目录将本地主机上的源文件/目录复制到目标地点,源文件/目录要与 Dockerfile在相同目录中VOLUME [" 目录 "]在容器中创建一个挂载点USER 用户名/UID指定运行容器时的用户WORKDIR 路径为后续的 RUN、CMD、ENTRYPOINT 指定工作目录ONBUILD 命令指定所生成的镜像作为一个基础镜像时所要运行的命令挂光盘,并配置yum源
[root@Docker ~]# yum -y install httpd && systemctl start httpd [root@Docker ~]# cd /var/www/html/ [root@Docker html]# mkdir centos7 [root@Docker html]# mount /dev/cdrom centos7/使用浏览器访问测试:
在Docker中,为了方便查看容器内产生的数据或者将多个容器中的数据实现共享,就是涉及到容器的数据管理操作。
主要有两种方式:数据卷(Data Volumes)和数据卷容器(Data Volumes Containers)。数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似 Linux 下对目录进行 mount 操作。
创建一个新的容器 web2 ,将宿主机的 /www 目录挂载到容器的 /data1 目录上:
[root@Docker ~]# docker run -itd -v /www:/data1 --name web2 centos:latest [root@Docker ~]# docker ps | grep web2在宿主机的 /www 的目录下,创建几个文件,并进入容器中查看:
[root@Docker ~]# cd /www/ [root@Docker www]# touch test{1..5}.txt [root@Docker www]# ls进入容器查看:
[root@Docker www]# docker exec -it web2 /bin/bash [root@c2581b676431 /]# cd /data1/ [root@c2581b676431 data1]# ls如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器就是一个普通的容器,专门提供数据卷给其他容器挂载使用。
使用方法:首先,需要创建一个容器作为数据卷容器,之后在其他容器创建时用 --volumes-from 挂载数据卷容器中的数据卷使用。注意:这里使用预先创建好的数据卷容器 web1 ,就是刚刚创建的名字为 web1 的容器。web1 容器中创建的数据卷是 /data1 与 /data2;把这两个数据卷挂载到新的容器 db1 当中:
[root@Docker ~]# docker run -itd --volumes-from web1 --name db1 centos:latest [root@Docker ~]# docker ps | grep db1 [root@Docker ~]# docker exec -it db1 /bin/bash [root@37f24ebbdc0b /]# cd /data1/ [root@37f24ebbdc0b data1]# ls [root@37f24ebbdc0b data1]# touch zhangsan{1..3}.txt [root@37f24ebbdc0b data1]# ls zhangsan1.txt zhangsan2.txt zhangsan3.txt [root@37f24ebbdc0b data1]# exit exit [root@Docker ~]# docker exec -it web1 /bin/bash [root@941a16b013ae /]# cd /data1/ [root@941a16b013ae data1]# ls zhangsan1.txt zhangsan2.txt zhangsan3.txt在启动容器的时候,如果不指定对应的端口,在容器外将无法通过网络来访问容器内的服务。
Docker 提供端口映射机制来将容器内的服务提供给外部网络访问,实质上就是将宿主 主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。
实现端口映射,使用 run 命令 -P(大写) 命令实现随机映射,Docker 会随机映射宿主机端口范围在 49000~49900 的端口,到容器内部所有开发的网络端口,但范围也不是绝对的。
[root@Docker ~]# docker run -d --name Web1 -P httpd:centos [root@Docker ~]# docker ps | grep Web1在运行 docker run 命令使用小写 p 可以指定要映射的端口:
[root@Docker ~]# docker run -d --name Web2 -p 8888:80 httpd:centos [root@Docker ~]# docker ps | grep Web2 注意:-P 选项会自动映射容器中所有的端口,而 -p 需要一个一个的指定。现在使用浏览器访问宿主机 IP 加上刚才转化的端口即可访问到容器的 80 端口:
在运行docker run 命令使用 --link 选项实现容器之间的互联通信
命令格式: --link name: alias :name 是要连接的容器名称(此名称有唯一性),alias 是这个连接的别名。