在本文中,我们将为您详细介绍3、docker容器管理的相关知识,并且为您解答关于docker容器管理平台的疑问,此外,我们还会提供一些关于003.Docker容器管理、3.docker容器管理、3、D
在本文中,我们将为您详细介绍3、docker 容器管理的相关知识,并且为您解答关于docker容器管理平台的疑问,此外,我们还会提供一些关于003.Docker 容器管理、3.docker容器管理、3、Docker容器管理、3、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 容器管理
一 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
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 #再次查看
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



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


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

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
1 root@docker:~# docker pause 5e7ad2db2304 #暂停容器
2 root@docker:~# docker unpause 5e7ad2db2304 #恢复容器
三 容器生命周期管理
3.1 容器生命周期

四 docker 资源限制
4.1 资源限制意义
五 docker 内存限制
5.1 内存限制
- 容器能使用的内存和交换分区大小。
- 容器的核心内存大小。
- 容器虚拟内存的交换行为。
- 容器内存的软性限制。
- 是否杀死占用过多内存的容器。
- 容器被杀死的优先级。
5.2 内存限制相关参数
选项
|
描述
|
-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
|
5.3 内存设置方式
- 设置 - m,--memory,不设置 --memory-swap
1 root@docker:~# docker run -d --name ubuntu_01 -m 1G --memory-swap 0 ubuntu:16.04
- 设置 - 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
- 设置 - m,--memory=a,--memory-swap=-1
1 root@docker:~# docker run -d --name ubuntu_03 -m 1G --memory-swap -1 ubuntu:16.04
1 root@docker:~# vi /etc/default/grub
2 GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
3 root@docker:~# update-grub #重启系统
5.4 内存软性限制
1 root@docker:~# docker run -d --name ubuntu_04 -m 2G --memory-reservation 1G ubuntu:16.04
5.5 OOM killer
1 root@docker:~# docker run -d --name ubuntu_05 -m 1G --oom-kill-disable ubuntu:16.04
5.6 --memory-swappiness
1 root@docker:~# docker run -d --name ubuntu_06 --memory-swappiness=0 ubuntu:16.04
六 CPU 限制
- 当多个 CPU 密集型的容器竞争 CPU 时,设置各个容器能使用的 CPU 时间相对比例。
- 以绝对的方式设置容器在每个调度周期内最多能使用的 CPU 时间。
6.1 CPU 限制相关参数
选项
|
描述
|
--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 系统有效
|
6.2 CPU 集
1 root@docker:~# docker run -d --name ubuntu_07 --cpuset-cpus="1,3" ubuntu:16.04
6.3 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 资源的绝对限制
七 Block IO 限制
选项
|
描述
|
--blkio-weight
|
设置的都是资源使用的权重
提示:该设置都是资源紧张的情况下才会起到权重的作用,正常情况下,都是平等的。
--blkio-weight-device 针对特定的设备设置权重
|
--device-read-bps
|
限制读某个设备的 bps(数据量)
|
--device-write-bps
|
限制写入某个设备的 bps(数据量)
|
--device-read-iops
|
限制读某个设备的 iops(次数)
|
--device-write-iops
|
限制写入某个设备的 iops(次数)
|
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
7.2 限制 bps 和 iops
1 root@docker:~# docker run -d --name ubuntu_12 --device-write-bps /dev/sda:30MB ubuntu:16.04
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容器管理
一、容器创建
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镜像管理基础
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镜像管理基础等相关知识,可以在本站进行查询。
本文标签: