Loading

Docker学习-Dockerfile相关

docker是啥:

类似虚拟机一样,有单独的接口管理,可以将要运行的服务放到一个单独的环境中,主机只需要对docker的端口和资源进行管理即可。以一个我实际操作的项目为例:

image-20230714091329621

红色为主机,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
posted @ 2024-09-19 14:12  绯色鱼  阅读(9)  评论(0)    收藏  举报