1.docker 体系架构


Docker 采用了 C / S 架构,包括客户端和服务端。Docker 守护进程作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过 socket 或者 RESTfulAPI 来进行通信。

2.Docker基本组成


Docker overview
Docker Daemon:守护进程

Docker 主机(Host):一个物理机或虚拟机,用于运行 Docker 服务进程和容器。

Docker 服务端(Server):Docker 守护进程,运行 docker 容器。

Docker 客户端(Client):客户端使用 docker 命令或其他工具调用 docker API。

Docker 仓库(Registry):保存镜像的仓库,类似于 git 或 svn 这样的版本控制系

Docker 镜像(Images):镜像可以理解为创建实例使用的模板。

Docker 容器(Container):容器是从镜像生成对外提供服务的一个或一组服务。官方仓库: Docker

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo systemctl restart docker
#Docker-compose安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

2.1 基本术语


2.1.1 Docker主机(Host)
安装了Docker程序的主机,运行Docker守护进程

2.1.2 Docker镜像(Image)
镜像就是一堆只读层的统一视角

docker 镜像就好比是一个(只读)模板(和我们常见的 ISO 镜像类似,支持增删改查),可以通过这个模板来创建容器服务,tomcat镜像 ===> run ===> tomcat01容器(提供服务),一个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)

镜像不是一个单一的文件,而是有多层构成,我们可以通过 docker history <ID/NAME> 查看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令

Docker镜像默认存储在 /var/lib/docker/<Storage Driver>,docker info 查看 Docker 使用的 Storage Driver

2.1.3 Docker容器(Container)
运行镜像后生成的实例成为容器,每运行一次镜像就会产生一个容器,容器可以启动、停止或删除

容器使用沙箱机制,互相隔离,是独立安全的

可以把容器看做是一个简易版的linux环境,包括root用户权限、进程空间、用户空间、网络空间、文件系统和运行的在其中的应用程序

容器 = 镜像 + 读写层,容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像要写的文件复制到容器自己的文件系统(读写层)如果容器删除了,最上面的读写层也就删除了,改动也就丢失了,所以无论多少个容器共享一个镜像,所做的写操作都是从镜像的文件系统复制过来操作的,并不会修改镜像的源文件,这种方式提高磁盘利用率,若想持久化这些改动,可以通过 docker commit 将容器保存成一个新的镜像

2.1.4 Docker仓库(Repository)
用来保存镜像的,仓库中包含许多镜像,每个镜像都有不同的标签(tag)

分为公开仓库(Public)和私有仓库(Private)两种形式

2.2 镜像和容器的关系


镜像:镜像是文件,是静态的,只读的,提供了运行程序完整的数据,是应用程序的“集装箱”

容器:镜像的运行环境,动态,有生命周期,像是迷你的“linux操作系统”,由Docker负责创建,容器之间彼此隔离

镜像与容器的关系就是程序和进程的关系,如:

/bin/ls	执行程序文件
ls /etc	进程
ls /var	进程

注意

docker客户端与docker server是通过http或https协议进行交互的

加载镜像到本地使用 http 或 https,默认必须使用 https 协议,如果你自己确认不使用安全的,可以用 http

镜像下载可以去 dockerhub 或者阿里云、华为云等

使用Docker步骤

安装Docker

从Docker仓库中下载软件对应的镜像

运行这个镜像,此时会生成一个Docker容器

对容器的启动/停止就是对软件的启动/停止

4.安装及使用docker

4.1 依赖的基础环境


64 bits CPU

内存至少4G

Linux Kernel 3.10+

Linux Kernel cgroups and namespaces

4.2 安装Docker


Docker版本:分为社区版(Community Ddition,CE)和企业版(Enterprise Edition,EE)

4.2.1 Centos7+ 安装 docker
“Extras” repository (使用命令yum repolist可以看到extras,extras里面有docker)

Cenots7 版本自带的 docker 版本较老,建议卸载后,安装新版

