GVKun编程网logo

3、docker 容器管理(docker容器管理平台)

10

在本文中,我们将为您详细介绍3、docker容器管理的相关知识,并且为您解答关于docker容器管理平台的疑问,此外,我们还会提供一些关于003.Docker容器管理、3.docker容器管理、3、D

在本文中,我们将为您详细介绍3、docker 容器管理的相关知识,并且为您解答关于docker容器管理平台的疑问,此外,我们还会提供一些关于003.Docker 容器管理、3.docker容器管理、3、Docker容器管理、3、Docker镜像管理基础的有用信息。

本文目录一览:

3、docker 容器管理(docker容器管理平台)

3、docker 容器管理(docker容器管理平台)

Docker 容器相对于 OpenStack 的云主机实例,虽然他们本质上不同。我们需要基于镜像来创建容器。容器是独立运行的一个或一组应用,以及它们的运行环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统和跑在上面的应用。

启动容器

启动容器其实就是创建镜像并启动,启动镜像有两种方式,一种是将已经存在,但是是 stopped 状态的镜像启动,一种就是基于一个镜像新建一个新的容器并启动。

新建并启动容器

让我们先老生常谈,输出一个 Hello World 吧。

[root@linux-node1 ~]# docker run centos /bin/echo ''Hello world''

Hello world

很神奇,可以在精通各种语言的 Hello World 计数器 + 1 了,这个和你在本地系统运行 /bin/echo ‘Hello world’ 几乎没有任何区别,但是它是 Docker 容器输出的,而且输出后,它就完成使命,自动退出了。

注意:这里就是我们学习 Docker 要面临的第一个疑惑,就是容器只会在前台运行一个任务,任务结束,容器就终止了。

使用 docker ps –a 可以查看当前启动的容器:

