Docker镜像是由文件系统叠加而成的,最底端是一个引导文件系统-bootfs
$ sudo docker run -i -t --name test ubuntu /bin/bash
本地镜像都保存在宿主机/var/lib/docker
#拉取ubuntu仓库中的所有内容
$ sudo docker pull fedora
#查找镜像
$ sudo docker search puppet
#拉取search到的镜像
$ sudo docker pull devopsil/puppet
#用拉取到的镜像,构建一个容器
$ sudo docker run -i -t devopsil/puppet /bin/bash
#登录docker hub的命令
$ sudo docker login
#容器安装apache
$ sudo docker run -i -t ubuntu /bin/bash
# apt-get -yqq update
# apt-get install -y apache2
exit 退出容器
#得到最后运行容器的ID
$ sudo docker ps -l -q
#提交
$ sudo docker commit 3aca9be3b7d2 镜像仓库/镜像名
$ sudo docker commit -m '提交信息' --author="作者" 3aca9be3b7d2 镜像仓库/镜像名:标签
#查看新创建镜像的详细信息
$ sudo docker inspect test/apache-ubuntu
Dockerfile
#新建一个文件夹,创建Dockerfile文件
#该目录就是构建环境,上下文
touch Dockerfile
#Version:0.0.1
FROM ubuntu:14.04
MAINTAINER juedaiyuer "juedaiyuer@gmail.com"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi,I am your container' > /usr/share/nginx/html/index.html
EXPOSE 80
说明
FROM 基础镜像(base image)
MAINTAINER 作者
RUN 指令,每条指令创建一个新的镜像层,执行成功,提交该镜像层,执行下一条指令
构建镜像
#Dockerfile文件所在目录下执行
$ sudo docker build -t="test/webtest:v1" .
$ sudo docker build -t="test/webtest:v1" git源地址
#忽略Dockerfile的构建缓存
$ sudo docker build --no-cache -t="test/webtest:v1" .
#Ubuntu系统的Dockerfile模板
#ENV设置环境变量,用来表明最后的该模板最后的更新日期
FROM ubuntu:14.04
MAINTAINER juedaiyuer "juedaiyuer@gmail.com"
ENV REFRESHED_AT 2016-7-8
RUN apt-get -qq update
如果想要刷新一个构建,只需要更改REFRESHED_AT的日期,运行后续指令即apt-get update语句
#镜像是如何构建出来
$ sudo docker history 容器ID
#构建镜像后启动,-d 分离方式后台运行
$ sudo docker run -d -p 80 --name nginx_web 685863f4917a nginx -g "daemon off;"
#容器的80端口映射到了宿主机的32768端口
$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25808bc61bfa 685863f4917a "nginx -g 'daemon off" About a minute ago Up About a minute 0.0.0.0:32768->80/tcp nginx_web
$ sudo docker port 容器名/ID 80
0.0.0.0:32768
$ curl localhost:32768
Hi,I am your container
Dockerfile指令
CMD####
容器被启动后要执行的命令
docker run命令行指定的运行命令会覆盖Dockerfile中的CMD命令
#dockerfile
CMD ["/bin/bash"]
#不需要在docker run命令后指定运行命令
$ sudo docker run -i -t 容器ID
$ sudo docker run -i -t 容器ID /bin/ps
PID TTY TIME CMD
1 ? 00:00:00 ps
ENTRYPOINT
启动容器时不容易被覆盖,实际上docker run命令行中指定的任何参数再次传递给ENTRYPOINT
ENTRYPOINT["/usr/sbin/nginx"]
#重新build
$ sudo docker build -t="test/static_web" .
#运行,nginx守护进程以前台方式运行
$ sudo docker run -i -t test/static_web -g "daemon off;"
#CMD和ENTRYPOINT组合使用
#启动容器时,任何在命令行中指定的参数都会传递给nginx守护进程;
#如果不指定参数,则在CMD指令中的-h传递
ENTRYPOINT["/usr/sbin/nginx"]
CMD["-h"]
docker run --entrypoint标志覆盖ENTRYPOINT指令
WORKDIR
从镜像创建一个新容器时,在容器内部创建一个工作目录,ENTRYPOINT和/或CMD指定的程序会在这个目录下执行
WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp
ENTRYPOINT ["rackup"]
#-w标志在运行时覆盖工作目录
$ sudo docker run -t -i -w /var/log ubuntu pwd
ENV
在镜像构建过程中设置环境变量
#Docker容器中环境变量的持久化
ENV RVM_PATH /home/rvm
RUN gem install unicorn
#执行方式
RVM_PATH=/home/rvm/ gem install unicorn
ENV TARGET_DIR /opt/app
WORDIER $TARGET_DIR
docker run命令行-e标志来传递环境变量,只会在运行时有效
USER
指定镜像会以什么样的用户去运行
docker run -u 覆盖该指令指定的值
VOLUME
向基于镜像创建的容器添加卷,一个卷可以存在于一个或者多个容器内的特定目录
可以绕过联合文件系统,提供共享数据或者对数据进行持久化功能
#基于此镜像创建的任何容器创建一个名为/opt/project的挂载点
VOLUMN ["/opt/project"]
VOLUMN ["/opt/project","/data"]
ADD
用来将构建环境下的文件和目录复制到镜像中
会使之后的指令构建缓存失效
#文件源可以时URL的格式
ADD 源文件位置 目标文件位置
ADD latest.tar.gz /var/www/wordpress/
COPY
只关心在构建上下文中复制本地文件 ,而不会去做文件提取(extraction)和解压(decompression)的工作
文件源路径必须时一个与当前构建环境相对的文件或者目录
本地文件和Dockerfile同一目录下
#本地conf.d目录中的文件复制到/etc/apache2/目录中
COPY conf.d/ /etc/apache2/
ONBUILD
为该镜像添加触发器,当一个镜像被用做其它镜像的基础镜像时, 该触发器就会被执行
ONBUILD ADD ./app/src
ONBULID RUN cd /app/src && make
#查看镜像中的ONBUILD指令
$ sudo docker inspect 镜像ID
#通用的web程序应用模板
#Version:0.0.1
FROM ubuntu:14.04
MAINTAINER juedaiyuer "juedaiyuer@gmail.com"
RUN apt-get update
RUN apt-get install -y apache2
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ONBUILD ADD ./var/www/
ENTRYPOINT ["/usr/sbin/apache2"]
CMD ["-D","FOREGROUND"]
EXPOSE 80
#构建
$ sudo docker build -t="test/apache2" .
#构建一个名为webapp的镜像,如何使用模板镜像的功能
FROM test/apache2
MAINTAINER juedaiyuer "juedaiyuer@gmail.com"
ENV APPLICATION_NAME webapp
ENV ENVIRONMENT development
推送镜像到DockerHub
#用户名/镜像名
$ sudo docker push juedaiyuer/apache2
删除镜像
#停止所有的容器,才能删除镜像
docker stop $(docker ps -a -q)
#删除镜像
docker rmi <image id>