https://www.cnblogs.com/lighten/p/6900556.html
docker run -d -p 80:80 --name webserver nginx
docker 运行:
docker run -it --rm ubuntu:14.04 bash
docker run是运行容器的命令;
-it :这是两个参数。-i:交互式操作。-t:终端。我们这里打算进入bash执行一些命令并查看返回结果,因此我们需要交互式终端操作。
--rm:这参数是说容器退出后随之将其删除。默认情况下,为了排除需求,退出的容器并不会立即删除,除非手动docker rm。我们这只是随意执行个命令,看看结果,因此--rm可以避免浪费空间。
ubuntu:14.04:这里指用ubuntu:14.04镜像为基础来启动容器。
bash:放在镜像后的是命令,这里我们希望有个交互式的Shell,因此用的是bash。
最后通过exit命令退出容器。
docker exec -it webserver bash //进入容器 bash终端,操作容器
docker images列出已经下载下来的镜像。
列表包含了仓库名,标签,镜像ID,创建时间,以及所占用的空间。
docker images -f dangling=true //显示虚悬镜像
一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,删除命令:docker rmi $(docker images -q -f dangling=true)
-f:代表过滤,是--filter的缩写
-q:列出镜像ID
比如:希望看到mongo:3.2之后(前)建立的镜像,可以用命令:docker images -f since/brfore=3.2
docker images --format "{{.ID}}:{{.Repository}}" 按照指定格式显示结果
为了加速镜像构建,重复利用资源,Docker会利用中间层镜像。
docker commit --author "mayunzhen@cmsr.chinamobile.com" --message "update the message index " webserver nginx:v2 //修改docker容器后,需要重新打包镜像。
docker history nginx:v2 //查看最近修改的历史记录
docker commit 命令会导致镜像臃肿。所以该命令一般只用于被入侵后保存现场等。但是,不要使用改命令制定镜像,定制行为应该使用Dockerfile来完成。
Dockerfile定制镜像
镜像的定制实际上就是定制每一层所添加的配置,文件。如果我们能把每一层修改,安装,构建,操作的命令都写入一个脚本,用这个脚本来构建,定制镜像,那么之前docker commit 无法解决的无法重复的问题,镜像构建透明性的问题、体积的问题就能得到解决。
FROM scratch //空白镜像,虚拟的概念
不以任何系统为基础,直接将可执行文件复制进镜像的做法,比如:swarm、coreos/etcd。
RUN指令是定制镜像时常用命令,一共有两种使用方式:
1.shell方式:RUN <命令>
2.exec方式:RUN ["可执行文件", "参数1", "参数2"]
使用Dockerfile创建镜像demo:
Dockerfile文件内容:
FROM nginx
RUN echo '<h1>hello,Docker by myz!</h1>' > /usr/share/nginx/html/index.html
1、运行该文件命令:docker build -t nginx:v3 .
-t参数:最终镜像名称
直接用GIt repo进行构建:
docker build 还支持从URL构建,比如可以直接从Git repo中进行构建:
2、docker build https://github.com/twang2218/gitlab-ce-zh.git#:8.14
这行命令指定了构建所需的Git repo,并且默认指定为master分支,构建目录为/8.14/,然后Docker就会自己去Git clone 这个项目、切换到指定分支,并进入到指定目录后开始构建。
3、docker build http://server/context.tar.gz
4、从标准输入中读取Dockerfile进行构建:docker build - <Dockerfile 或者:cat Dockerfile |docker build . 或者docker build - < context.tar.gz
如果标准输入的格式是gzip、bzip2、xz的话,将会使其为上下文压缩包,直接展开,将里面是为上下文,并开始构建。
COPY <源路径> <目标路径>
ADD 只有在需要解压缩文件的时候 用到。
CMD:用于指定默认的容器主进程的启动命令的。
1、shell用法 CMD <命令>
2、exec格式 CMD ["可执行文件", "参数1", "参数2"...]
3、参数列表格式 CMD ["参数1" , "参数2",...] 在指定了ENTRYPOINT指令后,用CMD指定具体的参数。
如果使用CMD的Shell格式话,实际的命令会被包装成sh -c 的参数形式进行执行。比如 CMD echo $HOME 在实际运行中,会被解析成: CMD ["sh","-c","echo $HOME"]
容器中没有后台服务的概念。容器中的主进程退出,容器就失去了存在的意义,从而退出。
ENTRYPOINT:和RUN指令格式一样;目的和CMD一样,都是在指定容器内部启动程序及参数,在运行时候也可以替代,不过比CMD稍显麻烦。通过docker run --entrypoint参数指定。
1、exec:
2、shell:
ENV命令:ENV version 7.2
xxx-$version---xxx
ARG:使用 docker build --build-arg key=value
VOLUME:定义匿名卷
为了防止运行时用户忘记将动态文件保存目录挂载为卷,在Dockerfile中,我们可事先指定某些目录挂载为匿名卷,这样在运行的时候,如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
VOLUME /data
这里的/data目录就会在运行时自动挂载为匿名卷,任何向/data目录中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态变化。
当前运行时,可以覆盖这个挂载目录:
docker run -d -v mydata:/data xxx
在这个命令中,采用mydata替换了Dockerfile中定义的匿名卷的挂载位置。
EXPOSE声明端口
在Dockerfile中写入这样的声明有两个好处:1.帮助镜像使用者理解这个镜像服务的守护端口,以便配置映射 2、在运行时,使用随机端口映射时,也就是docker run -P 时,会自动映射EXPOSE端口。
WORKDIR:指定工作目录
USER:指定当前用户。USER命令和WORKDIR类似,都是改变环境状态并且影响以后的层。WORKDIR是改变工作目录,USER则是改变之后运行层的执行RUN,CMD以及ENTRYPOINT这类命令的身份。
HEALTHCHECK健康检查。
检查健康状态 原因:docker inspect --format '{{json .State.Health}}' web| python -m json.tool
OBUBUILD为他人做嫁衣