四、docker的数据管理

4.1存储资源类型

用户在使用 Docker 的过程中,势必需要查看容器内应用产生的数据,或者需要将容器内数据进行备份,甚至多个容器之间进行数据共享,这必然会涉及到容器的数据管理:

  • Data Volume (数据卷)
  • Data Volume Dontainers --- 数据卷容器

docker 容器有两种方式 卷 和 绑定挂载 可将容器中的文件存储在宿主机的文件系统上,这样即使在容器停止之后这些文件也会被保留。如果你在Linux上运行Docker,你也可以使用tmpfs 挂载。

volume , bind 和 tmpfs 三者的相同点和区别

相同之处:
       无论您选择使用哪种类型去使用,数据在容器内看起来都是相同的。它被视为容器文件系统中的目录或单个文件。

不同之处:
       卷(volume)存储在于 由Docker管理 的主机文件系统的一部分中(在Linux上是:/var/lib/docker/volumes/)。非Docker进程不应该修改这部分文件系统。卷是在Docker中保留数据的最佳方式。

绑定挂载(bind mount) 也就是把主机的本地目录挂载到容器中某个挂载点。可以存储在主机系统的任何位置。他们甚至可能是重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程可以随时修改它们。
tmpfs挂载(tmpfs mount)仅存储在主机系统的内存中,而不会写入主机系统的文件系统。

4.2数据卷

1> Data Volume 有以下特点:
      a)Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。
      b)容器可以读写 volume 中的数据。
      c)volume 数据可以被永久的保存,即使使用它的容器已经销毁。
2> DataVolume的使用
  通过-v 参数格式为 :
  a)运行一个容器,并创建一个数据卷挂载到容器的目录上

# docker run -itd -v /web centos:6 /bin/bash

b)运行一个容器,本地创建/test目录,挂载到容器的/web目录上

# mkdir test
# docker run -itd -v /root/test:/web centos:6 /bin/bash 

映射本地目录到数据卷

在运行的容器内创建一个文件,然后再删除该容器,查看数据卷内数据是否存在。

4.3数据卷容器

数据卷容器Data Volume Dontainers
  如果用户需要在容器之间共享一些持续更新的数据,最简单的方法就是使用数据卷容器,其实数据卷容器就是一个普通的容器,只不过是专门用它提供数据卷供其他容器挂载使用。

Data Volume Dontainers使用:
a)创建一个名为 dbdata 的数据卷,并在其中创建一个数据卷挂载到 /test下

# docker run -it -v /root/test:/dbdata --name dbser centos:6

b)其他容器使用 --volumes-from命令去挂载dbdata数据卷

# docker run -itd --volumes-from dbser --name db1 centos:6
# docker run -itd --volumes-from dbser --name db2 centos:6

c)可以多次使用 --volumes-from 参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷:

# docker run -itd --name db3 --volumes-from db1 centos:6

注意:使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。
如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用 docker rm -v 命令来指定同时删除关联的容器。

数据卷容器应用:

创建一个容器专门运行rsyslog 收集日志, 其他应用程序将日志发送到该日志容器。

1、构 建 rsyslog 镜像
创建一个只运行 rsyslog 的镜像, Dockerfile 如下:

FROM centos6
MAINTAINER hxf
RUN yum -y install rsyslog && yum clean all
CMD rsyslogd -n
VOLUME /dev
VOLUME /var/log

执行下面的命令生成镜像:

# docker build -t hustcat/rsyslog . 

2、运行 rsyslog 容器

# docker run --name rsyslog -d -v /tmp/syslogdev:/dev husteat/rsyslog 

成功启动后, 我们在 Host 上可以看到 /tmp/syslogdev/log 的 Unix socket 文件

3、在其他容器写 log 到日志容器

# docker run --rm -v /tmp/syslogdev/log: /dev/log centos6 logger -p info "hello
rsyslog"

4.4 备份、 恢复和迁移数据卷

1、备份数据卷

我们可以通过参数 “--vokrnies-fmm ” 从数据卷挂载数据卷 , 然后备份数据卷中的数据, 例如:

# docker run volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf
/backup/backup.tar /dbdata 

创建一个新的容器, 将 Host 本地目录挂载到 /backup, 然后将数据卷容器dbdata 的数据卷(
/dbdata ) 打包到 /backup/backup.tar。 然后在 Host 的当前目录下就可以得到 backup.tar。

2、恢复数据卷

