docker学习(一)

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为他人做嫁衣

 

posted @ 2019-10-28 17:39  马云12314  阅读(222)  评论(0编辑  收藏  举报