cd /etc/yum.repos.d/
# 下载清华 Docker 仓库
wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's@https://.*@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' /etc/yum.repos.d/docker-ce.repo
# 使用 yum repolist 看到 docker-ce-stable/x86_64
# 卸载旧的版本
yum remove docker docker-client docker-client-latest docker-common 
yum remove docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 删除资源
rm -rf /var/lib/docker
# 更新软件包索引
yum makecache fast
# 安装 docker 社区版
yum -y install docker-ce docker-ce-cli containerd.io
# 启动 Docker
systemctl start docker
# 查看 docker 版本
docker version
# 开机启动 Docker
systemctl enable docker
# 查看 Docker 状态
systemctl status docker
# 验证是否正确安装了docker,方法是运行 hello-world 镜像
docker run hello-world
# 关闭 Docker
systemctl stop docker

4.2.2 Ubuntu 安装 docker-ce 环境

#参考文档
https://docs.docker.com/engine/install/debian/
https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
#卸载旧版
sudo apt-get remove docker docker-engine docker.io containerd runc
#安装依赖
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
#信任 Docker 的 GPG 公钥(发行版不同,下面的内容也有所不同)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#添加仓库(发行版不同,下面的内容也有所不同)
sudo add-apt-repository \
   "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

#安装docker-ce
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
# 指定安装版本
apt install docker-ce=5:19.03.15~3-0~ubuntu-bionic docker-ce-cli=5:19.03.15~3-0~ubuntu-bionic

#检查是否安装成功
[root@docker ~]# docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

4.3 Docker镜像加速

使用阿里云提供的镜像加速(镜像仓库),也可以使用网易云等;

    步骤:

      ①.注册并登陆“阿里云的开发者平台”http://dev.aliyun.com;

      ②.查看专属的加速器地址;

      ③.配置自己的Docker加速器;

vi /etc/docker/daemon.json 
			{
			"exec-opts": ["native.cgroupdriver=systemd"], 
			"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"] 
			}
    systemctl daemon-reload&&systemctl enable --now docker

5. Docker平台基本使用方法

运行一个container并加载镜像centos,运行起来这个实例后,在实例中执行 /bin/bash命令

5.1 docker常用参数:

header 1

header 2

run

运行

-i

以交互模式运行容器,通常与-t 同时使用;

-t

为容器重新分配一个伪输入终端,通常与-i同时使用

-d

后台运行容器,并返回容器ID;

-c

后面跟待完成的命令

#示例
# 下载和运行镜像一步完成
root@RS1:~# docker run -it nginx /bin/bash
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
b4d181a07f80: Already exists
66b1c490df3f: Pull complete
d0f91ae9b44c: Pull complete
baf987068537: Pull complete
6bbc76cbebeb: Pull complete
32b766478bc2: Pull complete
Digest: sha256:8df46d7414eda82c2a8c9c50926545293811ae59f977825845dda7d558b4125b
Status: Downloaded newer image for nginx:latest
root@2e1e48cd50c7:/#
#5.2 容器后台运行的特点
如果没有永久运行的程序,终端退出(exit)容器就会马上退出

"容器永久运行的条件:需要有永久运行的程序,并且使用 docker run -d 后台启动容器"
"常见的坑:docker 容器使用后台运行,必须要有一个前台进程,docker发现没有应用,就会自动停止"
 
# 在container中启动一个长久运行的进程,不断向stdin输出 hello world 。模拟一个后台运行的服务 
docker run --name mycentos -d centos:7 /bin/bash -c "while true;do echo hello world; sleep 3; done"
# 进入容器
docker exec -it mycentos /bin/bash
# 查看容器日志
docker logs -tf --tail 10 mycentos
# -tf            显示日志
# --tail number  要显示日志条数

6. Docker常用命令

# 输入docker可以查看docker的命令用法,输入docker COMMAND --help 查看指定命令的详细用法
docker 命令 --help

# 查看docker版本信息 
root@RS1:~# docker version
Client: Docker Engine - Community
 Version:           20.10.7
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        f0df350
 Built:             Wed Jun  2 11:56:40 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.7
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       b0f5bc3
  Built:            Wed Jun  2 11:54:48 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.6
  GitCommit:        d71fcd7d8303cbf684402823e425e9dd2e99285d
 runc:
  Version:          1.0.0-rc95
  GitCommit:        b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