将备份的数据恢复到原有容器或者其他任何容器。 假设我们想把 backup.tar 的数据恢复到一个新的容器dbdata2:

# docker run -v /dbdata name dbdata2 ubuntu /bin/bash

然后执行下面的命令即可

# docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
/backup/backup.tar

五、端口映射与容器互联

5.1端口映射实现访问容器

5.1.1 从外部访问容器应用

在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的。

当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-p或-P参数来指定端口映射。当使用-P(大写P)标记时,Docker会随机映射一个端口到内部容器开放的网络端口(端口范围在Linux系统使用的端口之外,一般都过万):

[root@docker ~]# docker run -d --name nginx_1 -P nginx:latest[root@docker ~]# docker ps
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS  NAMES
f769af3e9847  nginx:latest   "nginx -g 'daemon ..."  3 seconds ago  Up 2
seconds   0.0.0.0:32768->80/tcp nginx_1

通过docker ps可以看到nginx_1容器的80端口被映射到本机的32768端口上。访问宿主主机的32768端口就可以访问容器内的应用程序提供的Web界面:

同样,可以通过docker logs命令查看应用信息:

[root@docker ~]# docker logs nginx_1

-p(小写p)可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。支持的格式有:IP:HostPort:ContainerPort | IP::ContainerPort | HostPort:ContainerPort 。

5.1.2 映射所有接口地址

使用HostPort:ContainerPort格式将本地的5000端口映射到容器的5000端口:

[root@docker ~]# docker run -itd -p 5000:5000 --name nginx_2 nginx:latest[root@docker ~]# docker ps
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS  NAMES
5bdca2bde33d  nginx:latest   "nginx -g 'daemon ..."  8 seconds ago  Up 7
seconds   80/tcp, 0.0.0.0:5000->5000/tcp nginx_2
f769af3e9847  nginx:latest   "nginx -g 'daemon ..."  15 minutes ago  Up 15
minutes   0.0.0.0:32768->80/tcp   nginx_1

此时默认会绑定本地所有接口上的所有地址。多次使用-p参数可以绑定多个端口:

[root@docker ~]# docker run -itd -p 3000:2700 -p 2389:8863 --name nginx_3
nginx:latest[root@docker ~]# docker ps
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS  NAMES
65fbfbe9761e  nginx:latest   "nginx -g 'daemon ..."  3 seconds ago  Up 2
seconds   80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp nginx_3
5bdca2bde33d  nginx:latest   "nginx -g 'daemon ..."  2 minutes ago  Up 2
minutes   80/tcp, 0.0.0.0:5000->5000/tcp       nginx_2
f769af3e9847  nginx:latest   "nginx -g 'daemon ..."  18 minutes ago  Up 18
minutes   0.0.0.0:32768->80/tcp         nginx_1

5.1.3 映射到指定地址的指定端口

可以使用IP:HostPort:ContainerPort格式指定映射使用一个特定地址:

[root@docker ~]# docker run -itd -p 10.0.0.31:89:8081 --name nginx_4
nginx:latest[root@docker ~]# docker ps
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS  NAMES
16a476837222  nginx:latest   "nginx -g 'daemon ..."  4 seconds ago  Up 3
seconds   80/tcp, 10.0.0.31:89->8081/tcp       nginx_4
65fbfbe9761e  nginx:latest   "nginx -g 'daemon ..."  2 minutes ago  Up 2
minutes   80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp nginx_3
5bdca2bde33d  nginx:latest   "nginx -g 'daemon ..."  5 minutes ago  Up 5
minutes   80/tcp, 0.0.0.0:5000->5000/tcp       nginx_2
f769af3e9847  nginx:latest   "nginx -g 'daemon ..."  20 minutes ago  Up 20
minutes   0.0.0.0:32768->80/tcp         nginx_1

5.1.4 映射到指定地址的任意端口

使用IP::ContainerPort格式绑定本机的任意端口到容器的指定端口:

