Dockerfile的初体验+本地私有仓库
文章目录
一: Dockerfile简述
-
Docker在运行之前,需要以镜像作为基础环境,可以说镜像是整个Docker容器创建的关键,而创建镜像的三种方法中基于Dockerfile创建的方法使用最为灵活。
-
Dockerfile可以看作是被Docker程序所解释翻译的脚本,是由一组命令集合而成,每条命令对应一条操作指令,由docker翻译为Linux下的具体命令。用户可以通过自定义其内容来快速创建镜像。
-
在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化,所以Docker镜像是分层的
-
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 命令 指定所生成的镜像作为一个基础镜像时所要运行的命令 -
我们构建镜像一般有三种方式:
1、基于Dockerfile(最常用)创建
2、基于已有的镜像容器进行创建镜像
3、基于本地模板进行构建
-
Docker镜像的分层
Dockerfile中每个指令都会创建一个新的镜像层
镜像层将被缓存和复用
当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
镜像层是不可变的,如果在某一层中添加一个文件,然后再下一层中删除它,则镜像中依然会包含该文
-
什么是Dockerfile?
Dockerfile是由一组指令组成的文件
Dockerfile结构分成四个部分:
1、基础镜像信息
2、维护者信息
3、镜像操作指令
4、容器启动时指定指令
二: 基于Dockerfile构建Apache镜像
1、编写Dockerfile文件
mkdir apache
cd apache
cat > Dockerfile <<-'EOF'
#1.基于的基础镜像
FROM centos:7
#2.维护镜像的用户信息
MAINTAINER this is kgc
#3.更新yum源,安装httpd
RUN yum -y update
RUN yum install -y httpd
#4.暴露容器内部端口
EXPOSE 80
#5.复制网站首页文件
ADD index.html /var/www/html/index.html
#6.将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#7.启动容器时执行的脚本
CMD ["/run.sh"]
EOF
2.编写执行脚本与首页内容
[root@docker apache]# vim run.sh
#!/bin/bash
rm -rf /run/httpd/* '//清除缓存'
exec /usr/sbin/apachectl -D FOREGROUND '//启动apache'
[root@docker apache]# echo "web test" > index.html
3、生成镜像
docker build -t httpd:centos .
4.新镜像运行容器
docker run -d -p 8081:80 httpd:centos
5.测试容器
三: 基于已有的容器创建镜像
- 创建容器
root@docker01 ~]# docker images
httpd centos f63a2f8e2edb 9 hours ago 419MB
nginx latest 7e4d58f0e5f3 10 days ago 133MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
[root@docker01 ~]# docker create -it centos:7 /bin/bash
4de61830caee603e9e3cbb76d35473b3f98e443492a7829814eee0f560239271
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e6ca845272fc centos:7 "/bin/bash" 39 minutes ago Up 39 minutes web12
e77dc769170c centos:7 "/bin/bash" 40 minutes ago Up 40 minutes web11
5e2e8a827d0d httpd:centos "/run.sh" 9 hours ago Up 6 minutes 0.0.0.0:8081->80/tcp dreamy_knuth
- 创建镜像
[root@docker01 ~]# docker commit -m "ceshi" -a "li" 5e2e8a827d0d tang:centos
sha256:0b6b6727c64f0a9d85e4b4563484a001d1fba053ccac19dbf0b40cc7d138ce85
四: 基于本地模板创建
-
下载本地模板
通过导入系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载
地址为:https://wiki.openvz.org/Download/template/precreated
或者使用wget下载:wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
-
模板下载后直接导入即可
[root@docker01 ~]# ls anaconda-ks.cfg debian-7.0-x86-minimal.tar.gz initial-setup-ks.cfg apache docker-install.sh [root@docker01 ~]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new sha256:48335eb7b82ddb656c7b921482e96a629f676a9c77f2102e213bd5668881f30e [root@docker01 ~]# docker images daoke new 48335eb7b82d 13 seconds ago 215MB
五: Docker 私有仓库建立
-
私有仓库设置步骤
1、下载registry镜像
2、客户端设置daemon.json文件,指定私有仓库位置
3、生成registry容器,开放5000端口
4、镜像打标签
5、上传镜像,docker push
6、下载镜像,docker pull
-
实战建立私有仓库
1.服务端下载registry镜像 '//我直接使用这台当做服务端和客户端了'
[root@docker01 apache]# docker pull registry
2.指定镜像仓库的地址
[root@docker01 ~]# vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.100.200:5000"],
"registry-mirrors": ["https://ye71id88.mirror.aliyuncs.com"]
}
3.生成registry容器,开放5000端口
[root@docker01 ~]# docker create -it registry /bin/bash
[root@docker01 ~]# docker ps -a
[root@docker01 ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry:latest
[root@docker01 ~]# docker pull nginx
4.镜像打标签
[root@docker01 ~]# docker tag nginx:latest 192.168.100.200:5000/nginx
5.上传镜像测试
[root@docker01 ~]# docker push 192.168.100.200:5000/nginx
The push refers to repository [192.168.100.200:5000/nginx]
908cf8238301: Pushed
eabfa4cd2d12: Pushed
60c688e8765e: Pushed
f431d0917d41: Pushed
07cab4339852: Pushed
latest: digest: sha256:794275d96b4ab96eeb954728a7bf11156570e8372ecd5ed0cbc7280313a27d19 size: 1362
[root@docker01 ~]# curl -XGET http://192.168.100.200:5000/v2/_catalog
{"repositories":["nginx"]}
[root@docker01 ~]# docker rmi 192.168.100.200:5000/nginx:latest
Untagged: 192.168.100.200:5000/nginx:latest
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos f63a2f8e2edb 8 hours ago 419MB
nginx latest 7e4d58f0e5f3 10 days ago 133MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
registry latest 2d4f4b5309b1 3 months ago 26.2MB
6.下载镜像测试
[root@docker01 ~]# docker pull 192.168.100.200:5000/nginx
Using default tag: latest
latest: Pulling from nginx
Digest: sha256:794275d96b4ab96eeb954728a7bf11156570e8372ecd5ed0cbc7280313a27d19
Status: Downloaded newer image for 192.168.100.200:5000/nginx:latest
192.168.100.200:5000/nginx:latest
[root@docker01 ~]# docker images
192.168.100.200:5000/nginx latest 7e4d58f0e5f3 10 days ago
六: 数据卷管理
-
Docker 数据卷 (宿主机与容器之间)
[root@docker01 ~]# docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash [root@2b630b7b6e5e /]# cd /data1 [root@2b630b7b6e5e data1]# ls [root@2b630b7b6e5e data1]# touch test123 [root@2b630b7b6e5e data1]# exit exit [root@docker01 ~]# cd /var/www [root@docker01 www]# ls test123
-
数据卷容器(容器与容器之间)
[root@docker01 www]# docker run --name web100 -v /data1 -v /data2 -it centos:7 /bin/bash2 [root@c211fb45a9ff /]# ls 3anaconda-post.log data1 dev home lib64 mnt proc run srv tmp var4bin data2 etc lib media opt root sbin sys usr5 [root@c211fb45a9ff /]# cd data16 [root@c211fb45a9ff data1]# touch 1237 [root@c211fb45a9ff data1]# cd ../data2 [root@c211fb45a9ff data2]# touch 4569 [root@c211fb45a9ff data2]# exit [root@docker01 www]# cd /data1 [root@docker01 www]# cd ~ [root@docker01 ~]# docker run -it --volumes-from web100 --name web99 centos:7 /bin/bash [root@34ba5b98d930 /]# ls anaconda-post.log data1 dev home lib64 mnt proc run srv tmp var17bin data2 etc lib media opt root sbin sys usr18 [root@34ba5b98d930 /]# ls data1 1237 [root@34ba5b98d930 /]# ls data2 4569
七: 端口映射
-
-P(大)随机映射端口
-p(小)指定端口
docker run -d -P httpd:centos docker run -d -P 49280:80 httpd:centos docker ps -a
八: 容器互联
-
创建并运行容器取名web1,端口号自动映射 docker run -itd -P --name web11 centos:7 /bin/bash 创建并运行容器取名web12 ,连接到web1和其通讯 docker run -itd -P --name web12 --link web11:web11 centos:7 /bin/bash 进入web12容器 ping web11