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.php?
test.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的主要内容,如果未能解决你的问题,请参考以下文章