[root@docker ~]# docker run -itd -p 10.0.0.31::8082 --name nginx_5 nginx:latest[root@docker ~]# docker ps
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS  NAMES
3436fd5fbdca  nginx:latest   "nginx -g 'daemon ..."  2 seconds ago  Up 2
seconds   80/tcp, 10.0.0.31:32769->8082/tcp      nginx_5
16a476837222  nginx:latest   "nginx -g 'daemon ..."  2 minutes ago  Up 2
minutes   80/tcp, 10.0.0.31:89->8081/tcp       nginx_4
65fbfbe9761e  nginx:latest   "nginx -g 'daemon ..."  4 minutes ago  Up 4
minutes   80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp nginx_3
5bdca2bde33d  nginx:latest   "nginx -g 'daemon ..."  7 minutes ago  Up 7
minutes   80/tcp, 0.0.0.0:5000->5000/tcp       nginx_2
f769af3e9847  nginx:latest   "nginx -g 'daemon ..."  22 minutes ago  Up 22
minutes   0.0.0.0:32768->80/tcp         nginx_1

容器启动后,本机会随机自动分配一个未被占用的端口。

5.1.5 查看映射端口配置

使用docker port命令来查看当前映射的端口配置,也可以查看绑定的地址

[root@docker ~]# docker port nginx_1
80/tcp -> 0.0.0.0:32768
[root@docker ~]# docker port nginx_2
5000/tcp -> 0.0.0.0:5000
[root@docker ~]# docker port nginx_3
2700/tcp -> 0.0.0.0:3000
8863/tcp -> 0.0.0.0:2389
[root@docker ~]# docker port nginx_4
8081/tcp -> 10.0.0.31:89
[root@docker ~]# docker port nginx_5
8082/tcp -> 10.0.0.31:32769

注意:
容器有自己的内部网络和IP地址,使用docker inspect +容器ID可以获取容器的具体信息。

5.2 互联机制实现便捷访问

容器的互联是一种让多个容器中应用进行快速交互的方式,它会在源和接收容器之间建立连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。

5.2.1 自定义容器命名

连接系统依据容器的名称来执行。因此,首先要给容器定义一个简单好记的名字。在容器创建的时候,系统会随机创建一个容器名,但是并没有特殊的意义也不便于记忆,所有自定义容器名有一下亮点好处:
1.自定义的命名比较好记,比如一个Web应用容器,就可以起名web,既方便记忆也方便理解容器的作用;
2.当要连接其他容器时,即使重启,也可以使用自定义的容器名,,比如web容器连接到db容器。

使用--name参数可以为容器自定义命名:

[root@docker ~]# docker run -itd --name centos_1 centos:latest[root@docker ~]# docker psCONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS  NAMES
4d58a9f6f324  centos:latest   "/bin/bash"    6 seconds ago  Up 5 secondscentos_1

通过docker ps或者docker ps -a可以查看到容器的自定义名字,利用docker inspect也可以获取到容器自定义名字:

[root@docker ~]# docker inspect -f "{{.Name}}" 4d58a9f6f324
/centos_1

注意:
容器的名称是唯一的。如果已经命名了一个web的容器,当再次使用web这个命名的时候会报错,如果一定要使用,需要先用docker rm删除之前创建的web容器。
在执行docker run的时候如果添加--rm参数,则容器终止后会立刻删除。--rm参数和-d参数不能同时使用。

5.2.2 容器互联

使用--link参数可以让容器之间安全地进行交互。
创建一个数据库容器:

[root@docker ~]# docker run -itd --name db --env MYSQL_ROOT_PASSWORD=example
mariadb[root@docker ~]# docker ps
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS  NAMES
b239b124946c  mariadb    "docker-entrypoint..."  3 seconds ago  Up 2
seconds   3306/tcp   db

创建一个web容器并将它连接到db容器:

[root@docker ~]# docker run -itd -P --name web --link db:db nginx:latest[root@docker ~]# docker ps
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS  NAMES
86ef0f632ffe  nginx:latest   "nginx -g 'daemon ..."  44 seconds ago  Up 43
seconds   80/tcp    web
b239b124946c  mariadb    "docker-entrypoint..." About a minute ago Up 59
seconds   3306/tcp   db

此时web容器已经和db容器建立互联关系:--link参数的格式为:--link name:alias,其中name是要连接的容器名称,alias是这个连接的别名。
Docker相当于在两个互联的容器之间创建了一个虚拟通道,而不用映射它们的端口到宿主机上。在启动db容器的时候并没有使用-p或者-P参数,从而避免了暴露数据库服务端口到外部网络上。

Docker通过两种方式为容器公开连接信息:

1.更新环境变量;
2.更新/etc/hosts文件。
使用env命令来查看web容器的环境变量:

