多看看这个图,加深记忆!
一、容器相关
1、docker run centos
首次运行如果本地没有该base image,则会从远端clone一个base images。
[root@MiWiFi-R3L-srv ~]# docker run centos Unable to find image 'centos:latest' locally latest: Pulling from library/centos 3c72a8ed6814: Pull complete Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd Status: Downloaded newer image for centos:latest [root@MiWiFi-R3L-srv ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 0d120b6ccaa8 2 months ago 215MB hello-world latest bf756fb1ae65 10 months ago 13.3kB [root@MiWiFi-R3L-srv ~]# docker run centos [root@MiWiFi-R3L-srv ~]#
docker run centos 执行完之后centos对应的/bin/bash 就退出了。
交互式的docker run
- -i, --interactive Keep STDIN open even if not attached
- -t, --tty Allocate a pseudo-TTY
- --name 指定container的名字
[root@MiWiFi-R3L-srv ~]# docker run -it centos [root@de7d5f1cad4e /]# ls -l total 0 lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin drwxr-xr-x. 5 root root 360 Nov 3 14:23 dev drwxr-xr-x. 1 root root 66 Nov 3 14:23 etc drwxr-xr-x. 2 root root 6 May 11 2019 home lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64 drwx------. 2 root root 6 Aug 9 21:40 lost+found drwxr-xr-x. 2 root root 6 May 11 2019 media drwxr-xr-x. 2 root root 6 May 11 2019 mnt drwxr-xr-x. 2 root root 6 May 11 2019 opt dr-xr-xr-x. 308 root root 0 Nov 3 14:23 proc dr-xr-x---. 2 root root 162 Aug 9 21:40 root drwxr-xr-x. 11 root root 163 Aug 9 21:40 run lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 May 11 2019 srv dr-xr-xr-x. 13 root root 0 Oct 29 14:24 sys drwxrwxrwt. 7 root root 145 Aug 9 21:40 tmp drwxr-xr-x. 12 root root 144 Aug 9 21:40 usr drwxr-xr-x. 20 root root 262 Aug 9 21:40 var [root@de7d5f1cad4e /]#
此时使用docker container ls 可以看到正在运行的image
2、查看centos容器
[root@MiWiFi-R3L-srv ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@MiWiFi-R3L-srv ~]# [root@MiWiFi-R3L-srv ~]# [root@MiWiFi-R3L-srv ~]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7af01d5e9dda centos "/bin/bash" 13 seconds ago Exited (0) 12 seconds ago happy_sinoussi 9514cf1bd842 centos "/bin/bash" 52 seconds ago Exited (0) 51 seconds ago sweet_curie 0edb374d25bb hello-world "/hello" 24 hours ago Exited (0) 24 hours ago bold_burnell
3、删除退出的容器
docker container的命令列表,使用rm
root@MiWiFi-R3L-srv ~]# docker container
注意不要加上参数 i 就是 删除image。
docker rmi {id}
如何批量删除已经退出的container?
[root@MiWiFi-R3L-srv ~]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 922dd27b0faf centos "/bin/bash" 10 seconds ago Exited (0) 9 seconds ago mystifying_khorana af024051dd04 centos "/bin/bash" 13 seconds ago Exited (0) 12 seconds ago inspiring_mendeleev 3c91318afd1e centos "/bin/bash" 16 seconds ago Exited (0) 15 seconds ago modest_johnson 7af01d5e9dda centos "/bin/bash" 21 minutes ago Exited (0) 21 minutes ago happy_sinoussi 9514cf1bd842 centos "/bin/bash" 21 minutes ago Exited (0) 21 minutes ago sweet_curie 0edb374d25bb hello-world "/hello" 24 hours ago Exited (0) 24 hours ago bold_burnell
使用-q参数列出containerId
root@MiWiFi-R3L-srv ~]# docker container ls -aq 922dd27b0faf af024051dd04 3c91318afd1e 7af01d5e9dda 9514cf1bd842 0edb374d25bb
如果你会使用awk,不使用这个参数完全可以,请看:
[root@MiWiFi-R3L-srv ~]# docker container ls -a|grep -v CONTAINER|awk '{print $1}' 922dd27b0faf af024051dd04 3c91318afd1e 7af01d5e9dda 9514cf1bd842 0edb374d25bb
删除所有已经退出的container,世界清静了。
[root@MiWiFi-R3L-srv ~]# docker rm $(docker container ls -aq) 922dd27b0faf af024051dd04 3c91318afd1e 7af01d5e9dda 9514cf1bd842 0edb374d25bb [root@MiWiFi-R3L-srv ~]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@MiWiFi-R3L-srv ~]#
这样把正在run的container也干掉了,显然是不行的。例如这样如何只干掉Exited的container呢?
-f 过滤状态,当然shell也可以实现
root@MiWiFi-R3L-srv ~]# docker container ls -f "status=exited" CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e03dda244d80 centos "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago jolly_euclid 590c5bd090d7 centos "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago sweet_hertz 707300b53120 centos "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago pedantic_liskov dbf30d595e76 centos "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago goofy_leakey [root@MiWiFi-R3L-srv ~]# docker container ls -f "status=exited" -q e03dda244d80 590c5bd090d7 707300b53120 dbf30d595e76
docker rm -f $(docker ps -aq) 强制删除所有容器
4、两个危险的命令 docker image prune && docker system prune
- docker image prune -af 仅仅清除没有被容器使用的镜像文件
- docker system prune -f 清除多余的数据,包括停止的容器、多余的镜像、未被使用的volume等等
5、查看容器实际的大小
docker ps -s CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE e06dcb6e2ecc busybox "/bin/sh -c 'while t…" 34 hours ago Up 34 hours vibrant_diffie 0B (virtual 1.24MB)
size:用于每个容器的可写层的数据量(在磁盘上)。
virtual size:容器使用的用于只读图像数据的数据量加上容器的可写图层大小。
多个容器可以共享部分或全部只读图像数据。
从同一图像开始的两个容器共享100%的只读数据,而具有不同图像的两个容器(具有相同的层)共享这些公共
层。 因此,不能只对虚拟大小进行总计。这高估了总磁盘使用量,可能是一笔不小的数目。
6、docker cp
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- :把容器里面的复制出来
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH:把外部的复制进去
SRC_PATH 指定为一个文件
- DEST_PATH 不存在:文件名为 DEST_PATH ,内容为SRC的内容
- DEST_PATH 不存在并且以 / 结尾:报错
- DEST_PATH 存在并且是文件:目标文件内容被替换为SRC_PATH的文件内容。
- DEST_PATH 存在并且是目录:文件复制到目录内,文件名为SRC_PATH指定的名字
SRC_PATH 指定为一个目录
- DEST_PATH 不存在: DEST_PATH 创建文件夹,复制源文件夹内的所有内容
- DEST_PATH 存在是文件:报错
- DEST_PATH 存在是目录
- SRC_PATH 不以 /. 结束:源文件夹复制到目标里面
- SRC_PATH 以 /. 结束:源文件夹里面的内容复制到目标里面
自动创建文件夹不会做递归。把父文件夹做好
~]# docker cp index.html mynginx4:/usr/share/nginx/html
~]# docker cp mynginx4:/etc/nginx/nginx.conf nginx.conf
7、容器互联
场景:我们无需暴露mysql的情况下,让web应用使用mysql;
--link name:alias ,name连接容器的名称,alias连接的别名
docker run -d -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 docker run -d --link mysql01:mysql --name tomcat tomcat:7 docker exec -it tomcat bash cat /etc/hosts ping mysql
8. docker 查看容器的资源使用状况
docker stats
二、镜像相关
镜像是一个只读的 Docker 容器模板,包含启动容器所需要的所有文件系统结构和内容。简单来讲,镜像是一个特殊的文件系统,它提供了容器运行时所需的程序、软件库、资源、配置等静态数据。即镜像不包含任何动态数据,镜像内容在构建后不会被改变。
镜像的操作
从图中可知,镜像的操作可分为:
- 拉取镜像,使用docker pull命令拉取远程仓库的镜像到本地 ;
- 重命名镜像,使用docker tag命令“重命名”镜像 ;
- 查看镜像,使用docker image ls或docker images命令查看本地已经存在的镜像 ;
- 删除镜像,使用docker rmi命令删除无用镜像 ;
- 构建镜像,构建镜像有两种方式。第一种方式是使用docker build命令基于 Dockerfile 构建镜像,也是我比较推荐的镜像构建方式;第二种方式是使用docker commit命令基于已经运行的容器提交为镜像。
docker中有一个base image,例如centos、ubuntu、nginx、python.... 这些都是熟知的有名的docker 镜像,当你基于某个base image生成了container,想把它变成一个自己的base image,如何做?
1、docker pull 拉取镜像
$ docker pull busybox Using default tag: latest latest: Pulling from library/busybox 61c5ed1cbdf8: Pull complete Digest: sha256:4f47c01fa91355af2865ac10fef5bf6ec9c7f42ad2321377c21e844427972977 Status: Downloaded newer image for busybox:latest docker.io/library/busybox:latest
实际上执行docker pull busybox命令,都是先从本地搜索,如果本地搜索不到busybox镜像则从 Docker Hub 下载镜像。
2、docker images或者docker image ls 查看镜像
3、docker tag“重命名”镜像
什么时候用?
如果你想要自定义镜像名称或者推送镜像到其他镜像仓库.
可以看到,镜像列表中多了一个mybusybox的镜像。但细心的同学可能已经发现,busybox和mybusybox这两个镜像的 IMAGE ID 是完全一样的。
为什么呢?实际上它们指向了同一个镜像文件,只是别名不同而已。
4、docker rmi或者docker image rm 删除镜像
5、docker container commit 构建镜像
docker commit。可理解为是基于一个改变了的container生成image。
例如我本地clone的image没有vim,进入容器中 docker run -it centos
安装vim后container commit成一个新的镜像
root@MiWiFi-R3L-srv ~]# docker run -it centos [root@7bbfd1dbf6b0 /]# [root@7bbfd1dbf6b0 /]# [root@7bbfd1dbf6b0 /]# vim bash: vim: command not found [root@7bbfd1dbf6b0 /]# yum install -y vim Failed to set locale, defaulting to C.UTF-8 CentOS-8 - AppStream 1.0 MB/s | 5.8 MB 00:05 CentOS-8 - Base 1.2 MB/s | 2.2 MB 00:01 CentOS-8 - Extras 8.2 kB/s | 8.1 kB 00:00 Dependencies resolved. ========================================================================================================================================================================================================== Package Architecture Version Repository Size ========================================================================================================================================================================================================== Installing: vim-enhanced x86_64 2:8.0.1763-13.el8 AppStream 1.4 M Installing dependencies: root@MiWiFi-R3L-srv ~]# docker run -it centos [root@7bbfd1dbf6b0 /]# [root@7bbfd1dbf6b0 /]# [root@7bbfd1dbf6b0 /]# vim bash: vim: command not found [root@7bbfd1dbf6b0 /]# yum install -y vim Failed to set locale, defaulting to C.UTF-8 CentOS-8 - AppStream 1.0 MB/s | 5.8 MB 00:05 CentOS-8 - Base 1.2 MB/s | 2.2 MB 00:01 CentOS-8 - Extras 8.2 kB/s | 8.1 kB 00:00 Dependencies resolved. ========================================================================================================================================================================================================== Package Architecture Version Repository Size ========================================================================================================================================================================================================== Installing: vim-enhanced x86_64 2:8.0.1763-13.el8 AppStream 1.4 M Installing dependencies: ..... Installed: gpm-libs-1.20.7-15.el8.x86_64 vim-common-2:8.0.1763-13.el8.x86_64 vim-enhanced-2:8.0.1763-13.el8.x86_64 vim-filesystem-2:8.0.1763-13.el8.noarch which-2.21-12.el8.x86_64 Complete!
现在这个container 已经基于base image 增加了一层。
[root@MiWiFi-R3L-srv ~]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7bbfd1dbf6b0 centos "/bin/bash" 5 minutes ago Exited (0) 5 seconds ago naughty_bohr
执行docker commit
~]# docker commit naughty_bohr ninesun0318/centos-vim sha256:e429c2ad99ac9aef24b05b83294d523e2c1e329a4797b336cc695236ea258d5d
查看新生产的image
其大小比base image大一些
[root@MiWiFi-R3L-srv ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE ninesun0318/centos-vim latest e429c2ad99ac 36 seconds ago 272MB centos latest 0d120b6ccaa8 2 months ago 215MB hello-world latest bf756fb1ae65 10 months ago 13.3kB
其实他们共享了很多layer,用这张图脑补一下。
可以比较一下两个image。 重叠的层是三层,我们只是在base image上安装vim。
[root@MiWiFi-R3L-srv ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE ninesun0318/centos-vim latest e429c2ad99ac 36 seconds ago 272MB centos latest 0d120b6ccaa8 2 months ago 215MB hello-world latest bf756fb1ae65 10 months ago 13.3kB root@MiWiFi-R3L-srv ~]# docker history 0d120b6ccaa8 IMAGE CREATED CREATED BY SIZE COMMENT 0d120b6ccaa8 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 2 months ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB [root@MiWiFi-R3L-srv ~]# [root@MiWiFi-R3L-srv ~]# [root@MiWiFi-R3L-srv ~]# docker history e429c2ad99ac IMAGE CREATED CREATED BY SIZE COMMENT e429c2ad99ac 3 minutes ago /bin/bash 57.2MB 0d120b6ccaa8 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 2 months ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB
方式二:
6、docker image build
可简写为docker bulid,这种方式是最重要也是最常用的镜像构建方式:Dockerfile。Dockerfile 是一个包含了用户所有构建命令的文本。通过docker build命令可以从 Dockerfile 生成镜像。
先删除刚才通过docker commit创建的image,然后通过dockerfile 创建image
~]# docker image rm e429c2ad99ac Untagged: ninesun0318/centos-vim:latest Deleted: sha256:e429c2ad99ac9aef24b05b83294d523e2c1e329a4797b336cc695236ea258d5d Deleted: sha256:67d1903314845339b44999096e0d3a92e0319cfd1834a446560f050aa2a90beb [root@MiWiFi-R3L-srv ~]# [root@MiWiFi-R3L-srv ~]# [root@MiWiFi-R3L-srv ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 0d120b6ccaa8 2 months ago 215MB hello-world latest bf756fb1ae65 10 months ago 13.3kB
编写dockerfile文件
FROM 后面跟base image
RUN 后面跟要执行的命令
@MiWiFi-R3L-srv centos-vim]# more Dockerfile FROM centos RUN yum install -y vim
docker build -t ninesun0318/centos-vim-new .
-t 指定imagename
. 代表当前目录
[root@MiWiFi-R3L-srv centos-vim]# docker build ninesun0318/centos-vim-new . "docker build" requires exactly 1 argument. See 'docker build --help'. Usage: docker build [OPTIONS] PATH | URL | - Build an image from a Dockerfile [root@MiWiFi-R3L-srv centos-vim]# docker build -t ninesun0318/centos-vim-new . Sending build context to Docker daemon 2.048kB Step 1/2 : FROM centos ---> 0d120b6ccaa8 Step 2/2 : RUN yum install -y vim ---> Running in 66b68ccc08c6 CentOS-8 - AppStream 1.5 MB/s | 5.8 MB 00:03 CentOS-8 - Base 61 kB/s | 2.2 MB 00:37 CentOS-8 - Extras 6.3 kB/s | 8.1 kB 00:01 。。。。。。 Complete! Removing intermediate container 66b68ccc08c6 ---> 23cad8f7275a Successfully built 23cad8f7275a Successfully tagged ninesun0318/centos-vim-new:latest [root@MiWiFi-R3L-srv centos-vim]# more Dockerfile FROM centos RUN yum install -y vim [root@MiWiFi-R3L-srv centos-vim]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE ninesun0318/centos-vim-new latest 23cad8f7275a 2 minutes ago 272MB centos latest 0d120b6ccaa8 2 months ago 215MB hello-world latest bf756fb1ae65 10 months ago 13.3kB
再看一个例子:
FROM centos:7 COPY nginx.repo /etc/yum.repos.d/nginx.repo RUN yum install -y nginx EXPOSE 80 ENV HOST=mynginx CMD ["nginx","-g","daemon off;"]
逐行分析一下上述的 Dockerfile
- 第一行表示我要基于 centos:7 这个镜像来构建自定义镜像。这里需要注意,每个 Dockerfile 的第一行除了注释都必须以 FROM 开头。
- 第二行表示拷贝本地文件 nginx.repo 文件到容器内的 /etc/yum.repos.d 目录下。这里拷贝 nginx.repo 文件是为了添加 nginx 的安装源。
- 第三行表示在容器内运行yum install -y nginx命令,安装 nginx 服务到容器内,执行完第三行命令,容器内的 nginx 已经安装完成。
- 第四行声明容器内业务(nginx)使用 80 端口对外提供服务。
- 第五行定义容器启动时的环境变量 HOST=mynginx,容器启动后可以获取到环境变量 HOST 的值为 mynginx。
- 第六行定义容器的启动命令,命令格式为 json 数组。这里设置了容器的启动命令为 nginx ,并且添加了 nginx 的启动参数 -g 'daemon off;' ,使得 nginx 以前台的方式启动。
7、docker commit 和docker build的优劣势
首先说明 docker commit 这种方式创建image不受欢迎,为什么呢?
如果有人使坏,把不该安装的软件打包在新的images,例如我docker commit一个安装监控程序的image。然后有人拉取之后就可能存在被监控的风险。因此大家clone 比人的镜像时要注意。
唯一能看到的就是这个image的构建历史。可以使用 docker history 命令查看镜像构建历史.
最好使用docker image build
原因:
- Dockerfile 的命令是完全透明的,通过查看 Dockerfile 的内容,就可以知道镜像是如何一步步构建的;类似于开源的项目一样,内部代码实现都可以看得到,如果留有后门一定会被发现的,然而如果是基于别人生成的镜像构建自己的镜像就比较危险,但是常用软件的官方docker image还是信得过的.
- Dockerfile 是纯文本的,方便跟随代码一起存放在代码仓库并做版本管理。
8、镜像的实现原理
Docker 镜像是由一系列镜像层(layer)组成的,每一层代表了镜像构建过程中的一次提交。下面以一个镜像构建的 Dockerfile 来说明镜像是如何分层的。
第一行基于 busybox 创建一个镜像层;
第二行拷贝本机 test 文件到镜像内;
第三行在 /tmp 文件夹下创建一个目录 testdir。
实验:
提示本地没有 test这个文件
在当前目录创建该文件.
有一个问题就是:base image 是read only的,那我们如何对这个base image进行写操作呢(此处的写操作代表run instal vim)?
从docker build的log来看
先基于base image docker run了一个临时的container,安装结束后dock rm了这个container。
- Running in 66b68ccc08c6
- Removing intermediate container 66b68ccc08c6
9、镜像文件的结果
我的 Docker 使用的是 overlay2 文件驱动(这部分涉及docker的文件系统),进入到/var/lib/docker/overlay2目录下使用tree .命令查看产生的镜像文件:
分层的结构使得 Docker 镜像非常轻量,每一层根据镜像的内容都有一个唯一的 ID 值,当不同的镜像之间有相同的镜像层时,便可以实现不同的镜像之间共享镜像层的效果。注意镜像层共享是 Docker 默认的机制,无需设置。所以docker 镜像非常轻量级. 深入理解docker 一定会帮助你理解linux 的设计精髓.
三、docker架构的理解
Docker 是一个C/S架构的程序,Docker客户端向Docker的服务端(Docker daemon) 发出请求,服务端处理完请求并返回结果。
Docker daemon: 运行在宿主机上,Docker的守护进程,用户通过 docker 命令与Docker daemon交互。
Docker client: Docker命令行工具,是用户管理运维Docker的主要方式,Docker client向Docker daemon发出请求,Docker daemon将结果返回给用户,Docker client也可以通过socket或者RESTful api访问Docker daemon。
image:镜像本质上是一个文件系统及其参数配置的组合。Docker 会把应用程序及依赖打包进镜像里,提供了容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等),通过这个镜像文件可生成 Docker 容器。一个镜像可以运行一个或者多个容器,镜像可以通过Dockerfile创建,也可以从Docker hub/registry上下载。
container:容器是从镜像创建的应用运行实例,启动一个镜像就是一个容器,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。
registry: 仓库,共享和管理Docker镜像的地方,用户可以上传或者下载上面的镜像,官方地址为 https://registry.hub.docker.com/,各个公司也可以搭建私有Docker registry,可参考
镜像就相当于打包好的代码,镜像启动之后运行在容器中,仓库就是装存储镜像的地方。
从官方网站上拷贝另一种图,介绍Docker Engine 纬度的架构。清晰的介绍server/client交互,容器和镜像、数据之间的一些联系。
四、网络相关
4.1 docker network ls
[root@iZ2vceej7yes1abpm7yec2Z ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 71d80d66fb2a bridge bridge local f598127068c2 host host local 72b31044e6dc none null local
4.2 docker network inspect {networkid}
[root@iZ2vceej7yes1abpm7yec2Z ~]# docker network inspect 71d80d66fb2a [ { "Name": "bridge", "Id": "71d80d66fb2a09d5914944ae9f2680d01b646fda7587459eb33d6f88baa8f8f6", "Created": "2020-11-12T16:36:00.84520899+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "4209ba002f3df2779455981caebca34c2316ff33c3a23d5b96cbb1c7d46befde": { "Name": "gallant_ramanujan", "EndpointID": "71c5f117cb873858e4a812d30bc818805473ecc689c43acbbbc63e9131662b24", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" }, "51ea3cd11968aca93d47c7f05196170fcb48f9bb8edeaca8a2724ecff8da951d": { "Name": "test2", "EndpointID": "68df151e913982921e62e9bfce53b24ae2747e3d818559f87f94f04ef0f9490d", "MacAddress": "02:42:ac:11:00:04", "IPv4Address": "172.17.0.4/16", "IPv6Address": "" }, "5ec232785650ae40d6e711dc8e3e1e5e653231d67e324e048de15ec0b649011a": { "Name": "djapp1", "EndpointID": "ee58cab72ff088023275afe8e34727b4891446a4b0b5fa79549c8205878568aa", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ]
五、容器是如何挂载的?
每一个容器里面的内容,支持三种挂载方式:
1)、docker自动在外部创建文件夹自动挂载容器内部指定的文件夹内容【Dockerfile VOLUME指令的作
用】
2)、自己在外部创建文件夹,手动挂载
3)、可以把数据挂载到内存中。
-v 可以自动挂载,到linux'主机或者docker自动管理的这一部分区域
三种挂载方式:
- Volumes(卷) :存储在主机文件系统的一部分中,该文件系统由Docker管理(在Linux上是“ / var /lib / docker / volumes /”)。 非Docker进程不应修改文件系统的这一部分。 卷是在Docker中持久存储数据的最佳方法。
- Bind mounts(绑定挂载) 可以在任何地方 存储在主机系统上。 它们甚至可能是重要的系统文件或目录。 Docker主机或Docker容器上的非Docker进程可以随时对其进行修改。
- tmpfs mounts(临时挂载) 仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统
nginx测试html挂载几种不同情况
1、不挂载
docker run -dP
效果:访问默认欢迎页
2、绑定挂载(空挂载)
dokcer run -dP -v /root/html:/usr/share/nginx/html
效果:访问forbidden
外部目录覆盖内部容器目录内容,但不是修改。所以谨慎,外部空文件夹挂载方式也会导
致容器内部是空文件夹
docker inspect 查看如下:
3、卷挂载
具名卷:
docker run -dP -v html:/usr/share/nginx/html:ro
效果:访问默认欢迎页
docker inspect 查看如下:
匿名卷 :(什么都不写也不要加冒号,直接写容器内的目录)
docker run -dP -v /usr/share/nginx/html
效果:访问默认欢迎页
docker inspect 查看如下:
关于匿名卷其实docker帮我们做了创建以及将卷绑定内容目录的过程
1、先在docker底层创建一个你指定名字的卷(具名卷) html
2、把这个卷和容器内部目录绑定
docker create volume nginxhtml 如果给卷里面进行修改,容器内部的也就改了。
具体可以使用 docker volume inspect volumename查看
3、容器启动以后,目录里面的内容就在卷里面存着;
如何解决空挂载问题呢?
1、提前准备好东西 目录nginxconf,目录里面的配置we年都放里面,,再调用命令
2、docker cp nginxdemo:/etc/nginx /root/nginxconf #注意/的使用
3、docker run -d -P -v /root/nginxconf:/etc/nginx/ -v /root/nginxhtml:/usr/share/nginx/html --name=nginx999 nginx