如何持久化docker中的环境变量
可以在这个镜像基础上,用Dockerfile构建一个早姿瞎配置好环境变量的陆空新镜像。
在Dockerfile里使用ENV指令,可以持久保存环境变量,当使用这个新镜像册大创建的容器时,ENV设置的环境变量就会生效了。
Docker(2)——构建镜像命令解析
Dockerfile 中包括 FROM 、 MAINTAINER 、 RUN 、 CMD 、 EXPOSE 、 ENV 、 ADD 、 COPY 、 ENTRYPOINT 、 VOLUME 、 USER 、 WORKDIR 、 ONBUILD 、 LABEL 等14个指令。
1.FROM
格式: FROM image 或 FROM image:tag
含义:Dockerfile中第一条指令必须是FROM指令,且在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。
docker17.05版本开始,dockerfile中允许使用多个FROM指令,主要是解决编译环境和运行环境分开的问题。
2.MAINTAINER
格式: MAINTAINER user_name user_email
含义:指定维护者信息,作者以及作者的邮箱地址
3.RUN
支持两种格式:
RUN command
RUN ["EXECUTABLE","PARAM1","PARAM2".....]
含义:前者在shell终端中运行命令, /bin/sh -c command ,例如: /bin/sh -c "echo hello" ;后者使用 exec 执行,指定其他运行终端使用 RUN["/bin/bash","-c","echo hello"] 。每条RUN指令将当前的镜像基础上执行指令,并提交为新的镜像,命令较长的时候可以使用 \ 来换行。
4.CMD
支持三种格式:
CMD ["executable","param1","param2"] ,使用exec执行,这是推荐的方式。
CMD command param1 param2 , 在 /bin/sh 中执行。
CMD ["param1","param2"] ,提供给 ENTERYPOINT 的凳虚默认参数。
含义: CMD 用于指定容器启动时执行的命令,每个 Dockerfile 只能有一个 CMD 命令,多个 CMD 命令只执行最后一个。若容器启动时指定了运行的命令,则会覆盖掉 CMD 中指定的命令。
5.EXPOSE
格式: EXPOSE port [port2,port3,...]
含义:例如 EXPOSE 80 这条指令告诉Docker服务器暴露80端口,供容器外部连接使用。在启动容器的使用使用-P,Docker会自动分配一个端口和转发指定的端口,使用-p可以具体指定使用哪个本地的端口来映射对外开放的端口。
6.ENV
格式: EVN key value
含义:用于指定环境变量,这些环境变量,后续可以被 RUN 指令使用,容器运行起来之后,也可以在容器中获取这些环境变量,例如:
ENV word hello
RUN echo $word
7.ADD
格式: ADD src dest
含义:该命令将复制指定本地目录中的文件到容器中的 dest 中, src 可以是是一个绝对路径,也可以是一个 URL 或一个 tar 文件, tar 文件会自枣樱燃动解压为目录。
8.COPY
格式为: COPY src desc
含义:复制本地颂瞎主机src目录或文件到容器的desc目录,desc不存在时会自动创建。
9.ENTRYPOINT
支持两种格式:
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1,param2
含义:后者会在shell中执行。用于配置容器启动后执行的命令,这些命令不能被 docker run 提供的参数覆盖。和 CMD 一样,每个Dockerfile中只能有一个 ENTRYPOINT ,当有多个时最后一个生效。
10.VOLUME
格式: VOLUME ["/data"]
含义:作用是创建在本地主机或其他容器可以挂载的数据卷,用来存放数据。
11.USER
格式: USER username
含义:指定容器运行时的用户名或UID,后续的RUN也会使用指定的用户。要临时使用管理员权限可以使用sudo。在USER命令之前可以使用RUN命令创建需要的用户。
例如: RUN groupadd -r docker useradd -r -g docker docker
12.WORKDIR
格式: WORKDIR /path
含义:为后续的 RUN CMD ENTRYPOINT 指定配置工作目录,可以使用多个 WORKDIR 指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。
13.ONBUILD
格式: ONBUILD [INSTRUCTION]
含义:该配置指定当所创建的镜像作为其他新建镜像的基础镜像时所执行的指令,例如下面的Dockerfile创建了镜像A:
ONBUILD ADD . /app
ONBUILD RUN python app.py
基于镜像A创建新的镜像时,新的Dockerfile中使用 from A 指定基镜像时,会自动执行 ONBBUILD 指令内容,等价于在新的要构建镜像的Dockerfile中增加了两条指令:
FROM A
ADD ./app
RUN python app.py
14.LABEL
格式: LABEL label_name="label_value"
含义:用来给镜像以键值对的形式添加一些元数据(metadata),如明镜像的作者、文档地址,commit ID。
windows server 离线安装docker
Stop-Service docker
Expand-Archive docker-19.03.3.zip -DestinationPath $Env:ProgramFiles -Force
Remove-Item -Force docker-19.03.3.zip
$null = Install-WindowsFeature containers
env:ProgramFiles\docker"
env:ProgramFiles\docker;" +
[Environment]::GetEnvironmentVariable("PATH",
[EnvironmentVariableTarget]::Machine)
[Environment]::SetEnvironmentVariable("PATH", $newPath,
[EnvironmentVariableTarget]::Machine)
dockerd --register-service
Start-Service docker
怎样获取docker容器的环境变量
ENV 设置环境变量 ENV ENV指令可以用于为docker容器设置环境变量 ENV设置的环境变量,可以使用 docker inspect命令来查看。闭弊同时还可以颤塌使用docker run --env =来修改环境变量。 Note: 环境变量的设置要合理,比如将轿洞族环境变量设置为非交互的 ENV DE...
env命令列出的环境变量存在哪些文件里
ENV 设置环境变量
ENV key蔽并value
ENV指令可以用宏消迹于为docker容器设置环境桥尘变量
ENV设置的环境变量,可以使用 docker inspect命令来查看。同时还可以使用docker run --env key=value来修改环境变量。
Note: 环境变量的设置要合理,比如将环境变量设置为非交互的 ENV DEBIAN_FRONTEND noninteractive.那再用这个来进行操作: docker run -t -i image bash
Docker:容器管理(启动参数,查看容器和日志,进入和修改容器)
摘要: Docker
容器是一个精简版的操作系统,一般一个容器只运行一个应用,容器通过镜像创建,使用 docker run 命令创建,容器起到了 隔离 作用,容器和容器之间独享空间和网络等
容器的基本操作包括创建(启动),停止,重启,查看,检查等,容器通过镜像创建,使用 docker run 命令创建,需要指定run参数,镜像名,容器执行命令,语句格式如下
在实际使用中启动一个镜像,例如
-e 设置环境变量,格式是 -e k1=v1 -e k2=v2 ,使得在docker镜像中的程序能够直接访问到环境变量,同时可以作为配置参数放在docker run启动镜像的时候设置,而不是写死在dockerfile在build的过程中,-e和dockerfile中的 ENV 变量作用相同,当变量重名时-e替换ENV,下面测试一些做带-e参数,在Dockerfile指定环境变量
直接构建成容器
开启一个终端启动容器内部,打告御印指定的环境变量a
此时在run指令中增加-e设置环境变量,可见-e替换了Dockerfile中指定的环境变量
因为一个镜像可以启动多个容器,所以可以通过设置不同-e达到设置不同配置参数的目的,比如下一个例子在Dockerfile中设置和将环境变量写入yaml文件再供Python调用,执行的内容为打印yaml配置文件的参数内容,比如下面这个例子先看下目录结构
其中config.yml是一个空配置文件,在run.sh中先使用echo写入追加配置参数到config.yml在执行Python脚本
Dockerfile中启动run.sh脚本作为容器执行命令
在启动容器时,使用-e指定环境变量,在run.sh中echo将环境变量拿到和写入配置文件,测试多次以不同的配置参数启动容器如下
-v 设置挂载运行,将宿主机当前目录下的文件挂载到容器中/home目录下,例如
如果挂载的目录和Dockerfile中的COPY的目录不一致, -v会替代COPY或者ADD ,例如现在Docker中COPY一个文件到容器/home目录下
同目录下start.sh内容是打印1
构建镜像结束后,指定-v启动,起始挂载另外一个目录,目录下start.sh内容是打印2
docker run参数中最后的COMMAND会覆盖Dockerfile中指定的 CMD ,例如执行echo 2替换原始Dockerfile中的CMD echo 1,输出结果是2且执行完毕后退出
对于Dockerfile中的 ENTRYPOINT 指定的启动命令docker run的COMMAND不会覆盖,如果要覆盖Docker中的ENTRYPOINT需要指定docker run中的 --entrypoint 参数,格式是
测试一个Dockerfile输出1
在docker run中使用--entrypoint覆盖Dockerfile中的ENTRYPOINT
容器启动后通过 docker ps 或者 docker container ls 查看容器,可以增加额外参数比如 -a 显示所有容器,默认只显示运行的容器,可以增加 --no-trunc 参数使得显示结果不截断,例如
显示结果分别显示了容器的ID,镜像,执行命令,创建时间,状态,端口映射(宿主机-容器)和容器名称。对于已经运行的容器可以使用 docker stop 停止,如果在docker run时增加--rm参数则停止的容器保留不会自动删除,例如
除了docker stop命令还有一种停止容器纯友芦的命令 docker kill ,相比于docker stop,docker kill是 强制立即停止 ,而docker stop是先给了容器10秒(默认)的时间,使得容器有一定的时间处理、保存程序执行现场, 优雅的退出程序 ,例如
在容器停止之后可以使用 docker start 再启动一个停止的容器,例如
除此之外可以使用 docker restart ,此时容器可以使停止的也可以是在运行中的,例如
查看容器详情使用 docker inspect ,比如
在以上截取的内容中展示了容器详情,包括容器id,创建时间,执行命令和参数,执行状态,容器pid,落脚点,环境变量,网络设置,端口映射等,也可以使用Go语言风格输出指定的详情,比如分别只看容器的pid和容器的执行命令
容器是一个操作系统,可以进入这个操作系统查看容器的运行情况,有多种方式进入容器,其中主要是使用 docker exec 进入容器,在一个运行中的容器中执行一个命令,使用 -it 并带有 /bin/bash 命令就可以进入容器,比如
除了/bin/bash也可以是其他命令挂载exec后面则可以直接对一个运行中的容器执行命令,比如查看容器的进入落脚点路径,容器中的内存情况
当容器以后台 -d 运行时,日志运行在容器内部,可以进入容器内部查看日志,也可以使用 docker logs 查看日志,以一个flask api接口的容器为例,日志写入文件,同时也会输出在flask的控制台
创建Dockerfile以及构建镜像,启动容器
启动一个脚本不断请求api接口
进入容器内部查看日志
另一种方式是直接使用 docker logs 命令,比如使用 -f 追踪输出,并且从最后的第1行开始输出
此时宿主机的logs目录下为空,容器中的logs目录下存在detail.log文件,如果使用 -v 将宿主机目录挂载到容器作为容器写入的目录,则容器中数据的变动会同步到本地,这样可以直接在本地查看日志,修改容器启动为 -v 挂载的形式
此时本地logs目录下开始产生日志,且这个日志和容器内的logs目录下一致
如果容器内的内容改变了,此时删除容器从镜像重新启动容器则改动的内容将不会存在,如果相对修改过的容器保留下来则可以从容器生成新的镜像,先测试以下容器内修改在删除的容器后将不再生效,在已有容器中使用pip安装Python包
此时退出容器,并且删除容器,最后从镜像重新生成容器
此时进入容器检查,并不存在pymongo包
如果要容器变化保存下来需要以这个新容器生成一个镜像,使用 docker commit ,语法如下
以新安装pymongo的容器为例,对新容器使用docker commmit
新生成的镜像叫做xiaogp/my_image_test:v2
从新镜像启动容器并进入容器查看存在新安装的pymongo