[root@docker ~]# docker run --rm --name web3 --link db:db nginx:latest env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=7258de738125
DB_PORT=tcp://192.168.159.2:3306
DB_PORT_3306_TCP=tcp://192.168.159.2:3306
DB_PORT_3306_TCP_ADDR=192.168.159.2
DB_PORT_3306_TCP_PORT=3306
DB_PORT_3306_TCP_PROTO=tcp
DB_NAME=/web3/db
DB_ENV_MYSQL_ROOT_PASSWORD=example
DB_ENV_GOSU_VERSION=1.10
DB_ENV_GPG_KEYS=199369E5404BD5FC7D2FE43BCBCB082A1BB943DB
430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A
4D1BB29D63D98E422B2113B19334A25F8507EFA5
DB_ENV_MARIADB_MAJOR=10.2
DB_ENV_MARIADB_VERSION=10.2.11+maria~jessie
NGINX_VERSION=1.13.7-1~stretch
NJS_VERSION=1.13.7.0.1.15-1~stretch
HOME=/root

其中DB_开头的环境变量是提供web容器连接db容器使用的,前缀采用大写的连接别名。
除了环境变量之外,Docker还添加host信息到父容器的/etc/hosts文件。

[root@docker ~]# docker run -it --rm --link db:db nginx:latest /bin/bash
root@16b8e6fde27f:/# cat /etc/hosts
172.17.0.2 db b239b124946c
172.17.0.5 16b8e6fde27f
root@16b8e6fde27f:/#

这里有两个hosts信息,第一个是db容器的IP和容器名+容器ID,第二个是web自己的IP和容器ID,web容器中hosts文件采用容器的ID作为主机名。
互联的容器之间是可以ping通的。

六、镜像制作

6.1 Docker中的镜像分层

Docker 支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base镜像中安装和配置需要的软件构建出来的。

1、Docker 镜像为什么分层

镜像分层最大的一个好处就是共享资源。

比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是不会被修改的,修改只会被限制在单个容器内。这就是容器 Copy-on-Write 特性。

2、可写的容器层

当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

3、容器层的细节说明

镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。

文件操作 说明
添加文件 在容器中创建文件时,新文件被添加在容器层中。
读取文件

在容器中读取某个文件时,docker会从上往下依次在各进行层中查找此文件。

一旦找到,立即将其复制到容器层,然后打开并读入内存

修改文件

在容器中修改已存在的文件时,docker会从上往下依次在各镜像层中查找此文件

一旦找到,立即将其复制到容器层,然后修改之

删除文件 在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。(只是记录删除操作)

只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。
       这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。

6.1 镜像制作

6.2.1 镜像的生成途径

  • 基于容器制作
  • dockerfile,docker build

  本章主要详细讲解基于容器制作镜像;基于dockerfile 制作镜像在下一张文章Dockerfile 详解中详细介绍;

6.2.2 基于容器制作

docker commit

(1)格式

`Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]`

2)Options 参数

  • -a,作者(例如,“along along@along.com”)
  • -c,修改Dockerfile指令应用于创建的镜像
  • -m,提交消息
  • -p,在提交期间暂停容器(默认为true)

(3)示例1:简单的基于容器创建一个新的镜像

① 先运行一个容器

[root@localhost ~]# docker run --name b1 -it busybox
/ # ls /
bin  dev  etc  home proc root sys  tmp  usr  var
/ # mkdir -p /date/html
/ # echo "<h1>busybox httpd server</h1>" > /date/html/index.html
/ # cat /date/html/index.html
<h1>busybox httpd server</h1>

② 不用退出这个容器,另起终端在b1容器基础上,制作新镜像

[root@localhost ~]# docker commit -p b1
sha256:3a6523b08bea7eb339ae04cc8a98caabfd46fbd27ccf31409cc3e8a764effdc1
[root@localhost ~]# docker image ls
REPOSITORY        TAG         IMAGE ID      CREATED    SIZE
<none>          <none>       bf29b97ba38d     7 seconds ago 1.15 MB

③ 给新制作的镜像打标签

[root@localhost ~]# docker tag bf29b97ba38d along/httpd:v0.1
[root@localhost ~]# docker image ls
REPOSITORY        TAG         IMAGE ID      CREATED    SIZE
along/httpd       v0.1        bf29b97ba38d     39 seconds ago1.15 MB

④ 可以对同一个镜像,再打标签