root@RS1:~#	

# 查看docker更详细的信息,包括镜像和容器的数量
root@RS1:~# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
  scan: Docker Scan (Docker Inc., v0.8.0)

Server:
 Containers: 3
  Running: 0
  Paused: 0
  Stopped: 3
 Images: 4
 Server Version: 20.10.7
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: d71fcd7d8303cbf684402823e425e9dd2e99285d
 runc version: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: default
 Kernel Version: 4.15.0-143-generic
 Operating System: Ubuntu 18.04.4 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 1.946GiB
 Name: RS1
 ID: 5RW4:7Z37:G2RU:BXH6:6U62:53TS:AIOQ:Z7C4:EHRQ:G5HV:VIRK:FGXY
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: No swap limit support
root@RS1:~#

6.1 镜像操作

"6.1.1 搜索镜像"
docker search 关键字
示例
# 通过搜索来过滤
# 搜索出来的镜像就是STARS大于3000的
docker search mysql --filter=STARS=3000 
#可以在 Docker Hub 网站查看镜像的详细信息,如镜像的 tag 标签,OFFICIAL 为 [ok] 的是官方镜像,可以放心使用。
示例
root@RS1:~# docker search nginx
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                             Official build of Nginx.                        15141     [OK]
jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con…   2041                 [OK]
richarvey/nginx-php-fpm           Container running Nginx + PHP-FPM capable of…   816                  [OK]
jc21/nginx-proxy-manager          Docker container for managing Nginx proxy ho…   211
linuxserver/nginx                 An Nginx container, brought to you by LinuxS…   147
tiangolo/nginx-rtmp               Docker image with Nginx using the nginx-rtmp…   132                  [OK]
jlesage/nginx-proxy-manager       Docker container for Nginx Proxy Manager        122                  [OK]
alfg/nginx-rtmp                   NGINX, nginx-rtmp-module and FFmpeg from sou…   101                  [OK]
jasonrivers/nginx-rtmp            Docker images to host RTMP streams using NGI…   91                   [OK]
nginxdemos/hello                  NGINX webserver that serves a simple page co…   70                   [OK]
privatebin/nginx-fpm-alpine       PrivateBin running on an Nginx, php-fpm & Al…   56                   [OK]
nginx/nginx-ingress               NGINX and  NGINX Plus Ingress Controllers fo…   55
nginxinc/nginx-unprivileged       Unprivileged NGINX Dockerfiles                  42
staticfloat/nginx-certbot         Opinionated setup for automatic TLS certs lo…   23                   [OK]
nginx/nginx-prometheus-exporter   NGINX Prometheus Exporter for NGINX and NGIN…   19
schmunk42/nginx-redirect          A very simple container to redirect HTTP tra…   19                   [OK]
centos/nginx-112-centos7          Platform for running nginx 1.12 or building …   15
centos/nginx-18-centos7           Platform for running nginx 1.8 or building n…   13
raulr/nginx-wordpress             Nginx front-end for the official wordpress:f…   13                   [OK]
bitwarden/nginx                   The Bitwarden nginx web server acting as a r…   11
flashspys/nginx-static            Super Lightweight Nginx Image                   10                   [OK]
mailu/nginx                       Mailu nginx frontend                            9                    [OK]
sophos/nginx-vts-exporter         Simple server that scrapes Nginx vts stats a…   7                    [OK]
ansibleplaybookbundle/nginx-apb   An APB to deploy NGINX                          2                    [OK]
wodby/nginx                       Generic nginx                                   1                    [OK]
root@RS1:~#
"6.1.2 下载镜像"
docker pull 镜像名[:tag] 
[:tag] 表示软件的版本,如果不指定 tag 默认是 latest

