Dockerfile的初体验+创建私有仓库

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.测试容器

mark

三: 基于已有的容器创建镜像

  • 创建容器
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
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值