第一个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...