Docker1指令,docker-compose,Dockerfile

Posted 码农编程录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker1指令,docker-compose,Dockerfile相关的知识,希望对你有一定的参考价值。


1.pull/image,run/ps(进程),exec/commit

Docker是主要应用于linux和后台应用的虚拟机(和vmware像):由三部分构成:镜像(image)是像ubuntu镜像文件(iso,img文件),容器(ps)是一个正在运行的虚拟机,仓库是存放镜像文件场所(dockerhub)。

tar文件类似于vm使用时的vmdk文件,可将一个镜像直接保存成一个tar文件,别人load重新加载成一个镜像,run起来成了一个虚拟机。

Dockfile是一个很短的配置文件,通过写“如何构建”的步骤来指定一个镜像如何构建的,通过docker build指令可将Dockfile构建成一个镜像。仓库保存了一些公有镜像如ubuntu镜像,nginx镜像,mysql镜像,tomcat镜像等。

ubuntu安装命令:sudo apt install docker.io,网站:play with docker。
docker run -d -p 80:80 nginx上面才会出现80端口,点击80端口跳转到nginx网页首页。
docker run -d -p 81:80 nginx指定外部81端口同理点击81跳转到nginx网页首页(nginx的默认端口是80)。


如下再次点击外部80端口。

如下暂时用不到81,容器里内容修改后要commit成新镜像m1,和pull下来的nginx镜像并列。

当前目录自己新增index.html(里面写着wai bu de wen jian)和Dockerfile两文件,将原来nginx里面index.html替换了,如下vi Dockerfile。


点击外部100号端口如下:上面为dockerfile build成一镜像run成为一容器。

2.save/load

docker save + 镜像id,不是容器id。docker rmi m2将m2镜像直接删除,提示有个容器基于这镜像无法删除,那将容器(container id)也删了。

删了容器还要删除镜像m2,docker load使m2镜像又从tar文件重新拿过来了。

如上行文件映射-v就是将一些静态文件放外面,在外面修改文件(因为是映射的)里面文件也会跟着变化。这个文件映射还会用于其他的一些数据保存,比如mysql的data目录也可以映射到外面,防止数据丢失。

3.docker-compose

组织一个多容器项目:宿主机(etho网卡)安装docker会生成一张docker网卡,docker网卡通过nat方式为每个容器分配ip。容器间同一网段可通过ip通信,容器和宿主机通信是通etho网卡转发路由过来(端口通信),通信方式主要是ip和端口进行通信。



如下curl…回车后打印出下面< html >…。以下就能获取nginx容器数据了,但这种方式需要登录一台机器查看ip,再登录另一台机器去配置这个ip,在实际生产中是不可行的。

3.1 link

以下为真正的生产过程中的通讯--link,先docker rm -f删除nginx和alpine两个容器,在alpine中ping myng(相当于域名)的话自动解析为myng的ip。

如下curl myng直接得到nginx的首页内容,浏览器将内容解析为界面。

3.2 docker-compose .yml

nginx需要到php中去解析,php需要到mysql中访问数据库,两个需要写link,且必须先创建mysql,再部署到其他机器重新输入整个指令麻烦。将这些指令记录到一个配置文件里统一配置,这就是docker-compose(需安装)。


网页会显示如下index.html文本字样。

创建test.php用来监测php是否运行成功。

如下phpinfo函数。




在外面创建的/root/html目录可以映射到nginx里面/usr/share/nginx/html如下,以.php结尾会走.php{}里。

如下简单说就是nginx.conf文件将外面.html和.php文件映射到nginx里面。


port就是-p参数,volumes就是-v参数,devilbox/…是dockerhub上搜索的。



如下是接着上面往后。

点击如下80端口。

访问根目录显示index.html,访问test.php中phpinfo()显示如下。

1.如下首先访问根目录即index.html,到nginx下读取/这个配置条件即会到/usr/share/nginx/html下读取,这个目录刚好映射到了外部的/root/html目录下,最后读取到了/root/html目录下的index.html返回。

2.怎么访问test.phptest.php也是进nginx匹配到了正则以php结尾,pass转发到php这台机器的9000号端口并且目录是/var/www/html,php这域名会解析到php容器ip,php容器的/var/www/html这个目录同样设置了映射到外部/root/html目录,返回test.php。

3.mysql.php同样到/root/html目录下mysql.php,mysql.php里会指定一条dbhost即数据库主机ip,主机ip指定的是mysql,在docker-compose中也配置了这个服务,根据mysql域名去解析刚好能解析到mysql的容器,到它的3306号端口,密码是123456,将登陆成功的消息返回回来。

4.Dockerfile

镜像像程序,容器像进程。

FROM:指定当前镜像基于哪个镜像,必填,一行就可以构建一个镜像。

WORKDIR:指定接下来shell语句运行在哪个路径下,如下alpine镜像下肯定没有/app这个目录,自动创建。

COPY:将当前宿主机文件拷贝到镜像中去。ADD和COPY相似,都是可以从外面复制到镜像里面,COPY一般源地址是文件系统源地址,ADD源地址不光是文件系统还可以是一个URL,如果没有用到网络资源,用COPY就行。

RUN:构建容器时运行这脚本,当前工作目录就是/app。

CMD:指定整个容器启动起来运行脚本,运行完后整个容器生命周期结束(tail -f 阻塞式)。ENTRYPOINT:和CMD一样指定容器启动起来的核心脚本,但既指定ENTRYPOINT又指定CMD,以哪个为准:ENTRYPOINT非json则以ENTRYPOINT为准,CMD无效。如果ENTRYPOINT和CMD都是json则ENTRYPOINT+CMD拼成一句shell。如下可以以json数组形式指定。

必须命名为Dockerfile。

如下指定镜像名test,最后的点表示dockfile文件位于当前目录下。

1.txt里面原本内容有123。

EXPOSE:指定当前镜像暴露出的一个端口,比如nginx镜像中指定EXPOSE暴露80端口。暴露好处是通过docker run -P将80端口映射到本机的随机端口,docker run --network=host模式的话会将80端口直接绑定到本机的80端口。


VOLUME:指定映射文件,VOLUME /a/b把容器中的/a/b这个目录映射到了宿主机的一个目录下。

4.1 ENV

指定参数方式:第一个是ENV直接指定当前容器的环境变量,环境变量可以在docker run中-e指定,也可以在Dockerfile中ENV直接指定,A=10和A空格10都一样。

第二个是ARG(本身就是参数意思),ENV和ARG有个本质区别:ENV是构建时一直到运行时都一直生效的环境变量,是系统的环境变量,ARG则是一个构建参数,只有在构建(docker build)时才有效,真正运行时无效了。


如下b=11默认为11,构建时指定。

4.2 LABEL

LABEL:对镜像没任何作用,只是标识,便于通过docker inspect指令找到这镜像

ONBUILD:接的参数可以是Dockerfile中其他任意参数

ONBUILD是当前镜像构建时候不会执行,基于当前镜像的镜像构建时候才会执行





以上是关于Docker1指令,docker-compose,Dockerfile的主要内容,如果未能解决你的问题,请参考以下文章

与 docker 1.7.0 一起使用的 docker-compose 的确切版本是啥?

docker-compose参数

docker和docker-compose命令学习

docker和docker-compose命令学习

Docker 1.10 通过主机名访问容器

docker-compose yml文件详解