#示例:下载指定版本的 nginx
root@RS1:~# docker pull nginx:1.14.1
1.14.1: Pulling from library/nginx
a5a6f2f73cd8: Pull complete
2343eb083a4e: Pull complete
251439d5b33c: Pull complete
Digest: sha256:32fdf92b4e986e109e4db0865758020cb0c3b70d6ba80d02fe87bad5cc3dc228
Status: Downloaded newer image for nginx:1.14.1
docker.io/library/nginx:1.14.1
root@RS1:~# 
#示例:下载最新版本的 redis
# 如果不指定 tag 默认是 latest
root@RS1:~# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
b4d181a07f80: Pull complete
86e428f79bcb: Pull complete
ba0d0a025810: Pull complete
ba9292c6f77e: Pull complete
b96c0d1da602: Pull complete
5e4b46455da3: Pull complete
Digest: sha256:8b8d1c205e0149483f320ed234debaed7091f18b6c1d47bf1720951cd2161bfc
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
root@RS1:~#
"6.1.3 上传镜像"
#推送一个镜像到镜像仓库
docker push 镜像名[:tag] 
"6.1.4 查看镜像"
# 查看所有本地主机上的镜像(活动的)
docker images
# 列出所有的镜像(包含非活动)
docker images -a
# 只显示镜像的id
docker images -q
docker image ls(新版本docker)
#示例
root@RS1:~# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
redis         latest    08502081bff6   2 weeks ago    105MB
hello-world   latest    d1165f221234   4 months ago   13.3kB
nginx         1.14.1    5f2d4477b7ea   2 years ago    109MB
root@RS1:~#
"6.1.5 获取镜像的元信息(详细信息)"
docker inspect 镜像名或镜像ID
docker image inspect 镜像名或镜像ID
"6.1.6 删除镜像"
docker rmi 镜像ID或镜像名[:tag]
docker rmi -f 镜像ID或镜像名[:tag]   # 删除指定的本地镜像,-f表示强制删除
docker image rm 镜像ID或镜像名[:tag]
#示例:删除所有的镜像
docker rmi -f  $(docker images -aq) 
"6.1.7 prune"
#移除未使用的镜像,没有被标记或被任何容器引用的
docker image prune
"6.1.8 历史记录"
#查看镜像的变更历史
docker history 镜像ID或镜像名 
#示例
[root@RS2 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              4cdc5dd7eaad        5 days ago          133MB
[root@RS2 ~]# docker history nginx
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
4cdc5dd7eaad        5 days ago          /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B
<missing>           5 days ago          /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B
<missing>           5 days ago          /bin/sh -c #(nop)  EXPOSE 80                    0B
<missing>           5 days ago          /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B
<missing>           5 days ago          /bin/sh -c #(nop) COPY file:09a214a3e07c919a…   4.61kB
<missing>           5 days ago          /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7…   1.04kB
<missing>           5 days ago          /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0…   1.96kB
<missing>           5 days ago          /bin/sh -c #(nop) COPY file:65504f71f5855ca0…   1.2kB
<missing>           5 days ago          /bin/sh -c set -x     && addgroup --system -…   63.9MB
<missing>           5 days ago          /bin/sh -c #(nop)  ENV PKG_RELEASE=1~buster     0B
<missing>           5 days ago          /bin/sh -c #(nop)  ENV NJS_VERSION=0.6.1        0B
<missing>           5 days ago          /bin/sh -c #(nop)  ENV NGINX_VERSION=1.21.1     0B
<missing>           2 weeks ago         /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B
<missing>           2 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>           2 weeks ago         /bin/sh -c #(nop) ADD file:4903a19c327468b0e…   69.3MB
[root@RS2 ~]#
"6.1.8 构建镜像"
docker build -f Dockerfile文件的路径 -t 镜像名:tag 命令执行的上下文 
#示例:使用Dockerfile构建镜像
docker build -f Dockerfile -t harbor.test.com/os/tomcat:v1 .  # 注意最后的点号不能省略
"6.1.9 设置镜像标签"
#创建一个引用源镜像标记目标镜像
docker tag tomcat:v1 harbor.test.com/os/tomcat:v1
"6.1.10 导出容器文件系统到tar归档文件”
docker export 
"6.1.11 导入容器文件系统tar归档文件创建镜像"
docker import 
"6.1.12 保存镜像"
#保存一个或多个镜像到一个tar归档文件(可应用于无法联网的机器)
docker image save nginx |gzip >nginx.tar.gz
"6.1.13 加载镜像"
#加载来自tar归档或标准输入的镜像(可应用于无法联网的机器)
docker image load -i nginx.tar.gzdocker load < nginx.tar.gz

6.2 容器操作

"6.2.1 运行容器"
#示例:启动容器并以 bash 形式进入
注意:有些容器没有 bash 环境,需要使用 /bin/sh 或其他 shell 环境进入
docker run -p 80:8080 -it --name webserver webserver:1.1 /bin/bash
#示例:启动容器并在后台运行
docker run -p 80:8080 -itd --name webserver webserver:1.1 /bin/bash
#示例:启动容器并在后台运行,并传入指定参数(相当于创建dockerfile的ENV)
docker run \
-p 80:8080 \
--name webserver \
-e project_name="webserver" \
-d webserver:1.1
#示例:启动容器并在后台运行,并指定所在网络
docker run \
-p 80:8080 \
--name webserver \
--network myweb \
-d webserver:1.1
#示例:启动容器,并指定路径映射
docker run \
-p 80:8080 \
--name webserver \
--network web_net \
-e project_name="webserver" \
-v /search/webserver/logs:/search/webserver/logs \
-itd webserver:1.1 /bin/bash
#示例:启动容器,指定host网络并指定路径映射
docker run \
-p 80:8080 \
--name webserver \
--network host \
-e project_name="webserver" \
-v /search/webserver/logs:/search/webserver/logs \
-itd webserver:1.1 /bin/bash

参数说明

参数

解释

–name

指定容器名,名称自定义,如果不指定会自动命名

–ip

指定容器IP,只能用于自定义网络

-i

以交互模式运行,即以交互模式运行容器,表示让容器的标准输入打开,不跟这个参数容器无法启动

-t

分配一个伪终端,即命令行,通常组合使用-it

-p

端口映射,将主机端口映射到容器内的端口 -p 8080:8080 -p ip:主机端口:容器端口 -p 主机端口:容器端口 (常用) -p 容器端口 容器端口

-P

发布容器所有 EXPOSE 的端口到宿主机随机端口(docker history 容器ID或容器名)

-d

后台运行,即守护式运行容器,并返回容器ID

-e

设置环境变量

-h

设置容器主机名(hostname)

-v

指定挂载主机目录到容器目录,默认为rw读写模式,ro表示只读

–mount

将文件系统附加到容器

–net

指定网络模型,默认是桥接模式

–add-host master:172.22.16.13

写/etc/hosts文件

–rm

当容器命令运行结束后,自动删除容器,自动释放资源,
例:docker run -it --rm centos sleep 5,五秒后自动删除

–privileged

特权模式,无特权模式在容器中很多命令无法运行
如:route del default gw 172.17.0.1只有在特权模式下才能运行

–restart

容器退出时重启策略,默认为no,可选值:[always|on-failure]

如果创建时未指定 ,可通过update命令设置:docker update --restart=always 容器ID或容器名

6.2.2 资源限制

"6.2.2.1 内存限额"
# 允许容器最多使用500M内存和100M的Swap,并禁用OOM Killer
docker run \
--name web1 \
-m 500m \
--memory-swap=600m \
--oom-kill-disable \
-d nginx

docker stats --no-stream web
# 默认情况下,上面两组参数为 -1,即对容器内存和 swap 的使用没有限制。
"6.2.2.2 CPU限额"
# 允许容器最多使用一个半的CPU
docker run --name web1 --cpus="1.5" -d nginx
# 允许容器最多使用50%的CPU
docker run --name web2 --cpus=".5" -d nginx
# 容器实例分配512权重的cpu使用资源
docker run -it --cpu-shares 512 centos /bin/bash/
# cat /sys/fs/cgroup/cpu/cpu.shares
"6.2.2.3 I/O限额"
# bps 是 byte per second,每秒读写的数据量。
# iops 是 io per second,每秒 IO 的次数。

# 可通过以下参数控制容器的 bps 和 iops
# 下面这个例子限制容器写 /dev/sda 的速率为 30 MB/s
docker run -it --device-write-bps /dev/sda:30MB ubuntu

参数说明

参数

解释

-m 200M

设置内存的使用限额,例如 100M, 2G。

–memory-swap

允许交换到磁盘的内存量

–memory-swappiness=<0-100>

容器使用SWAP分区交换的百分比(默认为-1)

–oom-kill-disable

禁用OOM Killer

–vm 1

启动 1 个内存工作线程。

–vm-bytes 280M

每个线程分配 280M 内存。

–cpus

可以使用的CPU数量

–cpuset-cpus

限制容器使用特定的CPU核心,如(0-3,0,1)

-c, --cpu-shares 1024

container_A 的 cpu share 1024,是 container_B 的两倍。
当两个容器都需要 CPU 资源时,container_A可以得到的 CPU 是 container_B 的两倍。
需要特别注意的是,这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下。
如果 container_A 处于空闲状态,这时,为了充分利用 CPU 资源,container_B也可以分配到全部可用的 CPU。

–device-read-bps

限制读某个设备的 bps。

–device-write-bps

限制写某个设备的 bps。

–device-read-iops

限制读某个设备的 iops。

–device-write-iops

限制写某个设备的 iops。

6.2.3 查看容器

# 查看(运行态)容器
docker ps
docker container ls
# 查看(包含非运行态)容器
docker ps -a
docker container ls -a
# 只显示容器
IDdocker ps -q
# 显示最近创建的容器
docker ps -a -n=1

参数

解释

-a

显示所有容器,包括非运行态容器

-l

获得最新的容器信息

-q

只显示容器的ID

-n=?

显示最近创建的容器

"6.2.4 启动容器"
docker start 容器ID或容器名称 
#示例

root@RS1:~# docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED        STATUS                      PORTS     NAMES
0ee82d82570e   nginx         "/docker-entrypoint.…"   14 hours ago   Exited (137) 14 hours ago             wonderful_herschel
2e1e48cd50c7   nginx         "/docker-entrypoint.…"   14 hours ago   Exited (0) 14 hours ago               adoring_bell
6e71462510b9   hello-world   "/hello"                 15 hours ago   Exited (0) 15 hours ago               priceless_dijkstra
root@RS1:~# docker start 2e1e48cd50c7
2e1e48cd50c7
root@RS1:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS         PORTS     NAMES
2e1e48cd50c7   nginx     "/docker-entrypoint.…"   14 hours ago   Up 3 seconds   80/tcp    adoring_bell
root@RS1:~#
"6.2.5 停止容器"
#停止当前正在运行的容器
docker stop 容器ID或容器名称
#示例:停止全部运行中的容器
docker stop $(docker ps -q)
"6.2.6 重启容器"
docker restart 容器ID或容器名称 
"6.2.7 kill 容器"
#强制停止(杀死)当前容器
docker kill 容器ID 
"6.2.8 删除容器"
# 删除(非运行)态容器
docker rm 容器ID
docker rm 容器名称
# 删除(运行态的)容器需要先将容器关闭
docker stop containerID
docker rm containerID
# 强制删除容器(不管容器是否在运行)
docker rm -f containerID        # -f:表示强制删除
# 删除所有(运行和非运行的)容器
docker rm -f $(docker ps -aq)
# 删除所有(运行和非运行的)容器
docker ps -a -q  | xargs docker rm -f   
#示例:删除所有(运行和非运行的)容器
[root@RS1 ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED        STATUS                      PORTS     NAMES
0ee82d82570e   nginx         "/docker-entrypoint.…"   15 hours ago   Exited (137) 15 hours ago             wonderful_herschel
2e1e48cd50c7   nginx         "/docker-entrypoint.…"   15 hours ago   Up 21 minutes               80/tcp    adoring_bell
6e71462510b9   hello-world   "/hello"                 15 hours ago   Exited (0) 15 hours ago               priceless_dijkstra
[root@RS1 ~]# docker rm -f $(docker ps -aq)
0ee82d82570e
2e1e48cd50c7
6e71462510b9
[root@RS1 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@RS1 ~]#
"6.2.9 容器日志"
#获取容器的日志(容器的ID可以写全,也可以不写全,唯一即可)
docker logs 容器id或容器名称
#示例
[root@slave4 ~]# docker run \
> --privileged \
> -p 6379:6379 \
> -p 16379:16379 \
> --name redis-node \
> -v /apps/redis/data:/data \
> -v /apps/redis/conf/redis.conf:/etc/redis/redis.conf \
> --net host \
> -d redis:5.0 \
> redis-server /etc/redis/redis.conf
Unable to find image 'redis:5.0' locally
5.0: Pulling from library/redis
bf5952930446: Pull complete
911b8422b695: Pull complete
093b947e0ade: Pull complete
2e4ea19ac656: Pull complete
62403d50d101: Pull complete
3a097fa7018a: Pull complete
Digest: sha256:50e8ee4558b11cdc12b9a94497697190bc8d77e6c15aa6af045a64f6a68f5f48
Status: Downloaded newer image for redis:5.0
WARNING: Published ports are discarded when using host network mode
38e49f7a359ad6be30e9777e75656a664e1b323d37325bd8387cbe130a96d6d6
[root@slave4 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@slave4 ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED              STATUS                          PORTS     NAMES
38e49f7a359a   redis:5.0   "docker-entrypoint.s…"   About a minute ago   Exited (1) About a minute ago             redis-node
[root@slave4 ~]# docker logs 38e49f7a359a

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 11
>>> 'logfile /var/log/redis.log'
Can't open the log file: Permission denied
[root@slave4 ~]#
#示例:查看指定时间后的日志,只显示最后100行
docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID
#示例:查看最近30分钟的日志
docker logs --since 30m CONTAINER_ID
#示例:查看某时间之后的日志
docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID
#示例:查看某时间段日志
docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID
"6.2.10 进入容器"
#进入正在运行的容器中并开启一个交互模式的终端,可以在容器中执行操作
docker exec 进入容器后开启一个新的终端,可以在里面操作(常用)
docker exec -it 容器id或容器名称 /bin/bash
docker attach 进入容器正在执行的终端,不会启动新的进程
docker attach 容器id或容器名称 
"6.2.11 拷贝文件"
#将宿主机中的文件拷贝到容器中指定的目录中
docker cp 主机中的文件路径 容器ID或容器名称:容器路径 
#将容器中的文件拷贝到宿主机的指定目录中
docker cp 容器ID或容器名称:容器中的路径 主机路径
#示例
docker cp web:/usr/local/tomcat/conf/server.xml /tmp
"6.2.12 获取容器的元信息(详细信息,如IP地址等)"
docker inspect 容器ID或容器名称
#示例:查找配置文件

"场景:今天发现一个报警,查找之后发现是 nginx 反向代理配置,而由于没有交接,需要找出 nginx 配置文件在物理机中的部署位置,或者说,原来部署 docker 的详细配置项"

root@gz-manage16:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
f508a5397ee9        nginx:1.15          "nginx -g 'daemon of…"   2 years ago         Up 5 minutes        80/tcp, 0.0.0.0:9200->9200/tcp   production_nginx
root@gz-manage16:~# 
root@gz-manage16:~# docker inspect f508a5397ee9
[
  
      ......
       
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/opt/es-stack-compose/nginx/nginx.conf",
                "Destination": "/etc/nginx/nginx.conf",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/opt/es-stack-compose/nginx/logs",
                "Destination": "/var/log/nginx",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/opt/es-stack-compose/nginx/conf.d",
                "Destination": "/etc/nginx/conf.d",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
    ......
]
"6.2.13 查看容器中进程信息"
docker top 容器ID或容器名称 
#示例

[root@RS1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED                  STATUS                  PORTS                               NAMES
713ad3324392   nginx     "/docker-entrypoint.…"   Less than a second ago   Up Less than a second   0.0.0.0:83->80/tcp, :::83->80/tcp   nginx-3
a04dfb342238   nginx     "/docker-entrypoint.…"   Less than a second ago   Up Less than a second   0.0.0.0:82->80/tcp, :::82->80/tcp   nginx-2
f6271f4335ef   nginx     "/docker-entrypoint.…"   Less than a second ago   Up Less than a second   0.0.0.0:81->80/tcp, :::81->80/tcp   nginx-1
[root@RS1 ~]# docker top 713ad3324392
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4059                4028                0                   01:46               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            4133                4059                0                   01:46               ?                   00:00:00            nginx: worker process
systemd+            4134                4059                0                   01:46               ?                   00:00:00            nginx: worker process
systemd+            4135                4059                0                   01:46               ?                   00:00:00            nginx: worker process
systemd+            4136                4059                0                   01:46               ?                   00:00:00            nginx: worker process
[root@RS1 ~]#
"6.2.14 列出或指定容器端口映射"
docker port 容器ID或容器名称 
#示例
[root@RS1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED                  STATUS                  PORTS                               NAMES
713ad3324392   nginx     "/docker-entrypoint.…"   Less than a second ago   Up Less than a second   0.0.0.0:83->80/tcp, :::83->80/tcp   nginx-3
a04dfb342238   nginx     "/docker-entrypoint.…"   Less than a second ago   Up Less than a second   0.0.0.0:82->80/tcp, :::82->80/tcp   nginx-2
f6271f4335ef   nginx     "/docker-entrypoint.…"   Less than a second ago   Up Less than a second   0.0.0.0:81->80/tcp, :::81->80/tcp   nginx-1
[root@RS1 ~]# docker port 713ad3324392
80/tcp -> 0.0.0.0:83
80/tcp -> :::83
[root@RS1 ~]#
"6.2.15 显示容器资源使用统计"
docker stats 容器ID或容器名称 
#示例

[root@RS1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED                  STATUS                  PORTS                               NAMES
713ad3324392   nginx     "/docker-entrypoint.…"   Less than a second ago   Up Less than a second   0.0.0.0:83->80/tcp, :::83->80/tcp   nginx-3
a04dfb342238   nginx     "/docker-entrypoint.…"   Less than a second ago   Up Less than a second   0.0.0.0:82->80/tcp, :::82->80/tcp   nginx-2
f6271f4335ef   nginx     "/docker-entrypoint.…"   Less than a second ago   Up Less than a second   0.0.0.0:81->80/tcp, :::81->80/tcp   nginx-1
[root@RS1 ~]# docker stats f6271f4335ef
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT    MEM %     NET I/O          BLOCK I/O         PIDS
f6271f4335ef   nginx-1   0.06%     43.3MiB / 1.946GiB   2.17%     9.79MB / 336kB   31.4MB / 14.6MB   5
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT    MEM %     NET I/O          BLOCK I/O         PIDS
f6271f4335ef   nginx-1   0.06%     43.3MiB / 1.946GiB   2.17%     9.79MB / 336kB   31.4MB / 14.6MB   5
......
"6.2.16 暂停容器"
docker pause 容器ID 
"6.2.17 取消暂停"
docker unpause 
"6.2.18 容器重命名"
docker rename 旧容器名 新容器名

6.3 示例:运行 CentOS 镜像

#下载镜像创建容器

docker search centos
docker pull centos
交互式运行容器(-it)

# 根据centos:latest镜像运行容器,并以交互式模式进入容器中,但exit退出之后,容器会自动销毁
docker run --name mycentos -it --net host centos:latest /bin/bash
# 实际上是在Docker容器中运行了一个精简版的CentOS系统
# 退出并关闭容器
exit 
# 退出不关闭容器
Ctrl + P + Q
# 列出所有的容器
docker ps -a
docker start mycentos
docekr stop mycentos
docker rm mycentos
强制删除所有容器

docker rm -f $(docker ps -aq)
2.守护式运行容器(-d)

根据centos:latest镜像运行容器,并以守护式运行容器

docker run --name mycentos --net host -d centos:latest
进入正在运行的容器中并开启一个交互模式的终端,可以在容器中执行操作(exit退出后容器不会销毁)

docker exec -it mycentos /bin/bash

7 总结

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