[root@localhost ~]# docker tag along/httpd:v0.1 along/httpd:latest
[root@localhost ~]# docker image ls
REPOSITORY        TAG         IMAGE ID      CREATED    SIZE
along/httpd       latest       bf29b97ba38d    About a minute
ago  1.15 MB
along/httpd       v0.1        bf29b97ba38d    About a minute
ago  1.15 MB

⑤ 删除同一镜像的标签,只是把这个镜像的标签去掉,只到删除这个镜像的最后一个标签,此镜像才会被删除

[root@localhost ~]# docker image rmi along/httpd:latest
Untagged: along/httpd:latest
[root@localhost ~]# docker image ls
REPOSITORY        TAG         IMAGE ID      CREATED    SIZE
along/httpd       v0.1        bf29b97ba38d    About a minute
ago  1.15 MB

⑥ 基于新的镜像运行一个容器,验证是否是基于b1创建成功的

[root@localhost ~]# docker run --name b2 -it along/httpd:v0.1
/ # cat /date/html/index.html
<h1>busybox httpd server</h1>
/ # exit

(4)示例2:基于容器创建新的镜像,并修改执行命令CMD

① 基于容器b1创建新的镜像,并修改命令为执行httpd服务

[root@localhost ~]# docker commit -a "Along <along@along.com>" -c 'CMD
["/bin/httpd","-f","-h","/date/html"]' -p b1 along/httpd:v0.2

注解:busybox 中httpd 语法

  • -f:不运行为守护进程,在前台运行
  • -h:指定httpd运行的主目录

② 运行新的镜像v0.2

[root@localhost ~]# docker run --name b3 -d along/httpd:v0.2

③ 验证成功

[root@localhost ~]# docker inspect b3 |grep "IPAddress""SecondaryIPAddresses": null,"IPAddress": "192.168.159.3","IPAddress": "192.168.159.3"
[root@localhost ~]# curl 192.168.159.3
<h1>busybox httpd server</h1>

6.2.3 使用 export 和 import

1.查看本机的容器
这两个命令是通过容器来导入、导出镜像。首先我们使用 docker ps -a 命令查看本机所有的容器。

2.导出镜像
(1)使用 docker export 命令根据容器 ID 将镜像导出成一个文件。

# docker export f299f501774c > hangger_server.tar

2)上面命令执行后,可以看到文件已经保存到当前的 docker 终端目录下。

3.导入镜像

(1)使用 docker import 命令则可将这个镜像文件导入进来。

# docker import - new_hangger_server < hangger_server.tar

(2)执行 docker images 命令可以看到镜像确实已经导入进来了。

6.2.4 使用 save 和 load

1.查看本机的容器
这两个命令是通过镜像来保存、加载镜像文件的。首先我们使用 docker images 命令查看本机所有的镜像。

2.保存镜像

(1)下面使用 docker save 命令根据 ID 将镜像保存成一个文件。

# docker save 0fdf2b4c26d3 > hangge_server.tar

(2)我们还可以同时将多个 image 打包成一个文件,比如下面将镜像库中的 postgres 和 mongo 打包:

# docker save -o images.tar postgres:9.6 mongo:3.4

3.载入镜像

使用 docker load 命令则可将这个镜像文件载入进来。

# docker load < hangge_server.tar

两种方案的差别:
特别注意:两种方法不可混用。
如果使用 import 导入 save 产生的文件,虽然导入不提示错误,但是启动容器时会提示失败,会出现类似"docker: Error response from daemon: Container command not found or does not
exist"的错误。

1.文件大小不同
export 导出的镜像文件体积小于 save 保存的镜像

2.是否可以对镜像重命名

  • docker import 可以为镜像指定新名称
  • docker load 不能对载入的镜像重命名

3.是否可以同时将多个镜像打包到一个文件中

  • docker export 不支持
  • docker save 支持

4.是否包含镜像历史

  • export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数
  • 据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
  • 而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

5.应用场景不同

  • docker export 的应用场景:

主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容
器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把
这个镜像分发给其他人使用,比如作为基础的开发环境。

  • docker save 的应用场景:

如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,
但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,
然后拷贝到客户服务器上使用 docker load 载入。