[root@linux-node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
789de67bb454 centos "/bin/echo ''Hello wor" 30 seconds ago Exited (0) 29 seconds
ago pedantic_kare

刚接触 Docker 到这里还会有第二个疑惑:

Docker 自动帮你生成了一个名字,比如本例中是 pedantic_kare。

很困惑?好吧,让我们来启动一个我们自定义名称,同时可以有终端的容器,就像启动一个虚拟机一样,不过只是像而已,它们本质上完全不同。

[root@linux-node1 ~]# docker run --name mydocker -t -i centos /bin/bash
[root@1b0cae722fa0 /]#
[root@1b0cae722fa0 /]# ls /

anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root
run sbin srv sys tmp usr var

上面我们使用了两个选项,-t 选项让 Docker 分配一个伪终端并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。

在交互模式下,用户可以通过所创建的终端来输入命令,例如我们可以查看当前运行的进程,只有 /bin/bash 和你运行的命令,注意看 /bin/bash 的 PID 为 1,有意思。先记着这个特殊的地方,随着我们深入学习,再回过头来研究它。

[root@1b0cae722fa0 /]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.1 11776 1872 ? Ss 15:30 0:00 /bin/bash
root 18 0.0 0.0 47424 1660 ? R+ 15:31 0:00 ps aux

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公共仓库下载;

  • 利用镜像创建并启动一个容器;

  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层;

  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;

  • 从地址池配置一个 ip 地址给容器;

  • 执行用户指定的应用程序;

  • 执行完毕后容器被终止。

让我们输入 exit 来退出这个容器,退出后,容器会自动终止运行。为什么呢?请参考我们第一个疑惑,Docker 容器在前台运行一个单任务,任务结束,容器就终止。这就是 Docker 容器的特性!同时你有没有注意到一个小细节,默认 docker 容器的主机名就是 CONTAINER ID。

让容器容器后台运行

在使用 docker run 运行容器更多时候,我们是需要容器在后台运行的,也就是以守护态形式运行。可以通过 - d 参数来实现。

[root@linux-node1 ~]# docker run -d --name mydocker2 centos /bin/bash
38e42accfa2226bb6c7da2e28e12dc95f6b6d6717326442131887a24bb321cdd

容器启动后就会在后台运行,然后返回一个容器 ID 到控制台,而且上面这个容器也终止了,带着问题继续前进。

终止容器

在前面的输出 Hello World 的操作中我们看到了,当 Docker 容器中指定的应用程序运行完毕,容器也就自动终止了。同时我们可以使用 exit 命令退出运行 /bin/bash 的终端,同时我们也可以使用 Ctrl+d 来实现同样的效果。

使用 docker stop 来停止一个容器,默认是先给容器发送 SIGTERM 信号,然后 10 秒后发生 SIGKILL 信号终止容器,可以使用 - t 或者 —time 来设置等待的时间,单位是秒

docker stop 容器名称、容器 ID

对于终止的容器,可以使用 docker start 来启动,或者使用 docker restart 来重启。

[root@bc419cd0b8fa /]# exit
Exit

可以使用 docker ps –a 来查看容器的状态,发现已经是停止模式。

[root@linux-node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38e42accfa22 centos "/bin/bash" 17 seconds ago Exited (0) 16 seconds ago
mydocker2
a5ef57e8783f centos "/bin/bash" 3 minutes ago Exited (0) About a minute ago
mydocker
d132d6e645ad centos "/bin/echo ''Hello wo…" 3 minutes ago Exited (0) 3 minutes
ago serene_dijkstra

启动已终止容器

可以使用 docker start 来开启已经终止的容器,可以通过输入容器的 CONTAINER ID,或者 NAMES 来进行启动。

[root@linux-node1 ~]# docker start mydocker
mydocker

好的,我们又一次启动了运行 /bin/bash 的容器,那么问题来了,我们怎么进去呢。

进入容器

Docker attach

Docker 提供了 docker attach 的命令,用来让我们进入已经启动的容器(如果容器已经终止,你需要使用 docker start 将它启动。

[root@linux-node1 ~]# docker attach mydocker
[root@a5ef57e8783f /]#

你可以继续执行一些命令,没错,很多命令都没有。

注意,在我们使用 attach 进入容器的时候,如果同时有多个窗口 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。这可怎么办,如果我们是团队作战,可能多个同事需要同时进入容器操作呢?还有一个最关键的问题。你输入 exit 以后呢?之前运行的容器退出了。

nsenter 进入容器

nsenter 命令被包含在 util-linux 软件包里面,使用 nsenter 可以访问另一个进程的名字空间,大多数 Linux 发行版默认包含了该软件,CentOS 默认是有的。如果你的系统里面没有可以使用以下命令进行安装:

Yum 安装:

[root@docker ~]# yum install -y util-linux

为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。

# docker inspect --format "{{ .State.Pid }}" <container ID or NAMES>

通过这个 PID,就可以连接到这个容器:

# nsenter --target $PID --mount --uts --ipc --net –pid

如果你刚才停止了容器,请启动。

连接方式如下:

[root@linux-node1 ~]# PID=$(docker inspect --format "{{ .State.Pid }}"
mydocker)
[root@linux-node1 ~]# echo $PID
8029

注意如果你的 PID 变量为 0,说明 mydocker 容器没有启动。

[root@linux-node1 ~]# nsenter --target $PID --mount --uts --ipc --net --pid
[root@a5ef57e8783f /]# ps -ef

UID PID PPID C STIME TTY TIME CMD

root 1 0 0 21:11 pts/0 00:00:00 /bin/bash

root 14 0 0 21:12 pts/0 00:00:00 -bash

root 27 14 0 21:12 pts/0 00:00:00 ps -ef

编写一个脚本用户进入容器

[root@linux-node1 ~]# vim docker_in.sh
#!/bin/bash
# Use nsenter to access docker
docker_in(){
NAME_ID=$1
PID=$(docker inspect --format "{{ .State.Pid }}" $NAME_ID)
nsenter --target $PID --mount --uts --ipc --net --pid
}
docker_in $1
[root@linux-node1 ~]# chmod +x docker_in.sh

这么后面的内容,我们就直接使用 docker_in.sh 这个脚本来进入 Docker 容器,只要传给它名称或者容器 ID 即可,就像下面这样:

[root@linux-node1 ~]# ./docker_in.sh mydocker

不进入容器执行命令

或许你的本意不是想进去容器,而是想让容器执行一个命令,docker 提供了 exec,使用 exec 可以在容器内运行命令。

[root@linux-node1 ~]# docker exec mydocker whoami
root

使用 exec 进入容器

[root@linux-node1 ~]# docker exec -it mydocker /bin/bash

注意,现在你进入容器和其它方法都是不一样的,其实是你执行了一个 /bin/bash 的命令,所以你现在拥有了一个 shell,你现在所在的 shell 应该是下图中 PID 为 33 的进程。

[root@1b0cae722fa0 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 15:37 ? 00:00:00 /bin/bash
root 33 0 0 15:41 ? 00:00:00 /bin/bash
root 46 33 0 15:41 ? 00:00:00 ps -ef

或许你也发现使用 docker exec、nsenter 进入容器后,执行 exit 退出容器,容器并不会关闭。但是使用 docker attach 进入容器,输入 exit 退出容器后,容器也会自动终止。你可以想想为什么。因为除了 attach,nsenter 和 exec 实际中都是开了一个新的 shell 在执行。而 attach 是使用容器本身启动的 /bin/bash,这个 shell 环境退出了。那么容器就自动退出了。所以 Docker 的魔咒来了:docker 容器只能而且必须在前台运行一个进程,如果进程退出,容器就关闭。当然如果你想在 Docker 容器中启动多进程也是有办法的,我们后面会讲到。

删除容器

可以使用 docker rm 来删除一个处于终止状态的容器。 例如

[root@docker ~]# docker rm mydocker

如果要删除一个运行中的容器,可以添加 - f 参数。Docker 会发送 SIGKILL 信号给容器。

学习中的小技巧

如果你在学习和测试的过程中,经常因为启动非常多的容易想删除也很难,下面列举了几个小技巧,可以快速的帮我们进行容器的清理。

容器停止后就自动删除:

docker run --rm centos /bin/echo "One"

杀死所有正在运行的容器:

docker kill $(docker ps -a -q)

删除所有已经停止的容器:

docker rm $(docker ps -a -q)

删除所有未打 dangling 标签的镜像

docker rmi $(docker images -q -f dangling=true)

删除所有镜像

docker rmi $(docker images -q)

如果你觉得名称很长,不容易记,还可以为这些命令创建别名。

杀死所有正在运行的容器.

alias dockerkill=''docker kill $(docker ps -a -q)''

删除所有已经停止的容器.

alias dockerclean=''docker rm $(docker ps -a -q)''

删除所有未打标签的镜像.

alias dockercleani=''docker rmi $(docker images -q -f dangling=true)''

删除所有已经停止的容器和未打标签的镜像.

alias dockerclean=''dockercleanc || true && dockercleani''

注意:生产环境一定要慎用!!!

003.Docker 容器管理

003.Docker 容器管理

一 docer 运行应用

1.1 常见容器运行

  1 root@docker:~# docker				#查看docker相关命令
  2 root@docker:~# docker run -d -p 80:80 httpd         #从docker hub下载httpd镜像,启动httpd容器,并将容器的80端口映射到宿主机的80端口
  3 root@docker:~# docker run centos:7 echo "hello world"
  4 hello world
 
docker 容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。
  1 root@docker:~# docker ps			#查看运行的容器情况
参数说明:
  • CONTAINER ID: 容器 ID
  • NAMES: 自动分配的容器名称
  1 root@docker:~# docker logs 634cf027ad85	#查看容器内的标准输出
  2 root@docker:~# docker stop 634cf027ad85	#停止容器
  3 root@docker:~# docker ps			#再次查看
 
注意:
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSTITORY:TAG 来定义不同的镜像。
若运行 docker 时不指定 tag,则默认使用 latest 镜像。

1.2 交互式运行容器

  1 root@docker:~# docker run -i -t centos:7 /bin/bash
各个参数解析:
  • -t: 在新容器内指定一个伪终端或终端。
  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

二 运行 Web 应用及其他操作

2.1 容器后端运行

  1 root@docker:~# docker pull training/webapp
  2 root@docker:~# docker run -d -P training/webapp python app.py
 
参数说明:
  • -d: 让容器在后台运行。
  • -P: 将容器内部使用的网络端口映射到我们使用的主机上。
  1 root@docker:~# docker ps
08_thumb2
可知此 docker 开放了 5000 端口映射到主机端口 32768 上。
09_thumb1
测试访问。
10_thumb1

2.2 指定端口运行容器

  1 root@docker:~# docker run -d -p 8080:5000 training/webapp python app.py                  #使用-p参数来绑定指定端口。
  2 root@docker:~# docker run -d -p 9090:5000/tcp --name web training/webapp python app.py   #使用--name标记可以为容器命名
  3 root@docker:~# docker ps
 
11_thumb1
注意:容器的名称是唯一的,若命名了一个叫 web 的容器,当再次使用 web 这个名称时,需要用 docker rm 删除之前创建的容器,也可以再执行 docker run 的时候加 —rm 标记来停止旧的容器,并删除,rm 和 - d 参数是不兼容的。
测试新绑定的端口。
12_thumb1
  1 root@docker:~# docker port 25cbcff93d56
  2 5000/tcp -> 0.0.0.0:8080
  3 root@docker:~# docker port 95b731acd6b5
  4 5000/tcp -> 0.0.0.0:32768
 
13_thumb1

2.3 进入容器

  1 root@docker:~# docker exec -it 5e7ad2db2304 /bin/bash
  2 root@docker:~# docker exec -it web /bin/bash
 

2.4 容器其他操作

  1 root@docker:~# docker logs -f 95b731acd6b5		#查看运行日志
  2 root@docker:~# docker inspect web			#查看Docker容器的配置和状态信息
  3 root@docker:~# docker restart 5e7ad2db2304		#重启docker
  4 root@docker:~# docker stop 95b731acd6b5		#停止docker
  5 root@docker:~# docker kill 25cbcff93d56		#停止docker
  6 root@docker:~# docker ps -a				#查看所有容器情况
  7 root@docker:~# docker start 95b731acd6b5		#运行已停止的docker
  8 root@docker:~# docker rm 95b731acd6b5		#删除该docker
 
注意:删除容器时,容器必须是停止状态,查看容器详细信息可输入前部分 ID,如 docker inspect 6b52。
  1 root@docker:~# docker pause 5e7ad2db2304		#暂停容器
  2 root@docker:~# docker unpause 5e7ad2db2304		#恢复容器
 

三 容器生命周期管理

3.1 容器生命周期

14_thumb1

四 docker 资源限制

用户内存限制就是对容器能使用的内存和交换分区的大小作出限制。

4.1 资源限制意义

主机运行若干容器,每个容器都需要 cpu、内存以及 IO 资源,为避免因为单个容器占用过多资源而影响到所有其他容器乃至整个宿主机的性能,需要对容器资源进行限制。

五 docker 内存限制

5.1 内存限制

Docker 提供的内存限制功能有以下几点:
  • 容器能使用的内存和交换分区大小。
  • 容器的核心内存大小。
  • 容器虚拟内存的交换行为。
  • 容器内存的软性限制。
  • 是否杀死占用过多内存的容器。
  • 容器被杀死的优先级。
一般情况下,达到内存限制的容器过段时间后就会被系统杀死。

5.2 内存限制相关参数

执行 docker run 命令时能使用的和内存限制相关的所有选项如下。
选项
描述
-m,--memory
内存限制,格式是数字加单位,单位可以为 b,k,m,g。最小为 4M
--memory-swap
内存 + 交换分区大小总限制,格式同上,必须比 - m 设置的值大
--memory-reservation
内存的软性限制,格式同上
--oom-kill-disable
是否阻止 OOM killer 杀死容器,默认没设置
--oom-score-adj
容器被 OOM killer 杀死的优先级,范围是 [-1000, 1000],默认为 0
--memory-swappiness
用于设置容器的虚拟内存控制行为。值为 0~100 之间的整数
--kernel-memory
核心内存限制。格式同上,最小为 4M
提示:
-m,--memory 选项的参数最小为 4 M;
--memory-swap 不是交换分区,而是内存加交换分区的总大小,所以 --memory-swap 必须比 - m,--memory 大;
若不设置 - m,--memory 和 --memory-swap,容器默认可用完宿主机所有内存和 swap 分区。但容器占宿主机所有内存和 swap 分区超过一段时间后,会被宿主机系统杀死(若没有设置 --00m-kill-disable=true)。

5.3 内存设置方式

  • 设置 - m,--memory,不设置 --memory-swap
  1 root@docker:~# docker run -d --name ubuntu_01 -m 1G --memory-swap 0 ubuntu:16.04
#该容器能使用的内存大小为 1G,能使用的 swap 分区大小也为 1G,容器内的进程能申请到的总内存大小为 2G。
作用:使用 - m 或 --memory 设置一个不小于 4M 的 a 值,不设置 --memory-swap,或将 --memory-swap 设置为 0。则表示容器能使用的内存大小为 a,能使用的交换分区大小也为 a。因为 Docker 默认容器交换分区的大小和内存相同。若容器中运行一个一直不停申请内存的程序,则该程序最终能使用的内存大小为 2a。
  • 设置 - m,--memory=a,--memory-swap=b,且 b > a
  1 root@docker:~# docker run -d --name ubuntu_02 -m 1G --memory-swap 3G ubuntu:16.04
#该容器能使用的内存大小为 1G,能使用的 swap 分区大小为 2G。容器内的进程能申请到的总内存大小为 3G。
作用:使用 - m 或 --memory 设置一个不小于 4M 的 a 值,且 b 必须大于 a,使用 --memory-swap 设置一个参数 b。则表示容器能使用的内存大小为 a,能使用的交换分区 + 内存大小为 b,b-a 即为容器能使用的 swap 分区大小。
  • 设置 - m,--memory=a,--memory-swap=-1
  1 root@docker:~# docker run -d --name ubuntu_03 -m 1G --memory-swap -1 ubuntu:16.04
#该容器能使用的内存大小为 1G,且不限制容器使用 swap 分区大小,即 1G + 宿主机 swap 大小。
作用:使用 - m 或 --memory 设置一个不小于 4M 的 a 值,使用 --memory-swap 设置一个参数 - 1,则表示限制容器能使用的内存大小为 a,且不限制容器使用 swap 分区大小。
提示:若出现如下提示:
WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
可打开内核内存限制的操作:
  1 root@docker:~# vi /etc/default/grub
  2 GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
  3 root@docker:~# update-grub		#重启系统
 

5.4 内存软性限制

设置 --memory-reservation。
  1 root@docker:~# docker run -d --name ubuntu_04 -m 2G --memory-reservation 1G ubuntu:16.04
#该容器能使用的内存大小为 2G,当宿主机内存资源紧张时,系统会回收 1G 内存,以便尝试将容器的内存锁紧到 1G 以下。
作用:Memory reservation 是一种软性限制,用于节制容器内存使用。使用 --memory-reservation 设置一个比 - m 小的值后,虽然容器最多可以使用 - m 设置的内存大小,但在宿主机内存资源紧张时,在系统的下次内存回收时,系统会回收容器的部分内存页,强迫容器的内存占用回到 --memory-reservation 设置的值大小。没有设置时(默认情况下)--memory-reservation 的值则 --memory-reservation 和 - m 的限定的值相同。将它设置为 0 或设置的比 - m 的参数大等同于没有设置。这种软性机制,它不保证任何时刻容器使用的内存不会超过 --memory-reservation 限定的值,它只是确保容器不会长时间占用超过 --memory-reservation 限制的内存大小。

5.5 OOM killer

  1 root@docker:~# docker run -d --name ubuntu_05 -m 1G --oom-kill-disable ubuntu:16.04
#该容器能使用的内存大小为 1G,并禁止了 OOM killer。
作用:OOM killer 机制指默认情况下,在出现 out-of-memory (OOM) 错误时,系统会杀死容器内的进程来获取更多空闲内存。通过设置 --oom-kill-disable 选项来禁止 OOM killer 杀死容器内进程。但请确保只有在使用了 - m/--memory 选项时才使用 --oom-kill-disable 禁用 OOM killer。如果没有设置 - m 选项,却禁用了 OOM-killer,可能会造成出现 out-of-memory 错误时,系统通过杀死宿主机进程或获取更改内存。

5.6 --memory-swappiness

  1 root@docker:~# docker run -d --name ubuntu_06 --memory-swappiness=0 ubuntu:16.04
#该容器关闭了匿名页面交换,可以保持容器的工作集,避免交换代理的性能损失。
作用:默认情况下,容器的内核可以交换出一定比例的匿名页。--memory-swappiness 可设置从 0 到 100 这个比例。0 表示关闭匿名页面交换。100 表示所有的匿名页都可以交换。默认情况下,如果不使用 --memory-swappiness,则该值从父进程继承而来。
注意:--memory-swappiness=0 表示禁用容器 swap 功能。

六 CPU 限制

Docker 的资源限制和隔离完全基于 Linux cgroups。对 CPU 资源的限制方式也和 cgroups 相同。Docker 提供的 CPU 资源限制选项可以在多核系统上限制容器能利用哪些 vCPU。而对容器最多能使用的 CPU 时间有两种限制方式:
  • 当多个 CPU 密集型的容器竞争 CPU 时,设置各个容器能使用的 CPU 时间相对比例。
  • 以绝对的方式设置容器在每个调度周期内最多能使用的 CPU 时间。

6.1 CPU 限制相关参数

执行 docker run 命令时能使用的和内存限制相关的所有选项如下。
选项
描述
--cpuset-cpus=""
允许使用的 CPU 集,值可以为 0-3,0,1
-c,--cpu-shares=0
CPU 共享权值(相对权重)
cpu-period=0
限制 CPU CFS 的周期,范围从 100ms~1s,即 [1000, 1000000]
--cpu-quota=0
限制 CPU CFS 配额,必须不小于 1ms,即 >= 1000
--cpuset-mems=""
允许在上执行的内存节点(MEMs),只对 NUMA 系统有效
其中 --cpuset-cpus 用于设置容器可以使用的 vCPU 核。-c,--cpu-shares 用于设置多个容器竞争 CPU 时,各个容器相对能分配到的 CPU 时间比例。--cpu-period 和 --cpu-quata 用于绝对设置容器能使用 CPU 时间。

6.2 CPU 集

  1 root@docker:~# docker run -d --name ubuntu_07 --cpuset-cpus="1,3" ubuntu:16.04
#表示容器中的进程可以在 cpu 1 和 cpu 3 上执行。

6.3 CPU 资源的相对限制

默认情况下,所有的容器得到同等比例的 CPU 周期。在有多个容器竞争 CPU 时可设置每个容器能使用的 CPU 时间比例。这个比例叫作共享权值,通过 - c 或 --cpu-shares 设置。Docker 默认每个容器的权值为 1024。不设置或将其设置为 0,都将使用这个默认值。系统会根据每个容器的共享权值和所有容器共享权值和比例来给容器分配 CPU 时间。
举例:
假设有三个正在运行的容器,这三个容器中的任务都是 CPU 密集型的。第一个容器的 cpu 共享权值是 1024,其它两个容器的 cpu 共享权值是 512。第一个容器将得到 50% 的 CPU 时间,而其它两个容器就只能各得到 25% 的 CPU 时间了。如果再添加第四个 cpu 共享值为 1024 的容器,每个容器得到的 CPU 时间将重新计算。第一个容器的 CPU 时间变为 33%,其它容器分得的 CPU 时间分别为 16.5%、16.5%、33%。
注意:这个比例只有在 CPU 密集型的任务执行时才有用。在四核的系统上,假设有四个单进程的容器,它们都能各自使用一个核的 100% CPU 时间,不管它们的 cpu 共享权值是多少。
在多核系统上,CPU 时间权值是在所有 CPU 核上计算的。即使某个容器的 CPU 时间限制少于 100%,它也能使用各个 CPU 核的 100% 时间。
例如,假设有一个不止三核的系统。用 - c=512 的选项启动容器 {C0},并且该容器只有一个进程,用 - c=1024 的启动选项为启动容器 C1,并且该容器有两个进程。CPU 权值的分布可能是这样的:
  1 PID    container    CPU CPU share
  2 100    {C0}     0   100% of CPU0
  3 101    {C1}     1   100% of CPU1
  4 102    {C1}     2   100% of CPU2

6.4 CPU 资源的绝对限制

Linux 通过 CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对 CPU 的使用。CFS 默认的调度周期是 100ms。
可设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的 CPU 时间。两者一般配合使用。
root@docker:~# docker run -d --name ubuntu_08 --cpu-period=50000 --cpu-quota=25000 ubuntu:16.04
#将 CFS 调度的周期设为 50000,将容器在每个周期内的 CPU 配额设置为 25000,表示该容器每 50ms 可以得到 50% 的 CPU 运行时间。
$ docker run -it --cpu-period=10000 --cpu-quota=20000 ubuntu:16.04 /bin/bash
root@docker:~# docker run -d --name ubuntu_09 --cpu-period=10000 --cpu-quota=20000 ubuntu:16.04
将容器的 CPU 配额设置为 CFS 周期的两倍,即容器分配两个 vCPU 就可以了。该配置表示容器可以在每个周期内使用两个 vCPU 的 100% 时间。
提示:CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~1000000。而容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 1000。可以看出这两个选项的单位都是 us。

七 Block IO 限制

Block IO 是另一种可以限制容器使用的资源。Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽。
选项
描述
--blkio-weight
设置的都是资源使用的权重
提示:该设置都是资源紧张的情况下才会起到权重的作用,正常情况下,都是平等的。
--blkio-weight-device 针对特定的设备设置权重
--device-read-bps
限制读某个设备的 bps(数据量)
--device-write-bps
限制写入某个设备的 bps(数据量)
--device-read-iops
限制读某个设备的 iops(次数)
--device-write-iops
限制写入某个设备的 iops(次数)
注意:目前 Block IO 限额只对 direct IO(不使用文件缓存)有效。

7.1 block IO 权重

  1 root@docker:~# docker run -d --name ubuntu_10 --blkio-weight 600 ubuntu:16.04
  2 root@docker:~# docker run -d --name ubuntu_11 --blkio-weight 300 ubuntu:16.04
 
#ubuntu_10 容器的读写磁盘的带宽是 ubuntu_11 的两倍。

7.2 限制 bps 和 iops

bps:byte per second,每秒读写的数据量。
iops:io per second,每秒 IO 的次数。
  1 root@docker:~# docker run -d --name ubuntu_12 --device-write-bps /dev/sda:30MB ubuntu:16.04
#ubuntu_12 容器写 /dev/sda 的速率为 30 MB/s。
参考:https://www.cnblogs.com/breezey/p/8812039.html

3.docker容器管理

3.docker容器管理

容器是Docker的另一个核心概念,镜像是静态的只读文件,而容器则带有运行时需要的可写文件层。

*创建容器

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS

-a, --attach=[]            是否绑定到标准输入,标准输出和错误
  --add-host=[]              在容器内添加一个主机名到IP的映射关系(通过/etc/hosts文件)
  -c, --cpu-shares=0        允许容器使用CPU资源的相对权重,默认一个容器能用满一个核的CPU
  --cap-add=[]               增加容器的Linux指定安全能力
  --cap-drop=[]              移除容器的Linux指定安全能力
  --cgroup-parent=           容器cgroup限制的创建路径
  --cidfile=                     将容器的ID号写入文件
  --cpuset-cpus=            限制容器使用哪些CPU核心
  --device=[]                 映射物理机的设备到容器内
  --dns=[]                     自定义dns服务器
  --dns-search=[]            设置 dns搜索域
  -e, --env=[]               设置容器内环境变量
  --entrypoint=              覆盖镜像中默认的ENTRYPOINT指令
  --env-file=[]                从文件中读取环境变量到容器内
  --expose=[]                暴漏一个或一组端口
  -h, --hostname=           指定容器的主机名
  
  -i, --interactive=false   保持标准输入打开(常搭配-t使用)
  --ipc=                     容器IPC命名空间
  -l, --label=[]             以键值对方式指定容器的标签信息
  --label-file=[]            从文件中读取标签信息
  --link=[]                  添加另一个容器的链接
  --log-driver=             指定容器的日志驱动类型,可以为json-file,syslog,journald等
  
  -m, --memory=             限制容器使用内存和交换区的总大小
  --mac-address=             指定容器的mac地址
  --memory-swap=             限制容器使用内存和交换内存的总大小, 设置''-1'' 为禁用交换内存
  --name=                       为容器分配一个名字
  --net=bridge                为容器设置桥接模式
  -P, --publish-all=false    Publish all exposed ports to random ports通过NAT机制将容器标记暴漏的端口自动映射到本地主机的临时端口
  -p, --publish=[]           指定如何映射到本机端口
  --pid=                      指定容器的pid命名空间
  --privileged=true|false       是否给容器以高权限,这意味着容器内应用将不受权限下限制,默认为false  
  --read-only=false          是否挂在容器文件系统为只读
  --restart=no               容器的重启策略,包括no,on-failure,always,unless-stopped
  --security-opt=[]          指定一些安全参数,包括权限,安全能力等
  -t, --tty=false            是否分配一个伪终端(交互模式)
  -u, --user=                以什么身份运行 (format: <name|uid>[:<group|gid>])
  --ulimit=[]                 通过此选项限制最大文件数,最大进程等
  -v, --volume=[]            绑定一个数据卷
  --volumes-from=[]          从某个容器绑定数据卷
  -w, --workdir=             容器的默认工作目录

 

*启动/停止容器

docker start/stop container

docker kill 会直接发送SIGKILL信号强制终止容器

*新建并启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run的options跟docker create一样,在此不再赘述

docker run -it ubuntu /bin/bash

用户可以按exit或者Ctrl+d退出

-d 以守护态运行

 

获取守护态容器的输出信息,可用

docker logs container

*连接容器

docker attach container

exec命令

docker exec -it container command arg...

docker exec -it ubuntu /bin/bash

*查看容器运行状态

docker logs container

 -f, --follow=false       跟随日志输出

  -t, --timestamps=false    输出日志输出
  --tail=x                      显示多少行   

 

*删除容器

docker rm [OPTIONS] CONTAINER [COMMAND] ARG...

    -f, --force=false      强制删除运行中的容器(发送SIGKILL)
  
  -l, --link=false       删除容器所有的连接,但保留容器
  -v, --volumes=false    删除容器挂载的数据卷

 

*导出容器     

docker export [-o name] CONTAINER

 

导入容器

docker import [OPTIONS] URL|- [REPOSITORY[:TAG]]

3、Docker容器管理

3、Docker容器管理

一、容器创建

1、创建命令

docker  container 

[root@localhost harbor]# docker container

Usage:  docker container COMMAND

Manage containers

Commands:
  attach      进入容器
  commit      以一个运行中的容器为基础镜像创建一个新镜像
  cp          在容器和本地文件之间拷贝文件或文件
  create      创建一个新的容器
  diff        查看一个容器的文件或目录的变化
  exec        在一个运行中的容器上执行一个命令
  export      以一个tar包的形式导出一个容器的文件系统
  inspect     显示一个或者多个容器的详情
  kill        杀掉一个或多个运行中的容器
  logs        获取某个容器的日志
  ls          列出容器
  pause       暂停一个或多个容器的所有进程
  port        列出容器的端口映射或一个特定的映射
  prune       删除所有停止的容器
  rename      重命名一个容器
  restart     重启一个或多个容器
  rm          删除一个或多个容器
  run         在一个新容器中执行一个命令
  start       启动一个或多个容器
  stats       展示一个容器的资源使用情况
  stop        停止一个或多个容器
  top         展示一个容器正在运行的进程
  unpause     暂停一个或多个容器的所有进程
  update      更新一个或多个容器的配置
  wait        锁定一个或多个容器,然后打印出他们的退出码

 

2、创建容器常用命令选项

 

常用选项:

-t  分配一个伪终端,是为了让容器启动后有一个前台进程,因为任何一个后台进程都需要一个前台进程才能跑起来。

-d  容器在后台运行

-P  大P后面不用接端口,是把容器EXPOSE的端口到宿主机的随机端口,EXPOSE是Dockerfile里面定义的

-h  容器主机名,默认是一个随机的字符串

--name  容器的名称,默认是一个随机字符串

-network 连接容器到一个网络,比如我们自定义一个bridege

-mount  将宿主机的数据挂在到容器

-restart  always  容器退出时,会不断的尝试重启

 

3、实例

创建一个容器,容器名为web_01,容器主机名web_01_hostname   容器会自动启动,访问宿主机的2080端口即可访问容器nginx

run -d --name web_01 -h web_01_hostname -e test=12345 --restart always -p 2088:80 nginx

  

 

验证:

1、查看是否创建成功

2、进入容器

 

3、访问服务

二、容器资源限制

容器资源限制,主要是内存和cpu的限制。

1、常用选项

 

-memory-swappiness :设置容器使用SWAP分区的百分比,也可以设置为不使用。-1是不限制,无限制使用swap,1是不使用,也就是swap和memory的值设置成一样。不设置swap,默认是可以使用物理内存的2倍。

--oom-kill-disable :宿主机有om机制,在内存不足时,会找出使用内存最多的内存并杀掉。

·-cpus:使用cpu的数量

-cpuset-cpus:设置容器可以使用宿主机的哪几个cpu

 

2、实例

例1:创建一个容器,内存限制为500M,swap可以使用100M,om机制禁用。

[root@localhost ~]# docker run -d --name nginx01 --memory=''500m'' --memory-swap=''600m'' --oom-kill-disable nginx
15eb4507333d0ca3b9a1cee6a764bfeb041bf1ea084daaa176fe56fce3307841

docker stats 15eb4507333d

 

上图可以看出:内存限制为500M。

 

例2:创建一个容器,cpu限制使用1.5

docker run -d --name nginx02 --cpus="1.5" nginx

 

资源限制的意义:当容器被攻击时,即使让容器跑满,也不会让宿主机崩溃。

如果设置cpus=2,则容器可能会跑到200%。

 

 

三、管理容器

1、管理容器常用选项

 

a、docker  container ls 

 

b、docker inspect 

 

c、docker exec

 

d、docker commit 

我们在容器中新建文件(修改容器),然后退出容器。

 

我们在容器中创建文件后,退出容器,然后commit,提交新的镜像

 查看镜像

 

 用新的镜像启动容器

 

进入容器查看是否以是新的镜像

验证成功。

 

e、docker  cp

[root@localhost ~]# docker cp /tmp/test_copy 1e7a16a5cfd8:/

  

将宿主机的文件拷贝到容器

 

f、docker logs  查看容器访问日志

g、docker port 查看容器的端口

 

h、docker  stats  查看容器资源使用情况

i、docker  start/stop 启动和停止容器

j、docker rm  删除停止的容器,-f 强制删除容器

k、docker top 查看容器中运行的进程

l、docker rename  重命名容器

m、docker update更新容器配置

3、Docker镜像管理基础

3、Docker镜像管理基础

Docker image

   

# docker image ls

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               4-alpine            23d561d12e92        9 days ago          35.5MB
nginx               1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
busybox             latest              3a093384ac30        6 weeks ago         1.2MB

# docker exec -it kvstor1 /bin/sh
/data # ls /
bin data dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var   //完整意义上的根文件系统,是底层--> Base Image

Docker Image Layer

位于下层的镜像成为父镜像(parent image),最底层的成为基础镜像(base image)

最上层为"可读写"层,其下的均为"只读"层。

分层构建是在纯净的Debian镜像之上添加一个emacs,然后在emacs之上再添加apache。每添加一个软件都是一个独立的层次,bootfs/Kernel层在容器启动时,rootfs一旦被引导完成,会被从内存中移除。

真正的用户空间运行的只有Debian、emacs、apache这三层,同时这三层是有层级关系的。最底层的是base image,是供给一个系统的基本构成(比如bin、sbin等),但是它是最小化的,没有依赖的应用程序。

如果需要用到某些额外的应用程序的话,需要在其上面进行安装操作。比如最小化安装了centos,然后在centos上安装vim。注意对于镜像来讲,是只读的,需要创建的centos镜像是最小化,是不会动的,安装vim时会在这个镜像上生成一个新的层次,这个层次只包含vim程序。如果安装httpd的话,需要在vim层安装一个新的层次。如果要启动nginx的,就要把centos、vim和nginx这三层都启动起来。

容器启动起来之后,如果需要创建临时文件,一般是放在/tmp目录下的,但是在docker中/tmp是位于底层基础镜像中是不允许编辑的,所以就要在最上层添加可读写层。

注意:如果删除了容器,最上层的"可读写"层也会被删除。

Aufs 

镜像的分层构建和联合挂载依赖于中游文件系统的支撑才能实现,在早期用到的专有文件系统叫aufs

# docker info

Storage Driver: overlay2   //前端
Backing Filesystem: xfs    //后端

Docker Registry

启动容器时,docker daemon会试图从本地获取相关的镜像;

本地镜像不存在时,其将从Registry中下载该镜像并保存到本地;

如果没有特别指定registry,那么通常就是docker hub;

如果要指向别的registry,必须在镜像的访问路径当中指明服务器地址;

如果没有服务器地址,只给了仓库名/tags,那么这个镜像一定是指docker hub。

Docker Registry 分类

Registry 组成

Docker Hub支持的功能:   https://www.kancloud.cn/thinkphp/docker-guide/39734

非常著名的镜像服务器:https://quay.io/

如果要使用,需要下载到本地并安装  https://quay.io/repository/coreos/flannel   -->  docker pull quay.io/coreos/flannel

 

从镜像仓库服务器中下载镜像

docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>   如果是docker hub,那么<registry>[:<port>]是可以省略的

<registry>:仓库服务器

<port>:端口,默认是443即https协议,可省略,

<namespace>:名称空间,指哪个用户的仓库,如果是顶层,可省略

<name>:<tag> :仓库名 + 标签名

# docker pull quay.io/coreos/flannel:v0.10.0-amd64   //这里没有指定端口表示是默认端口443,因为是通过https来获取的

quay.io 表示 <registry>

coreos 表示 <namespace>

flannel 表示 <name>

v0.10.0-amd64 表示 <tag>

Namespace的用法

镜像的相关操作

镜像的生成途径

如何基于容器创建镜像:

某个容器已经启动并处于运行中,那么使用docker commit把此运行的容器最上面的可写层单独创建一个镜像。

比如启动一个容器后,做好想要的修改,比如启动纯净的centos,在centos镜像上安装nginx --> #yum install nginx,然后把安装、生成nginx文件的可写层单独做成镜像。

 

示例:在busybox的基础上,加上data/html目录,并创建index.html网页,把此结果做成镜像

# docker commit -h

Usage:    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]   //表示基于哪个容器(CONTAINER)做镜像,并指明属于哪个仓库(REPOSITORY)和拥有什么标签(TAG)                               
Create a new image from a container''s changes                    //[REPOSITORY[:TAG]]是可以省略的,省略后表示所作的镜像就是本地的裸镜像,不属于任何仓库,也没有任何标签             
Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
  -c, --change list      Apply Dockerfile instruction to the created image
  -m, --message string   Commit message
  -p, --pause     Pause container during commit (default true)   //在制作镜像时,如果容器中的程序仍在运行,可能会生成新的文件,那么可能会导致制作的镜像中的新生成的文件是不完整的,所以在制作镜像时尽量使用-p选项,让容器中的程序暂停运行
[root@node1 ~]# docker run --name b1 -it busybox
/ # ls /
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # mkdir -p /data/html
/ # vi /data/html/index.html
    <h1>Busybox server<h1>
以上修改在如果没有制做成镜像之前关闭容器b1的话,那么这些修改将不会保存。
在容器不关闭的情况下,把对此容器的修改进行保存。
[root@node1 ~]# docker commit -p b1
sha256:439595aa4b0f893362aa08a43ce7936d1cda2fa10d7b1e8d03b4a18bfcf1c0be
[root@node1 ~]# docker image ls
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
<none>                   <none>              439595aa4b0f        10 seconds ago      1.2MB   //制作的新镜像
redis                    4-alpine            23d561d12e92        9 days ago          35.5MB
nginx                    1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
busybox                  latest              3a093384ac30        6 weeks ago         1.2MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        12 months ago       44.6MB
[root@node1 ~]# docker tag -h
Flag shorthand -h has been deprecated, please use --help
为镜像打标签
Usage:    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]  //SOURCE_IMAGE[:TAG]-->源镜像:源标签。镜像支持多个标签,如果原来有标签,这里表示源标签,如果之前没有标签那么则用IMAGE ID代替

Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
[root@node1 ~]# docker tag 439595aa4b0f beisen/httpd:v0.1-1 
[root@node1 ~]# docker image ls
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
beisen/httpd             v0.1-1              439595aa4b0f        4 minutes ago       1.2MB
redis                    4-alpine            23d561d12e92        9 days ago          35.5MB
nginx                    1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
busybox                  latest              3a093384ac30        6 weeks ago         1.2MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        12 months ago       44.6MB
为一个镜像打多个标签
[root@node1 ~]# docker tag beisen/httpd:v0.1-1 beisen/httpd:latest
[root@node1 ~]# docker image ls
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
beisen/httpd             latest              439595aa4b0f        10 minutes ago      1.2MB
beisen/httpd             v0.1-1              439595aa4b0f        10 minutes ago      1.2MB
redis                    4-alpine            23d561d12e92        9 days ago          35.5MB
nginx                    1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
busybox                  latest              3a093384ac30        6 weeks ago         1.2MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        12 months ago       44.6MB
删除一个标签,如果还有其他标签的话就不会把容器删除
[root@node1 ~]# docker image rm beisen/httpd:latest
Untagged: beisen/httpd:latest
[root@node1 ~]# docker image ls
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
beisen/httpd             v0.1-1              439595aa4b0f        11 minutes ago      1.2MB
redis                    4-alpine            23d561d12e92        9 days ago          35.5MB
nginx                    1.14-alpine         66952fd0a8ef        2 weeks ago         16MB
busybox                  latest              3a093384ac30        6 weeks ago         1.2MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        12 months ago       44.6MB
基于容器b1做的镜像再次创建一个容器t1
[root@node1 ~]# docker run --name t1 -it beisen/httpd:v0.1-1
/ # ls /
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ # ls /data/html/
index.html
/ # cat /data/html/index.html 
<h1>Busybox server<h1>

 / # which httpd
 /bin/httpd     //httpd的路径

/ # httpd -h
httpd: option requires an argument -- h
BusyBox v1.30.0 (2018-12-31 18:16:17 UTC) multi-call binary.

Usage: httpd [-ifv[v]] [-c CONFFILE] [-p [IP:]PORT] [-u USER[:GRP]] [-r REALM] [-h HOME]
or httpd -d/-e/-m STRING

Listen for incoming HTTP requests

    -i        Inetd mode
    -f        Don''t daemonize
    -v[v]        Verbose
    -p [IP:]PORT    Bind to IP:PORT (default *:80)
    -u USER[:GRP]    Set uid/gid after binding to port
    -r REALM    Authentication Realm for Basic Authentication
    -h HOME        Home directory (default .)   //指定家目录
    -c FILE        Configuration file (default {/etc,HOME}/httpd.conf)
    -m STRING    MD5 crypt STRING
    -e STRING    HTML encode STRING
    -d STRING    URL decode STRING

镜像定义了基于此镜象启动容器时默认运行的程序,这里修改默认运行的程序

# docker inspect beisen/httpd:v0.1-1   //首先查看容器b1运行的默认程序

"Cmd": [
    "sh"    //这里默认运行的程序是sh
],

修改新创建的容器t1不再运行sh,而是运行httpd

# docker commit -h
Flag shorthand -h has been deprecated, please use --help
Usage:    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container''s changes
Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
  -c, --change list      Apply Dockerfile instruction to the created image
  -m, --message string   Commit message
  -p, --pause            Pause container during commit (default true)

# docker commit -a "beisen" -c ''CMD ["/bin/httpd","-f","-h","/data/html"]'' -p b1 beisen/httpd:v0.2

-a:指定作者

-c:修改默认运行的程序 --> /bin/httpd

-f:运行在前台

-h:指定家目录,可以和/data/html写在一起,但是-h和/data/html之间是有空格的,所以这里分开写,但是要注意两者的次序。

-p:让容器的程序处于暂停状态

b1:这里基于容器b1创建镜像,同时修改这个新镜像的默认启动程序

beisen/httpd:v0.2:新镜像的仓库名和tag

# docker run --name t2 beisen/httpd:v0.2    //基于新创建的镜像运行一个容器t2,这里没有使用-it,因为httpd不是交互式接口

# docker container ls
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS               NAMES
c7ba9dc66b18        beisen/httpd:v0.2     "/bin/httpd -f -h /d??   About a minute ago   Up About a minute                       t2       //容器t2已经启动了
465aab04ace8        beisen/httpd:v0.1-1   "sh"                     35 minutes ago       Up 35 minutes                           t1
fb13aceb4369        busybox               "sh"                     4 hours ago          Up 4 hours                              b1
da481ee71e45        redis:4-alpine        "docker-entrypoint.s??   9 hours ago          Up 9 hours          6379/tcp            kvstor1
3ecb4f5d9a10        nginx:1.14-alpine     "nginx -g ''daemon of??   9 hours ago          Up 9 hours          80/tcp              web1

# docker inspect t2

"Cmd": [
    "/bin/httpd",
    "-f",
    "-h",
    "/data/html"
],

"IPAddress": "172.17.0.6",

# curl 172.17.0.6   //可以直接进行请求
  <h1>Busybox server<h1>

实现push镜像

在https://hub.docker.com注册账号

账号:studycolumn

创建仓库,注意本地的标签一定要和远程仓库保持一致

这里将之前创建的仓库名加以修改

# docker tag beisen/httpd:v0.2 studycolumn/httpd:v0.2

[root@node1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
beisen/httpd v0.2 24577eceda35 About an hour ago 1.2MB
studycolumn/httpd v0.2 24577eceda35 About an hour ago 1.2MB

# docker image rm beisen/httpd:v0.2

将创建的镜像push到新建的仓库中

# docker push -h
Flag shorthand -h has been deprecated, please use --help
Usage:    docker push [OPTIONS] NAME[:TAG]
Push an image or a repository to a registry
Options:
      --disable-content-trust   Skip image signing (default true)

在push之前,先登录到服务器上

[root@node1 ~]# docker login -h
Flag shorthand -h has been deprecated, please use --help
Usage:    docker login [OPTIONS] [SERVER]     //如果是docker hub的话,server不用指,如果是其他服务器必须指明
Log in to a Docker registry
Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

登陆仓库服务器

# docker login -u studycolumn
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

将创建好的镜像上传到仓库服务器

# docker push studycolumn/httpd
The push refers to repository [docker.io/studycolumn/httpd]
8f6d148780a1: Pushed 
683f499823be: Mounted from library/busybox 
v0.2: digest: sha256:92c7b7e535cca5208cb0c63ad92c2fd52d172bdd67aa56529824dcf968dd3089 size: 734

使用阿里云的仓库push和pull镜像

阿里云  https://promotion.aliyun.com/ntms/act/kubernetes.html    账号studycolumn

镜像加速地址 https://cr.console.aliyun.com/cn-hangzhou/mirrors

# vim /etc/docker/daemon.json   //添加加速地址

1 {
2 "registry-mirrors": ["https://registry.docker-cn.com","https://7g3yx938.mirror.aliyuncs.com"]
3 }

也可以在阿里云创建镜像仓库

镜像的导入或导出

node2想要使用node1创作的镜像,不是通过push仓库再从仓库中pull下来,而是现在node1上把镜像(docker save)打包,然后在node2上把解压(docker load)镜像。

# docker save --help
Usage:    docker save [OPTIONS] IMAGE [IMAGE...]
Save one or more images to a tar archive (streamed to STDOUT by default)
Options:
  -o, --output string   Write to a file, instead of STDOUT

# docker save -o myimages.gz studycolumn/httpd:v0.2 beisen/httpd:v0.1-1

# scp myimages.gz node2:/root

下面在node2上安装docker,这里scp node1上已有得文件

# scp /etc/yum.repos.d/docker-ce.repo node2:/etc/yum.repos.d/    //复制node1上得docker yum源到node2上

# yum install docker-ce  //在node2上安装docker社区版

# mkdir -p /etc/docker   //在node2上创建目录

# scp /etc/docker/daemon.json node2:/etc/docker/     //在node1复制文件,此文件包括加速地址

# systemctl start docker   //在node2上启动docker

node2 ~]# docker info

......

Registry Mirrors:   //加速服务器
https://registry.docker-cn.com/    
https://7g3yx938.mirror.aliyuncs.com/   

......

node2 ~]# docker load --help
Usage:    docker load [OPTIONS]
Load an image from a tar archive or STDIN
Options:
  -i, --input string   Read from tar archive file, instead of STDIN
  -q, --quiet          Suppress the load output

node2 ~]# docker load -i myimages.gz

683f499823be: Loading layer  1.416MB/1.416MB
8f6d148780a1: Loading layer   5.12kB/5.12kB
Loaded image: studycolumn/httpd:v0.2
f51e2aa679fa: Loading layer   5.12kB/5.12kB
Loaded image: beisen/httpd:v0.1-1 

 

 

 

今天关于3、docker 容器管理docker容器管理平台的分享就到这里,希望大家有所收获,若想了解更多关于003.Docker 容器管理、3.docker容器管理、3、Docker容器管理、3、Docker镜像管理基础等相关知识,可以在本站进行查询。

本文标签: