目录

一、容器相关

1、docker run centos

2、查看centos容器

3、删除退出的容器

4、两个危险的命令 docker image prune && docker system prune

5、查看容器实际的大小

6、docker cp

7、容器互联

8. docker 查看容器的资源使用状况

二、镜像相关

1、docker pull 拉取镜像

2、docker images或者docker image ls 查看镜像

3、docker tag“重命名”镜像

4、docker rmi或者docker image rm  删除镜像

5、docker container commit 构建镜像

6、docker image build

7、docker commit 和docker build的优劣势

8、镜像的实现原理

9、镜像文件的结果

三、docker架构的理解

四、网络相关

4.1 docker network ls

4.2 docker network inspect {networkid}

五、容器是如何挂载的?

nginx测试html挂载几种不同情况

如何解决空挂载问题呢?


多看看这个图,加深记忆!

一、容器相关

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

或者docker rm de7 ,默认删除的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.3kBroot@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

  1. 第一行表示我要基于 centos:7 这个镜像来构建自定义镜像。这里需要注意,每个 Dockerfile 的第一行除了注释都必须以 FROM 开头
  2. 第二行表示拷贝本地文件 nginx.repo 文件到容器内的 /etc/yum.repos.d 目录下。这里拷贝 nginx.repo 文件是为了添加 nginx 的安装源。
  3. 第三行表示在容器内运行yum install -y nginx命令,安装 nginx 服务到容器内,执行完第三行命令,容器内的 nginx 已经安装完成。
  4. 第四行声明容器内业务(nginx)使用 80 端口对外提供服务。
  5. 第五行定义容器启动时的环境变量 HOST=mynginx,容器启动后可以获取到环境变量 HOST 的值为 mynginx。
  6. 第六行定义容器的启动命令,命令格式为 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

原因: 

  1. Dockerfile 的命令是完全透明的,通过查看 Dockerfile 的内容,就可以知道镜像是如何一步步构建的;类似于开源的项目一样,内部代码实现都可以看得到,如果留有后门一定会被发现的,然而如果是基于别人生成的镜像构建自己的镜像就比较危险,但是常用软件的官方docker image还是信得过的.
  2. 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自动管理的这一部分区域

三种挂载方式:

  1. Volumes(卷) :存储在主机文件系统的一部分中,该文件系统由Docker管理(在Linux上是“ / var /lib / docker / volumes /”)。 非Docker进程不应修改文件系统的这一部分。 卷是在Docker中持久存储数据的最佳方法。
  2. Bind mounts(绑定挂载) 可以在任何地方 存储在主机系统上。 它们甚至可能是重要的系统文件或目录。 Docker主机或Docker容器上的非Docker进程可以随时对其进行修改。
  3. 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

docker 命令深入理解相关推荐

  1. docker 命令详细解释

    docker命令详解github地址:链接描述如果对你有帮助,请给我star下! 此次操作都是在unbantu17.01下进行,docker版本是17.10.0-ce,docker-compose是1 ...

  2. docker 构建上下文 理解

    目录 对 Docker 构建上下文的理解误区 理解 Docker 的架构 理解 docker build 的工作原理 正确理解 Docker 构建上下文 对 Docker 构建上下文的理解误区 我们都 ...

  3. docker命令大全

    1. 查看docker信息(version.info) # 查看docker版本   $docker version   # 显示docker系统的信息   $docker info   2.对ima ...

  4. shell执行docker命令卡挂住_Docker官方文档翻译4

    第四篇:Swarms 准备工作 安装Docker版本1.13或更高版本. 安装Docker compose. 安装docker machine 阅读第1 2 3部分的内容. 确保你已发布并推送到注册仓 ...

  5. Docker命令行探秘

    1. Docker命令行 Docker官方为了让用户快速了解Docker,提供了一个交互式教程,旨在帮助用户掌握Docker命令行的使用方法.但是由于Docker技术的快速发展,此交互式教程已经无法满 ...

  6. 深入浅出Docker(二):Docker命令行探秘

    本文原创版权归 infoq 肖德时 所有,此处为技术收藏,如有再转,请于篇头保留原创作者及出处,以示尊重! 作者: 肖德时 原文: http://www.infoq.com/cn/articles/d ...

  7. docker命令入门到精通这一篇就够了

    Docker命令使用 帮助命令 docker version # 显示docker的版本信息 docker info # 显示docker系统信息,包括镜像和容器的数量 docker 命令 --hel ...

  8. Docker命令及参数详解

    1. Docker命令行 Docker官方为了让用户快速了解Docker,提供了一个交互式教程,旨在帮助用户掌握Docker命令行的使用方法.但是由于Docker技术的快速发展,此交互式教程已经无法满 ...

  9. THREE DAY | 网络安全之Linux(包含Linux常用命令,镜像下载,docker命令等内容)超详细!!!

    THREE DAY | 网络安全之Linux 一.Linux介绍 1.Linux系统简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多 ...

最新文章

  1. leetcode342合理运用位操作判断4的幂
  2. 【必知】国内最设计感的 App推荐
  3. Longest Substring with At Most Two Distinct
  4. IDEA快捷键eclipse版(有自定义部分)
  5. unity fixedupdate_Unity之滚球游戏(上)
  6. cisco 基础配置命令中文解析 1
  7. Codeforces Round #223 (Div. 2): C. Sereja and Prefixes(二分+递归)
  8. 【一天一个C++小知识】013.std:map-不存在的key查找其value
  9. 华罗庚数学竞赛如何报名?
  10. 希捷移动硬盘打不开怎么办?
  11. 1873年2月1日 麦克斯韦《电磁通论》出版
  12. 奥克兰大学计算机专业好找工作吗,留学选择奥克兰大学的计算机专业肯定不会后悔...
  13. win10计算机网络共享打不开,win10系统网络和共享中心打不开的详细方案
  14. 阿里云服务器能抗ddos攻击吗
  15. TypeScript等无法获取到歌曲播放的位置信息时,关于歌曲的续播
  16. To invoke and to begin invoke, that is a question.
  17. 使用 AppFuse 的七个理由之二
  18. 使用串口调试助手发送16进制数
  19. 人类驯服原始OneNote经历(一)
  20. LCD1602 + TLC2543

热门文章

  1. Excel 技术篇 - 利用Match公式返回匹配的最后一个数据的索引
  2. 《微信小程序-进阶篇》package.json版本说明及各类版本符号详解(一)
  3. iOS中删掉字符串中的空白格
  4. PC企业微信登录提示版本过低怎么办?
  5. RTSP Spec中文版(12-16)
  6. 苹果关掉200m限制_iOS 13怎么解除移动数据下载限制 ios13解除超过200M限制一览
  7. bash 括号(小括号,双小括号,中括号,双中括号,大括号)
  8. 油烟净化器吱吱作响是什么原因?
  9. 元宇宙长什么样?推荐你看这 6 部影视与文学作品
  10. AD PCB实用常用快捷键总结