Docker镜像和仓库笔记

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 "[email protected]"
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 "[email protected]"
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 "[email protected]"
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 "[email protected]"
ENV APPLICATION_NAME webapp
ENV ENVIRONMENT development

推送镜像到DockerHub

#用户名/镜像名
$ sudo docker push juedaiyuer/apache2

删除镜像

#停止所有的容器,才能删除镜像
docker stop $(docker ps -a -q)
#删除镜像   
docker rmi 

你可能感兴趣的:(Docker)