文章目录
- 一、Docker 镜像的分层:
- 二、公有仓库与私有仓库:
- 三、Docker 网络通信:
一、Docker 镜像的分层:
- Dockerfile 中的每个指令都会创建一个新的镜像层;
- 镜像层将会被缓存和复用;
- 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;
- 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效;
- 镜像层是不变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然包含该文件。
(1)Docker 镜像:
- 是应用分布的标准格式;
- 可支撑一个 Docker 容器的运行;
(2)Docker 镜像的创建方法:
1、基于已有镜像创建:将容器里面运行的程序及运行环境打包生成新的镜像
创建容器:
docker commit -m "new" -a "daoke" e94b0252186d daoke:centos
//-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行
2、基于本地模块创建:
需要下载:debian-7.0-x86-minimal.tar.gz
cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new
3、基于 Dockerfile 创建:
- Dockerfile 是由一组指令组成的文件
- Dockerfile 结构的四部分:
基础镜像信息;
维护者信息;
镜像操作指令;
容器启动时执行指令; - 使用 Dockerfile 创建镜像并在容器中运行
Dockerfile 操作指令:
示例:这里创建一个 httpd 的镜像
第一步:创建一个 Dockerfile 文件:
vim Dockerfile
FROM centos ##基于的基础镜像
MAINTAINER The porject <cloud-docker> ##维护镜像的用户信息
RUN yum -y update ##镜像操作指令安装Apache软件
RUN yum -y install httpd ##安装Apache服务
EXPOSE 80 ##开启80端口
ADD index.html /var/www/html/index.html ##复制网址首页文件
ADD run.sh /run.sh ##将执行脚本复制到镜像中
RUN chmod 755 /run.sh
CMD ["/run.sh"] ##启动容器时执行脚本
第二步:创建一个执行脚本:
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
第三步:测试
[root@localhost opt]# echo "this is test web" > index.html
[root@localhost opt]# docker build -t httpd:centos . //生成镜像
[root@localhost opt]# docker run -d -p 1216:80 httpd:centos //新镜像运行容器(内部端口是80,自定义一个端口1216)
浏览器访问:http://192.168.220.131:1216/
二、公有仓库与私有仓库:
随着创建的镜像日志增多,就需要有一个保存镜像的地方,这就是仓库。目前主要有两种仓库:公共仓库、私有仓库。最方便的就是使用公共仓库上传和下载镜像,下载公共仓库中的镜像不需要注册,但是上传是需要注册的:公共仓库网址
(1)公共仓库:
将创建好的 httpd:centos 镜像。上传到刚申请的公共仓库中:
docker tag httpd:centos wangwenjun/httpd:centos
docker push wangwenjun/httpd:centos
(2)私有仓库:需要使用 registry 来搭建本地私有仓库。
1、先下载 registry镜像:
docker pull registry
2、创建文件作为私有仓库:
[root@localhost ~]# vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.220.131:5000"],
"registry-mirrors": ["https://05vz3np5.mirror.aliyuncs.com"]
}
3、重启 docker:
[root@localhost ~]# systemctl stop docker
[root@localhost ~]# systemctl start docker
4、创建容器:
[root@localhost ~]# docker create -it registry /bin/bash
[root@localhost ~]# docker ps -a //查看状态
[root@localhost ~]# docker start 95fb93f68d53 //启动容器
宿主机的/data/registry自动创建挂载容器中的 /tmp/registry
[root@localhost ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
将要上传的镜像修改标记:
[root@localhost ~]# docker tag httpd:centos 192.168.220.131:5000/httpd
标记修改为:192.168.220.131:5000/httpd
上传镜像:
[root@localhost ~]# docker push 192.168.220.131:5000/httpd
获取私有仓库列表:
curl -XGET http://192.168.220.131:5000/v2/_catalog
从私有库中重新下载:
[root@localhost ~]# docker pull 192.168.220.131:5000/httpd
三、Docker 网络通信:
docker 提供了映射容器端口到宿主机和容器互联机制来为容器提供网络服务。
(1)端口映射:
Docker 提供端口映射机制来将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。
docker run -d -P httpd:centos
//-P:随机某个端口
docker run -d -p 49280:80 httpd:centos
//-p:具体指定映射哪个端口(49280)
(2)容器互联(使用centos镜像):
1、首先创建第一个容器,命名为web1:
docker run -itd -P --name web1 centos /bin/bash
2、再创建第二个容器,命名为web2:
docker run -itd -P --name web2 --link web1:web1 centos /bin/bash
//--link:指定连接容器以实现容器互联
3、进入到 web2 容器,ping web1是否能够互联:
[root@localhost ~]# docker exec -it web2 /bin/bash
[root@a3a462eb6fff /]# ping web1