dockerfile介绍

第一个Dockerfile

~$ mkdir dockerfile1

~$ touch /dockerfile1/Dockerfile

~$ vim Dockerfile

FROM alpine:latest      #最小化的linux镜像

MAINTAINER xbf

CMD echo 'hello docker'

#alpine为准们针对docker而制作的一个极小的Linux的环境镜像image

~$ docker build -t hello_docker .

# “ .”表示将当前目录下的所有内容,创建一个名为hello_docker的image,当前目录里包含Dockfile文件

~$ docker images      #查看本地image

~$ docker run hello_docker  #运行该image输出"hello docker"字符

第二个Dockerfile

~$ mkdir dockerfile2

~$ touch /dockerfile2/Dockerfile

~$ vim Dockerfile

FROM Ubuntu           #基础镜像名字

RUN sed -i 's/archive.ubuntu.com /mirrors.ustc.edu.cn/g' /etc/apt/sources.list     #加速命令,将国外比较慢的镜像站点换成国内某站点镜像。

MAINTAINER xbf                      #赋予用户名为xbf维护权限

RUN apt-get update                          #更新Ubuntu库

RUN apt-get install -y nginx      #安装nginx

COPY index.html /var/www/html        #拷贝本地文件index.html到容器里面去,路径为/var/www/html(不同版本的ubuntu路径是不同的)

ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]   #提供容器的入点ENTRYPOINT,作用是将nginx在前台执行而不是作为守护进程。该语句是三个字符串组合起来的数组,最后会将三个字符串用空格展开,组合成一个命令行。

EXPOSE 80                               #80端口为普通http服务器监听端口

准备index.html文件如下:

~$ touch index.html

~$ vim index.html

今天是周末!

构建:

~$ docker build -t xbf/hello-nginx .      # 在xbf目录下创建名字为hello-nginx的镜像image,". "表示当前目录作为上下文提交上去(当前目录包含文件Dockerfile)

执行完成后会显示:Successfully built 8567f7c0a8bc        

运行image镜像:

~$ docker run -d -p 80:80 xbf/hello-nginx          #如果存在端口冲突,很可能之前已经运行过监听80端口的程序,执行:~$ docker ps  #查看,~$ docker stop conatainname #关闭监听80端口的程序。

执行成功后,会返回一个容器congtainer的ID

测试:

~$ curl http://localhost:80    或者  ~$ curl http://localhost             #缺省就是80端口

基本Dockerfile语法:

命令                         用途

FROM                     base image,指定的基础镜像名

RUN                        在容器内执行一个命令

ADD                        往容器中添加文件,不仅可以添加本地文件和目录,也可以添加远程文件和目录到本地容器里面来。

COPY                     只可以拷贝本地文件和目录

CMD                       执行命令,给容器制定一个执行的入口,通常用CMD和ENTRYPOINT来完成。

EXPOSE                暴露端口,假设我们是一个服务器,可以监听一个或多个端口,此时用EXPOSE可以表述这些端口

WORKDIR             指定运行命令的路径

MAINTAINER        指定维护者

ENV                       为容器里面的环境设置一些变量。

ENTRYPOINT        和CMD相似,都是设定容器入口,没有启用ENTRYPOINT时就用CMD在指定容器入口,用了ENTRYPOINT后,可以用CMD来指定ENTRYPOINT后面的argument参数。

USER                     指定执行该命令的用户,通常不会使用root在容器里面执行

VOLUME                指定该容器所挂载的卷,

镜像分层

镜像是分层被存储的,Dockerfile中的每一行都产生一个新层,而不是作为整个文件进行存储的。

         命令行                              镜像层ID

FROM alpine:latest               4e38e38c8ce0

MAINTAINER xbf                  fb1aabf4427b

CMD echo 'hello docker'       3df065bfdff6

已经存在的Image里面的层都是只读的,一旦image被运行就会产生一个名为container layer的新层(新层拥有读写权限),如下:

container layer                   RW         #新的容器层具有读写权限,这保证了我们的容器可以改变。

CMD echo "hello world"     RO

MAINTAINER xbf               RO

FROM alpine latest            RO

分层保证了不同image的各层之间可以共享,以此缓解存储压力。

