Docker镜像创建三方法
Docker镜像的创建
操作 法1
基于已有的镜像容器进行创建(UP状态也可以创建 但最好不要)
docker create -it centos:7 /bin/bash
docker commit -m "new" -a "daoke" a5049eb22932 daoke:new
docker images (有镜像)
对应的daoke new 是这个
操作 法二
基于本地模板创建
debian 7.0拖入
cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:debian
docker images
有debian 版本的
法三
法三:基于Dockerfile创建 (从只有centos7的镜像-带有apache的镜像且加载为容器-自动运行apache-展现它的首页)
vim Dockerfile
FROM centos:7
MAINTAINER this is project
RUN yum -y update
RUN yum -y install httpd
EXPOSE 80
ADD index.html /var/www/html/index.html
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
文件名必须是Dockerfile
基于的基础镜像
维护镜像的用户信息MAINTAINER后随便写
基于centos7系统的容器里 的 RUN+跟新yum源y
因为短暂在容器里所以用RUN 下载apache
暴露80端口(容器的)别人访问不了 需端口映射
加 写默认首页 添加到容器中某位置
启动apache脚本添加到 容器中的根目录下 (先在宿主目录下写好)
给脚本执行权限 (在容器中运行RUN)
(ADD宿主目录添加到容器中 EXPOSE暴露端口 RUN在容器中运行某条命令)
启动容器时自动执行脚本 脚本中写启动apache 启脚本就是启apache 后面就可以启动apache)
vim index.html
<h1>ky06</h1>
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
删掉所有的容器和镜像
docker stop a5049eb22932 先停容器(centos7的 其他的已经删了)
docker rm a5049eb22932 先删容器
docker rmi centos:7 再删镜像
docker build -t httpd:centos . 生成镜像
(xshell再开一个窗口 创建的过程中docker ps –a 刷新看 每层创建会产生临时容器 上一层创建的东西会包含在下一层中继续执行 关 开 做完后自动销毁)
docker ps -a 无容器
docker images 有镜像 centos7是之前的 httpd是构建后的镜像
(第一条 centos7中装apapche服务)
新镜像运行容器(-d启用守护进程 -p节点上暴露1216端口映射80端口(端口不能冲突))
docker run -d -p 1216:80 httpd:centos
docker ps –a 看看容器
有端口映射了(监听任意网段地址的1216端口 tcp协议)
用宿主机的浏览器 http://20.0.0.10:1216 访问到容器了(虚拟机上的apache迁移到了容器上了)
建立私有账户(因为镜像出来了 想传)
docker pull registry 下一个镜像 做镜像加速用的 私有仓库的端口 5000
vim /etc/docker/daemon.json
{
"insecure-registries":["20.0.0.10:5000"],
"registry-mirrors": ["https://6va2732o.mirror.aliyuncs.com"]
}
一个做私有仓库 一个做加速
systemctl restart docker (改了配文 重启)
docker create -it registry /bin/bash registry镜像创建容器
docker ps –a
docker start 5fbfde1c19ab docker ps –a(因为-it没加d守护进程 run可以弥补 里有d)
前面宿主机目录挂载到容器目里 互存都有
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry (最后rigistry镜像) -v会自动建目录挂载且端口映射 宿主即目录挂载到tmp目录 哪儿存都有
上传(重新定义标签)
docker tag httpd:centos 20.0.0.10:5000/httpd (改)原本名称 改成地址和端口 /想上传到仓库的名称
docker push 20.0.0.10:5000/httpd (上传)
获取私有仓库列表
curl -XGET http://20.0.0.10:5000/v2/_catalog (有 httpd)
从私有仓库下载
准备 容器剩httpd容器映射的即可 镜像剩registry因为私有仓库 centos原来就有不管
docker pull 20.0.0.10:5000/httpd
docker images 有映射的apche基于centos的镜像 所以删
裸金属要从私有仓库下载需要在这里要指向仓库的位置
数据卷 (宿主和容器共享)
节点中share目录挂载到cs7容器的tnp中 他俩同步变化(加减数据)
docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash (看图 且自动进容器了)
容器里/data1里有什么内容 裸金属外/www里就有什么同步上传更新删改
验证:cd data1/ (容器里有data1)
echo "this is test" > test.txt
exit
cd /var/www/
ls
test.txt
数据卷容器(容器和容器共享)data1关联tmp1 data2关联tmp2
关联就两个-v
docker run --name web100 -v /data1 -v /data2 -it centos:7 /bin/bash 数据卷容器
自己是db100
docker run -it --volumes-from web100 --name db1 centos:7 /bin/bash新容器挂载数据卷容器web100 (没有声明用data1 data2用1里面的data1 data2)
自己是db1
作用场景(100个相同网站 容器里数据同步 改一个即可)
端口映射
-P随机端口映射 (从32768开始)
-p指定端口映射
docker images (看镜像)
docker run -d -P 20.0.0.10:5000/httpd (端口映射)
docker ps -a (看容器)
docker run -d -P 20.0.0.10:5000/httpd (再建一个端口映射,就是32769)
容器互联
docker run -itd -P --name web11 centos:7 /bin/bash (创建并运行容器取名web1,端口号自动映射)
docker ps –a (有名叫web11的容器)
docker run -itd -P --name web22 --link web11:web11 centos:7 /bin/bash (link:后别名)
docker ps -a (web22也有了)
docker exec -it f3965cf8c89e /bin/bash 进入web12
ping web11 (web11的地址就是172.17.0.6)