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 | 当容器命令运行结束后,自动删除容器,自动释放资源, |
–privileged | 特权模式,无特权模式在容器中很多命令无法运行 |
–restart | 容器退出时重启策略,默认为no,可选值: 如果创建时未指定 ,可通过update命令设置: |
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 的两倍。 |
–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