docker之基础命令相关操作下相关推荐

  1. docker镜像简介和docker常用基础命令

    docker镜像简介和docker常用基础命令 文章目录 docker镜像简介和docker常用基础命令 1:docker镜像概述 1.1:什么是docker镜像 1.2:docker镜像的获取方式 ...

  2. 【Linux实验】LINUX基础命令综合操作

    实验目的: 巩固掌握LINUX下相关基础命令的操作. 实验内容: (1)用pwd命令查看当前所在目录 (2)使用ls命令以详细列表方式查看当前目录的信息 (3)使用man命令获取less命令的帮助信息 ...

  3. linux基础命令行操作【1】

    目录 1.基本命令 2.文件相关知识 3.文本相关操作 4.文件解压.压缩.打包命令 1.基本命令 Ctrl+A/t+Fn+F6:管理Linux(Fn+数字) Linux:输入密码是不显示 Alt+F ...

  4. Docker镜像基础命令

    Docker镜像基础命令 给root用户设置密码 Sudo -s à passwd root à su 更新apt的镜像源地址:阿里云 https://opsx.alibaba.com/mirror ...

  5. CentOS 8配置 yum/dnf 镜像源 | 安装 Docker | DockerCompose | SimpleDocker 及其相关操作

    Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容 ...

  6. 什么是docker及docker的基础命令

    文章目录 1. 简介 1.1 特性 1.2 组件 1.3 版本 2. 安装部署 2.1 安装说明 2.2 centos7安装 2.3 Debian&Ubuntu 3. 运行docker 3. ...

  7. Docker的基础命令

    Doker的基础命令: docker 123456789101112131415161718192021222324252627282930313233343536373839404142434445 ...

  8. DockerKubernetes ❀ Docker镜像与容器相关操作基础命令详解

    文章目录 1.Docker信息查询 1.1 版本信息 1.2 详细信息 1.3 帮助命令 2.镜像命令 2.1 本地镜像查看 2.2 镜像搜索 2.3 镜像拉取 2.4 镜像删除 3.容器命令 3.1 ...

  9. 『学了就忘系列』Linux基础命令 — 搜索操作相关命令

    1.whereis命令 whereis是搜索系统命令的命令,也就是说,whereis命令不能搜索普通文件,而只能搜索系统命令. whereis命令的基本信息如下: 命令名称:whereis 英文原意: ...

  10. linux登录pg数据库命令,postgreSql基础命令及linux下postgreSql命令

    (1)用户实用程序: createdb 创建一个新的Postgresql的数据库(和sql语句:CREATE DATABASE 相同) createuser 创建一个新的Postgresql的用户(和 ...

最新文章

  1. Silverlight中使用CompositionInitializer宿主MEF
  2. Visual Studio 压力测试注意点
  3. 两个php的build文件,PHP编译安装中遇到的两个错误和解决方法
  4. 属于服务器端运行的程序_Telerik UI for ASP.NET MVC:为任何设备以两倍的速度构建功能丰富且响应迅速的web应用程序...
  5. react组件生命周期_React组件生命周期-挂钩/方法介绍
  6. 【转】【MySQL】运行原理(四):重做日志(redo log),回滚日志(undo log),二进制日志(binlog)
  7. 也许现在的前端,应该了解更多的算法
  8. python大文件去重_python大ip文件排重
  9. 14.PHP vld 扩展
  10. ADB连接手机遇到的问题:list of devices attached
  11. jvm内存模型、jvm内存结构、Java内存结构、Java内存模型(JMM)、Java对象模型的区别(吐血研究整理)
  12. 辛弃疾 菩萨蛮·书江西造口壁
  13. ES--highlight(高亮)查询
  14. Abbyy FineReader PDF转word不乱码
  15. 通过maven打nar报错问题
  16. 电脑运行速度(卡不卡)的决定因素
  17. 电源管理允许此设备唤醒计算机怎么关掉,允许计算机关闭此设备以节省电量灰色 | MOS86...
  18. 英语学习的几个实用网站
  19. 使用Pr时输出设备没有声音问题
  20. 三国合肥会战\孙仲谋二战张文远\张辽威震逍遥津\张辽八百骑打破孙仲谋

热门文章

  1. seaborn—sns.scatterplot绘制散点图
  2. numpy-np.random.choice
  3. transformer李宏毅讲解视频及decoder讲解
  4. C typedef---运用实例
  5. 游戏设计情境探秘之动画
  6. 对搜狐、网易和TOM三大门户网站的SQL注入漏洞检测
  7. 2天玩转单反相机引领时尚娱乐新生活
  8. 人生就是一次Presentation
  9. 每个人心中都有一片极乐净土
  10. 《我也能做CTO之程序员职业规划》之十五:智商