Volume介绍

Volume提供独立于容器之外的持久化存储

通常在容器中个人的改动,缺省情况下是不会被保存的。Volume提供了一个方便的可以持久化存储的技巧。比如我们运行一个数据库的容器,除去数据库操作之外的数据应该被持久化存储的。Volume可以提供这些功能,并可以提供不同容器之间共享的数据存储功能。

~$ docker run -d --name  nginx -v /usr/share/nginx/html nginx  #运行nginx容器,-v 挂在一个/usr/share/nginx/html卷,为容器内部的一个地址。是nginx用来访问网页的地址。

命令输出:返回一个容器ID号

~$ docker inspect nginx        #inspect 检查,给出名字为nginx容器所有相关的信息。关注:

“Mounts”:[

      {

                   "Name": "bae22ee0644d402878883c6658bd672229e30f2325e8bbb614cf37eccla3edf56"  

                   "Source": "/var/lib/docker/volumes/bae22ee0644d402878883c6658bd672229e30f2325e8bbb614cf37eccla3edf56/_data",

                    "Destination": "/usr/share/nginx/html",

                    "Driver": "Local"

                     "Mode": "".

                      "RW":true,

                      "Propagation": ""

       }

],

# 上面程序段注意:将服务器里面的"source"路径,挂载到“Destination”地址

~$ docker exec -it nginx /bin/bash    #进入到容器里面




Registry镜像仓库介绍

Registry实际上就是一个sass服务,提供注册、存储我们的镜像,目的是让大家来共享我们的镜像。我们将自己制作的镜像提交到Registry上面去,别人可以在Registry上面下载使用。基本原理图如下:图如下Docker Hub为Docker官方提供的镜像仓库Registry




术语:

host 宿主机即我们正在使用的这台电脑,

image镜像即:可以从远端拉取得或者是本地构建的一些可以重复使用的软件的打包,

container容器:是镜像的一个运行实例,

registry仓库,是一个存放了很多很多镜像的注册仓库

daemon守护程序,用来和registry通讯,用来接收用户的命令

client客户端,用来给daemon输送命令以及进行操作

和Registry交互命令:

~$ docker search whalesay        #用来从官方的dockershub远端的Registry仓库里面搜索一个我想要的镜像

~$ docker pull whalesay            #将我所需要的Registry仓库里面的远端镜像拉取下来

~$ docker push myname/whalesay         #将我自己在本地制作的镜像push到远端Registry仓库里面


国内的一些仓库:daocloud、时速云、aliyun

docker本身官方镜像仓库:dockerhub    #使用量最多的,但国内使用速度可能不是很快

实战操作:

一、pull下载DockerHub中镜像到本地host,并运行

1.搜索

~$ docker search whalesay           #到官方的DockerHub镜像仓库Registry中搜索名字为whalesay的镜像(whalesay为“在命令行的模式画了一个小鲸鱼,然后说了一句话”的小程序的镜像)

2.使用pull命令下载远端镜像

~$ docker pull docker/whalesay      #将DockerHub镜像仓库中的whalesay下载到本地host

~$ docker images                            #查询本地镜像

3.运行镜像

~$ docker run docker/whalesay cowsay  Docker 很好玩!

二、将本地镜像push到远端DcokerHub镜像仓库Registry

1.用用户名xibeifeng/whalesay给镜像docker/whalesay产生一个新tag

~$ docker tag docker/whalesay xibeifeng/whalesay           #会产生一个新镜像

~$ docker images                                                               #会看到本地有“IMAGE ID”完全相同的两个镜像,一个为:REPOSITORY为docker/whalesay,另外一个为:xibeifeng/whalesay

2.将新产生的镜像push到远程DockerHub中

~$ docker login          #登陆到官方的DockerHub上

username:

password:

Login Succeeded

~$ docker push xibeifeng/whalesay     #将xibeifeng/whalesay镜像push到远端DockerHub上面。(push命令执行相对会慢一点)

docker-compose多容器app介绍

用文件描述一个多容器app结构,然后用compose工具把他拉出来。

docker-compose是一个独立于docker 的工具,需要安装如下:

Mac/Windows:自带

Linux:curl http://GitHub.com/docker/compose...














 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值