Docker学习-Dockerfile相关
docker是啥:
类似虚拟机一样,有单独的接口管理,可以将要运行的服务放到一个单独的环境中,主机只需要对docker的端口和资源进行管理即可。以一个我实际操作的项目为例:
红色为主机,docker运行在主机上,docker里面可以单独配置容器存放我们需要运行的程序,如果容器内服务运行在8000端口,可以对docker的这个容器配置将此容器的8000转接到主机的7001,只需要将主机的7001端口开放,外界便可以访问了。我们以右上和右下两个绿色块对比,右下块运行在主机需要对主机环境进行配置,而右上只需要挂起一个ubuntu容器,在里面单独配一套环境即可,这样不会环境冲突【服务a需要软件b的2.0版本,服务c需要软件b的3.0版本,此时主机配环境会发生冲突。】
下载安装自行度娘
怎么用:
①在你需要挂载的项目中写一个dockerfile,无后缀,具体怎么写看后面基础用法以及你自己的需求。
②挂载镜像:docker build -t 镜像名字:版本 .
注意后面有个空格和点,举例:docker build -t project_img:1.0 . 【我要启一个镜像,它叫project_img,版本我自定义为1.0】
③镜像转容器:docker run -it -d -p 8008:8000 --name project project_img:1.0 【将1.0版本的镜像project_img运行起来,启动后,容器内8000关联主机8008端口,容器名字叫project】
常用命令
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
如果没有基础镜像,用
FROM scratch
否则例如
FROM java:8
不加冒号默认latest
MAINTAINER <name>
# 声明作者
LABEL
# 前期无用
ADD <src>... <dest>
文件-》文件
ADD ["<src>",... "<dest>"]
多个文件-》目录
例如
ADD test relativeDir/
ADD test /relativeDir
ADD http://example.com/foobar /
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
只能弄本地文件,其他和ADD无差
EXPOSE <post>/<tcp/udp>
功能为暴漏容器运行时的监听端口给外部
但是EXPOSE并不会使容器访问主机的端口
ENV <key> <value>
设置一个环境变量
ENV <key>=<value> ...
设置多个环境变量
$varname
${varname}
${varname:-default value}
$(varname:+default value}
第一种和第二种相同
第三种表示当变量不存在使用-号后面的值
第四种表示当变量存在时使用+号后面的值(当然不存在也是使用后面的值)
RUN <command>
RUN ["executable", "param1", "param2"]
第一种后边直接跟shell命令
在linux操作系统上默认 /bin/sh -c
在windows操作系统上默认 cmd /S /C
第二种是类似于函数调用
可将executable理解成为可执行文件,后面就是两个参数。
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
功能为容器启动时默认命令或参数
举例
CMD [ "sh", "-c", "echo $HOME"
CMD [ "echo", "$HOME" ]
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
放在最后,能只会执行最后一个,类似一直挂起的东西
VOLUME ["/data"]
挂载主机的某个目录到docker下
举例:
VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /var/db
WORKDIR /path/to/workdir
设置工作目录,类似cd
举例
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
结果:/a/b/c
组合玩法
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
结果:/path/$DIRNAME
进阶用法以后学
一些使用的小tip
1 如果日志没有添加限制,一些程序实时跑日志会导致程序越来越大,此时如何清理
进入容器所处存储位置,运行以下命令即可
cat /dev/null > *-json.log
2 正常进入容器命令是docker exec -it xxx bash
进入容器后只能使用终端命令,如果安装npm之类,npm命令无法使用,需要手动添加npm路径
# docker内使用nvm
echo "source ~/.nvm/nvm.sh" >> ~/.bashrc && source ~/.bashrc
3 一些命令要求只能在子用户,root用户无法执行
sudo useradd tt
sudo passwd tt
sudo mkdir /home/tt
sudo usermod -s /bin/bash tt
sudo usermod -d /home/tt tt

浙公网安备 33010602011771号