标签:删除 并且 改变 bytes down stack address 展开 变量
[root@localhost _data]# docker volume inspect container-vl1 [ { "CreatedAt": "2020-03-05T13:13:24+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/container-vl1/_data", "Name": "container-vl1", "Options": {}, "Scope": "local" } ]
在用 docker run
命令的时候,使用 --mount
标记来将 数据卷
挂载到容器里。在一次 docker run
中可以挂载多个 数据卷
。
下面创建一个名为 web
的容器,并加载一个 数据卷
到容器的 /webapp
目录。
docker run -d --name web --mount source=container-vl1,target=/webapp training/webapp python app.py
[root@localhost ~]# docker run -d --name web --mount source=container-vl1,target=/webapp training/webapp python app.py [root@localhost ~]# docker exec -it -u root 6f8cd71ff589 /bin/bash root@6f8cd71ff589:/opt/webapp# cd /webapp/ root@6f8cd71ff589:/webapp# ls root@6f8cd71ff589:/webapp# mkdir test root@6f8cd71ff589:/webapp# la test [root@localhost ~]# cd /var/lib/docker/volumes/container-vl1/_data/ [root@localhost _data]# ls test
数据卷在OpenStack中可做日志目录,,删除容器,对数据卷中的依然存在。
$ docker volume rm my-vol
数据卷
是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷
,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷
。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v
这个命令。
无主的数据卷可能会占据很多空间,要清理请使用以下命令
$ docker volume prune
使用 --mount
标记可以指定挂载一个本地主机的目录到容器中去。
$ docker run -d -P \
--name web \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp \
python app.py
上面的命令加载主机的 /src/webapp
目录到容器的 /opt/webapp
目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,以前使用 -v
参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用 --mount
参数时如果本地目录不存在,Docker 会报错。
Docker 挂载主机目录的默认权限是 读写
,用户也可以通过增加 readonly
指定为 只读
。
$ docker run -d –p \
--name web \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py
加了 readonly
之后,就挂载为 只读
了。如果你在容器内 /opt/webapp
目录新建文件,会显示如下错误
/opt/webapp # touch new.txt
touch:new.txt:Read-only file system
docker run -d –p \
--name web2 \
-v /src/webapp:/opt/webapp,readonly \
training/webapp \
python app.py
--mount
标记也可以从主机挂载单个文件到容器中
$ docker run --rm -it \
--mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
ubuntu:18.04 \
bash
root@2affd44b4667:/# history
1 ls
2 diskutil list
这样就可以记录在容器输入过的命令了
Docker中有个非常重要的概念叫做——镜像(Image)。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
dockerfile编译一个镜像
docker build -t name:tag -f dockerfile的绝对路径 ./
(1)Dockerfile 编写的基本结构
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
(2)一台主机可以有多个Dockerfile
要使用多个Dockerfile 创建镜像,可以在不同目录编写Dockerfile,然后在Dockerfile 所在的目录下构建新的镜像;
注意:Dockerfile 中所包含的需要的内容;如COPY的文件、目录等,都需要在Dockerfile 同级目录下存在;
(3)docker build 基于dockerfile制作镜像的命令
① 格式:
docker build [OPTIONS] PATH | URL | -
② 选项:
· FROM
· MAINTAINER
· COPY
· ADD
· WORKDIR
· VOLUME
· EXPOSE
· ENV
· RUN
· CMD
· ENTRYPOINT
· HEALTHCHECK
· ONBUILD
· USER
· ARG
· SHELL
· STOPSIGNAL
格式
FROM <repository>[:<tag>]
或
FROM <repository>@<digest>
注:
如:
FROM busybox:latest
介绍
如:
MAINTAINER <authtor‘s detail>
# Description: test image
FROM busybox:latest
MAINTAINER "Along <along@along.com>"
介绍
格式
COPY <src>... <dest>
或
COPY ["<src>",... "<dest>"]
注:
文件复制准则
如:
COPY index.html /data/web/html/ #
要确保
dockerfile
同级路径下有
index.html
文件
使用build 制作镜像
格式
ADD <src> ..<dest>
或
ADD ["<src>".. "<dest>"]
ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/
ADD nginx-1.15.8.tar.gz /usr/local/src/
操作准则
介绍
为指令RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工作目录。类似于cd的意思
如:
WORKDIR /usr/local/
ADD nginx-1.15.8.tar.gz ./src/
运行容器后tar包解压到容器的/usr/local/src/目录下
介绍
在dockerfile中写入:
VOLUME /data/mysql
docker build -t busyboxhttpd:v0.5 ./
docker inspect -f {{.Mounts}} web1 [{volume b788b8a50d69953e2b086b3b54ba683154647319a481246cb7ab2ff927b21372
/var/lib/docker/volumes/b788b8a50d69953e2b086b3b54ba683154647319a481246cb7ab2ff927b21372/_data /data/mysql local true }]
b788b8a50d69953e2b086b3b54ba683154647319a481246cb7ab2ff927b21372这个卷就是运行容器后在本地新建的卷,映射到容器的/data/mysql目录。
VOLUME 删除容器的时候,所创建的volume一并删除。
介绍
用于为容器打开指定要监听的端口以实现与外部通信
注:
如:
EXPOSE 80/tcp
注:就算dockerfile 中有EXPOSE 指令暴露端口,但是不是真正的暴露;需要在启动容器时,使用-P 选项真正的暴露端口。
docker build -t busyboxhttpd:v0.6 ./
docker run --name web1 -P --rm -it busyboxhttpd:v0.6 /bin/httpd -f -h /data/web/html
docker inspect -f {{.NetworkSettings.IPAddress}} web1 #
查询容器的
IP
另打开一个终端,验证httpd
服务的
80
端口
[root@along ~]# curl 172.17.0.2:80
<h1>Busybox httpd server</h1>
---
在宿主机通过暴露的端口访问
httpd
服务
[root@along ~]# docker port web1
80/tcp
-> 0.0.0.0:32768
[root@along ~]# curl 127.0.0.1:32768
<h1>Busybox httpd server</h1>
介绍
注:
ENV DOC_ROOT=/data/web/html/ \
WEB_SERVER_PACKAGE="nginx-1.15.8"
COPY index.html ${DOC_ROOT}
介绍
语法
RUN <command>
或
RUN ["<executable>", "<param1>", "<param2>"]
一般用第一种写法
注:
如:
RUN cd
./src
&& \
tar
-xf ${WEB_SERVER_PACKAGE}
此次有变量替换推荐用第一种语法
介绍
语法
CMD <command>
或
CMD [“<executable>",“<param1>","<param2>"]
或
CMD ["<param1>","<param2>"]
注:
示例编写dockerfile文件
FROM busybox LABEL maintainer="Along <along@along.com>" app="httpd" ENV WEB_DOC_ROOT="/data/web/html" RUN mkdir -p ${WEB_DOC_ROOT} && echo "<h1>Busybox httpd server</h1>" > ${WEB_DOC_ROOT}/index.html CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
使用build 制作镜像
docker build -t busyboxhttpd:v1.1 ./
基于此新建镜像运行容器,进行验证,httpd正常运行
docker run --name web2 --rm -d busyboxhttpd:v1.1
curl 容器IP
介绍
语法
ENTRYPOINT <command>
ENTRYPOINT ["<executable>", "<param1>", "<param2>"]
注:
如:
CMD ["curl","-s","https://ip.cn"]
ENTRYPOINT ["curl","-s","https://ip.cn"]
当我们启动容器 docker run http:v1 -i 时 -i 参数会覆盖CMD指令后的["curl","-s","https://ip.cn"]
而对于ENTRYPOINT指令 -i就是新的 CMD
,因此会作为参数传给 curl
,["curl","-s","https://ip.cn","-i"]
标签:删除 并且 改变 bytes down stack address 展开 变量
原文地址:https://www.cnblogs.com/iyeqing/p/12420258.html