docker基础用法及镜像和容器的常用命令大全

墨蓝 2024-03-26 14:14 197阅读 0赞

1.docker 体系架构

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

ad7aeecb57da860d554ca70b1397d42c.png

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

  1. # step 1: 安装必要的一些系统工具
  2. sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  3. # Step 2: 添加软件源信息
  4. sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  5. # Step 3
  6. sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
  7. # Step 4: 更新并安装Docker-CE
  8. sudo yum makecache fast
  9. sudo yum -y install docker-ce
  10. # Step 4: 开启Docker服务
  11. sudo systemctl restart docker
  12. #Docker-compose安装
  13. 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
  14. sudo chmod +x /usr/local/bin/docker-compose
  15. docker-compose --version

2.1 基本术语

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

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

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

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

Docker镜像默认存储在 /var/lib/docker/,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负责创建,容器之间彼此隔离

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

  1. /bin/ls 执行程序文件
  2. ls /etc 进程
  3. 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 版本较老,建议卸载后,安装新版

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

4.2.2 Ubuntu 安装 docker-ce 环境

  1. #参考文档
  2. https://docs.docker.com/engine/install/debian/
  3. https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
  4. #卸载旧版
  5. sudo apt-get remove docker docker-engine docker.io containerd runc
  6. #安装依赖
  7. sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
  8. #信任 Docker 的 GPG 公钥(发行版不同,下面的内容也有所不同)
  9. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  10. #添加仓库(发行版不同,下面的内容也有所不同)
  11. sudo add-apt-repository \
  12. "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
  13. $(lsb_release -cs) \
  14. stable"
  15. #安装docker-ce
  16. sudo apt update
  17. sudo apt install docker-ce docker-ce-cli containerd.io
  18. # 指定安装版本
  19. apt install docker-ce=5:19.03.15~3-0~ubuntu-bionic docker-ce-cli=5:19.03.15~3-0~ubuntu-bionic
  20. #检查是否安装成功
  21. [root@docker ~]# docker run hello-world
  22. Hello from Docker!
  23. This message shows that your installation appears to be working correctly.
  24. To generate this message, Docker took the following steps:
  25. 1. The Docker client contacted the Docker daemon.
  26. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
  27. (amd64)
  28. 3. The Docker daemon created a new container from that image which runs the
  29. executable that produces the output you are currently reading.
  30. 4. The Docker daemon streamed that output to the Docker client, which sent it
  31. to your terminal.
  32. To try something more ambitious, you can run an Ubuntu container with:
  33. $ docker run -it ubuntu bash
  34. Share images, automate workflows, and more with a free Docker ID:
  35. https://hub.docker.com/
  36. For more examples and ideas, visit:
  37. https://docs.docker.com/get-started/

4.3 Docker镜像加速

  1. 使用阿里云提供的镜像加速(镜像仓库),也可以使用网易云等;
  2.     步骤:
  3.       ①.注册并登陆“阿里云的开发者平台”http://dev.aliyun.com;
  4.       ②.查看专属的加速器地址;
  5.       ③.配置自己的Docker加速器;
  6. vi /etc/docker/daemon.json
  7. {
  8. "exec-opts": ["native.cgroupdriver=systemd"],
  9. "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
  10. }
  11.     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

后面跟待完成的命令

  1. #示例
  2. # 下载和运行镜像一步完成
  3. root@RS1:~# docker run -it nginx /bin/bash
  4. Unable to find image 'nginx:latest' locally
  5. latest: Pulling from library/nginx
  6. b4d181a07f80: Already exists
  7. 66b1c490df3f: Pull complete
  8. d0f91ae9b44c: Pull complete
  9. baf987068537: Pull complete
  10. 6bbc76cbebeb: Pull complete
  11. 32b766478bc2: Pull complete
  12. Digest: sha256:8df46d7414eda82c2a8c9c50926545293811ae59f977825845dda7d558b4125b
  13. Status: Downloaded newer image for nginx:latest
  14. root@2e1e48cd50c7:/#
  15. #5.2 容器后台运行的特点
  16. 如果没有永久运行的程序,终端退出(exit)容器就会马上退出
  17. "容器永久运行的条件:需要有永久运行的程序,并且使用 docker run -d 后台启动容器"
  18. "常见的坑:docker 容器使用后台运行,必须要有一个前台进程,docker发现没有应用,就会自动停止"
  19. # 在container中启动一个长久运行的进程,不断向stdin输出 hello world 。模拟一个后台运行的服务
  20. docker run --name mycentos -d centos:7 /bin/bash -c "while true;do echo hello world; sleep 3; done"
  21. # 进入容器
  22. docker exec -it mycentos /bin/bash
  23. # 查看容器日志
  24. docker logs -tf --tail 10 mycentos
  25. # -tf 显示日志
  26. # --tail number 要显示日志条数

6. Docker常用命令

  1. # 输入docker可以查看docker的命令用法,输入docker COMMAND --help 查看指定命令的详细用法
  2. docker 命令 --help
  3. # 查看docker版本信息
  4. root@RS1:~# docker version
  5. Client: Docker Engine - Community
  6. Version: 20.10.7
  7. API version: 1.41
  8. Go version: go1.13.15
  9. Git commit: f0df350
  10. Built: Wed Jun 2 11:56:40 2021
  11. OS/Arch: linux/amd64
  12. Context: default
  13. Experimental: true
  14. Server: Docker Engine - Community
  15. Engine:
  16. Version: 20.10.7
  17. API version: 1.41 (minimum version 1.12)
  18. Go version: go1.13.15
  19. Git commit: b0f5bc3
  20. Built: Wed Jun 2 11:54:48 2021
  21. OS/Arch: linux/amd64
  22. Experimental: false
  23. containerd:
  24. Version: 1.4.6
  25. GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d
  26. runc:
  27. Version: 1.0.0-rc95
  28. GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
  29. docker-init:
  30. Version: 0.19.0
  31. GitCommit: de40ad0
  32. root@RS1:~#
  33. # 查看docker更详细的信息,包括镜像和容器的数量
  34. root@RS1:~# docker info
  35. Client:
  36. Context: default
  37. Debug Mode: false
  38. Plugins:
  39. app: Docker App (Docker Inc., v0.9.1-beta3)
  40. buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
  41. scan: Docker Scan (Docker Inc., v0.8.0)
  42. Server:
  43. Containers: 3
  44. Running: 0
  45. Paused: 0
  46. Stopped: 3
  47. Images: 4
  48. Server Version: 20.10.7
  49. Storage Driver: overlay2
  50. Backing Filesystem: extfs
  51. Supports d_type: true
  52. Native Overlay Diff: true
  53. userxattr: false
  54. Logging Driver: json-file
  55. Cgroup Driver: cgroupfs
  56. Cgroup Version: 1
  57. Plugins:
  58. Volume: local
  59. Network: bridge host ipvlan macvlan null overlay
  60. Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
  61. Swarm: inactive
  62. Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
  63. Default Runtime: runc
  64. Init Binary: docker-init
  65. containerd version: d71fcd7d8303cbf684402823e425e9dd2e99285d
  66. runc version: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
  67. init version: de40ad0
  68. Security Options:
  69. apparmor
  70. seccomp
  71. Profile: default
  72. Kernel Version: 4.15.0-143-generic
  73. Operating System: Ubuntu 18.04.4 LTS
  74. OSType: linux
  75. Architecture: x86_64
  76. CPUs: 4
  77. Total Memory: 1.946GiB
  78. Name: RS1
  79. ID: 5RW4:7Z37:G2RU:BXH6:6U62:53TS:AIOQ:Z7C4:EHRQ:G5HV:VIRK:FGXY
  80. Docker Root Dir: /var/lib/docker
  81. Debug Mode: false
  82. Registry: https://index.docker.io/v1/
  83. Labels:
  84. Experimental: false
  85. Insecure Registries:
  86. 127.0.0.0/8
  87. Live Restore Enabled: false
  88. WARNING: No swap limit support
  89. root@RS1:~#

6.1 镜像操作

  1. "6.1.1 搜索镜像"
  2. docker search 关键字
  3. 示例
  4. # 通过搜索来过滤
  5. # 搜索出来的镜像就是STARS大于3000的
  6. docker search mysql --filter=STARS=3000
  7. #可以在 Docker Hub 网站查看镜像的详细信息,如镜像的 tag 标签,OFFICIAL 为 [ok] 的是官方镜像,可以放心使用。
  8. 示例
  9. root@RS1:~# docker search nginx
  10. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  11. nginx Official build of Nginx. 15141 [OK]
  12. jwilder/nginx-proxy Automated Nginx reverse proxy for docker con 2041 [OK]
  13. richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of 816 [OK]
  14. jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho 211
  15. linuxserver/nginx An Nginx container, brought to you by LinuxS 147
  16. tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp 132 [OK]
  17. jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager 122 [OK]
  18. alfg/nginx-rtmp NGINX, nginx-rtmp-module and FFmpeg from sou 101 [OK]
  19. jasonrivers/nginx-rtmp Docker images to host RTMP streams using NGI 91 [OK]
  20. nginxdemos/hello NGINX webserver that serves a simple page co 70 [OK]
  21. privatebin/nginx-fpm-alpine PrivateBin running on an Nginx, php-fpm & Al 56 [OK]
  22. nginx/nginx-ingress NGINX and NGINX Plus Ingress Controllers fo 55
  23. nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 42
  24. staticfloat/nginx-certbot Opinionated setup for automatic TLS certs lo 23 [OK]
  25. nginx/nginx-prometheus-exporter NGINX Prometheus Exporter for NGINX and NGIN 19
  26. schmunk42/nginx-redirect A very simple container to redirect HTTP tra 19 [OK]
  27. centos/nginx-112-centos7 Platform for running nginx 1.12 or building 15
  28. centos/nginx-18-centos7 Platform for running nginx 1.8 or building n 13
  29. raulr/nginx-wordpress Nginx front-end for the official wordpress:f 13 [OK]
  30. bitwarden/nginx The Bitwarden nginx web server acting as a r 11
  31. flashspys/nginx-static Super Lightweight Nginx Image 10 [OK]
  32. mailu/nginx Mailu nginx frontend 9 [OK]
  33. sophos/nginx-vts-exporter Simple server that scrapes Nginx vts stats a 7 [OK]
  34. ansibleplaybookbundle/nginx-apb An APB to deploy NGINX 2 [OK]
  35. wodby/nginx Generic nginx 1 [OK]
  36. root@RS1:~#
  37. "6.1.2 下载镜像"
  38. docker pull 镜像名[:tag]
  39. [:tag] 表示软件的版本,如果不指定 tag 默认是 latest
  40. #示例:下载指定版本的 nginx
  41. root@RS1:~# docker pull nginx:1.14.1
  42. 1.14.1: Pulling from library/nginx
  43. a5a6f2f73cd8: Pull complete
  44. 2343eb083a4e: Pull complete
  45. 251439d5b33c: Pull complete
  46. Digest: sha256:32fdf92b4e986e109e4db0865758020cb0c3b70d6ba80d02fe87bad5cc3dc228
  47. Status: Downloaded newer image for nginx:1.14.1
  48. docker.io/library/nginx:1.14.1
  49. root@RS1:~#
  50. #示例:下载最新版本的 redis
  51. # 如果不指定 tag 默认是 latest
  52. root@RS1:~# docker pull redis
  53. Using default tag: latest
  54. latest: Pulling from library/redis
  55. b4d181a07f80: Pull complete
  56. 86e428f79bcb: Pull complete
  57. ba0d0a025810: Pull complete
  58. ba9292c6f77e: Pull complete
  59. b96c0d1da602: Pull complete
  60. 5e4b46455da3: Pull complete
  61. Digest: sha256:8b8d1c205e0149483f320ed234debaed7091f18b6c1d47bf1720951cd2161bfc
  62. Status: Downloaded newer image for redis:latest
  63. docker.io/library/redis:latest
  64. root@RS1:~#
  65. "6.1.3 上传镜像"
  66. #推送一个镜像到镜像仓库
  67. docker push 镜像名[:tag]
  68. "6.1.4 查看镜像"
  69. # 查看所有本地主机上的镜像(活动的)
  70. docker images
  71. # 列出所有的镜像(包含非活动)
  72. docker images -a
  73. # 只显示镜像的id
  74. docker images -q
  75. docker image ls(新版本docker
  76. #示例
  77. root@RS1:~# docker images
  78. REPOSITORY TAG IMAGE ID CREATED SIZE
  79. redis latest 08502081bff6 2 weeks ago 105MB
  80. hello-world latest d1165f221234 4 months ago 13.3kB
  81. nginx 1.14.1 5f2d4477b7ea 2 years ago 109MB
  82. root@RS1:~#
  83. "6.1.5 获取镜像的元信息(详细信息)"
  84. docker inspect 镜像名或镜像ID
  85. docker image inspect 镜像名或镜像ID
  86. "6.1.6 删除镜像"
  87. docker rmi 镜像ID或镜像名[:tag]
  88. docker rmi -f 镜像ID或镜像名[:tag] # 删除指定的本地镜像,-f表示强制删除
  89. docker image rm 镜像ID或镜像名[:tag]
  90. #示例:删除所有的镜像
  91. docker rmi -f $(docker images -aq)
  92. "6.1.7 prune"
  93. #移除未使用的镜像,没有被标记或被任何容器引用的
  94. docker image prune
  95. "6.1.8 历史记录"
  96. #查看镜像的变更历史
  97. docker history 镜像ID或镜像名
  98. #示例
  99. [root@RS2 ~]# docker images
  100. REPOSITORY TAG IMAGE ID CREATED SIZE
  101. nginx latest 4cdc5dd7eaad 5 days ago 133MB
  102. [root@RS2 ~]# docker history nginx
  103. IMAGE CREATED CREATED BY SIZE COMMENT
  104. 4cdc5dd7eaad 5 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
  105. <missing> 5 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
  106. <missing> 5 days ago /bin/sh -c #(nop) EXPOSE 80 0B
  107. <missing> 5 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
  108. <missing> 5 days ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB
  109. <missing> 5 days ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
  110. <missing> 5 days ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB
  111. <missing> 5 days ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB
  112. <missing> 5 days ago /bin/sh -c set -x && addgroup --system -… 63.9MB
  113. <missing> 5 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~buster 0B
  114. <missing> 5 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.6.1 0B
  115. <missing> 5 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.21.1 0B
  116. <missing> 2 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
  117. <missing> 2 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
  118. <missing> 2 weeks ago /bin/sh -c #(nop) ADD file:4903a19c327468b0e… 69.3MB
  119. [root@RS2 ~]#
  120. "6.1.8 构建镜像"
  121. docker build -f Dockerfile文件的路径 -t 镜像名:tag 命令执行的上下文
  122. #示例:使用Dockerfile构建镜像
  123. docker build -f Dockerfile -t harbor.test.com/os/tomcat:v1 . # 注意最后的点号不能省略
  124. "6.1.9 设置镜像标签"
  125. #创建一个引用源镜像标记目标镜像
  126. docker tag tomcat:v1 harbor.test.com/os/tomcat:v1
  127. "6.1.10 导出容器文件系统到tar归档文件”
  128. docker export
  129. "6.1.11 导入容器文件系统tar归档文件创建镜像"
  130. docker import
  131. "6.1.12 保存镜像"
  132. #保存一个或多个镜像到一个tar归档文件(可应用于无法联网的机器)
  133. docker image save nginx |gzip >nginx.tar.gz
  134. "6.1.13 加载镜像"
  135. #加载来自tar归档或标准输入的镜像(可应用于无法联网的机器)
  136. docker image load -i nginx.tar.gzdocker load < nginx.tar.gz

6.2 容器操作

  1. "6.2.1 运行容器"
  2. #示例:启动容器并以 bash 形式进入
  3. 注意:有些容器没有 bash 环境,需要使用 /bin/sh 或其他 shell 环境进入
  4. docker run -p 80:8080 -it --name webserver webserver:1.1 /bin/bash
  5. #示例:启动容器并在后台运行
  6. docker run -p 80:8080 -itd --name webserver webserver:1.1 /bin/bash
  7. #示例:启动容器并在后台运行,并传入指定参数(相当于创建dockerfile的ENV)
  8. docker run \
  9. -p 80:8080 \
  10. --name webserver \
  11. -e project_name="webserver" \
  12. -d webserver:1.1
  13. #示例:启动容器并在后台运行,并指定所在网络
  14. docker run \
  15. -p 80:8080 \
  16. --name webserver \
  17. --network myweb \
  18. -d webserver:1.1
  19. #示例:启动容器,并指定路径映射
  20. docker run \
  21. -p 80:8080 \
  22. --name webserver \
  23. --network web_net \
  24. -e project_name="webserver" \
  25. -v /search/webserver/logs:/search/webserver/logs \
  26. -itd webserver:1.1 /bin/bash
  27. #示例:启动容器,指定host网络并指定路径映射
  28. docker run \
  29. -p 80:8080 \
  30. --name webserver \
  31. --network host \
  32. -e project_name="webserver" \
  33. -v /search/webserver/logs:/search/webserver/logs \
  34. -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 资源限制

  1. "6.2.2.1 内存限额"
  2. # 允许容器最多使用500M内存和100M的Swap,并禁用OOM Killer
  3. docker run \
  4. --name web1 \
  5. -m 500m \
  6. --memory-swap=600m \
  7. --oom-kill-disable \
  8. -d nginx
  9. docker stats --no-stream web
  10. # 默认情况下,上面两组参数为 -1,即对容器内存和 swap 的使用没有限制。
  11. "6.2.2.2 CPU限额"
  12. # 允许容器最多使用一个半的CPU
  13. docker run --name web1 --cpus="1.5" -d nginx
  14. # 允许容器最多使用50%的CPU
  15. docker run --name web2 --cpus=".5" -d nginx
  16. # 容器实例分配512权重的cpu使用资源
  17. docker run -it --cpu-shares 512 centos /bin/bash/
  18. # cat /sys/fs/cgroup/cpu/cpu.shares
  19. "6.2.2.3 I/O限额"
  20. # bps 是 byte per second,每秒读写的数据量。
  21. # iops 是 io per second,每秒 IO 的次数。
  22. # 可通过以下参数控制容器的 bps 和 iops
  23. # 下面这个例子限制容器写 /dev/sda 的速率为 30 MB/s
  24. 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 查看容器

  1. # 查看(运行态)容器
  2. docker ps
  3. docker container ls
  4. # 查看(包含非运行态)容器
  5. docker ps -a
  6. docker container ls -a
  7. # 只显示容器
  8. IDdocker ps -q
  9. # 显示最近创建的容器
  10. docker ps -a -n=1























参数

解释

-a

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

-l

获得最新的容器信息

-q

只显示容器的ID

-n=?

显示最近创建的容器

  1. "6.2.4 启动容器"
  2. docker start 容器ID或容器名称
  3. #示例
  4. root@RS1:~# docker ps -a
  5. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  6. 0ee82d82570e nginx "/docker-entrypoint.…" 14 hours ago Exited (137) 14 hours ago wonderful_herschel
  7. 2e1e48cd50c7 nginx "/docker-entrypoint.…" 14 hours ago Exited (0) 14 hours ago adoring_bell
  8. 6e71462510b9 hello-world "/hello" 15 hours ago Exited (0) 15 hours ago priceless_dijkstra
  9. root@RS1:~# docker start 2e1e48cd50c7
  10. 2e1e48cd50c7
  11. root@RS1:~# docker ps
  12. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  13. 2e1e48cd50c7 nginx "/docker-entrypoint.…" 14 hours ago Up 3 seconds 80/tcp adoring_bell
  14. root@RS1:~#
  15. "6.2.5 停止容器"
  16. #停止当前正在运行的容器
  17. docker stop 容器ID或容器名称
  18. #示例:停止全部运行中的容器
  19. docker stop $(docker ps -q)
  20. "6.2.6 重启容器"
  21. docker restart 容器ID或容器名称
  22. "6.2.7 kill 容器"
  23. #强制停止(杀死)当前容器
  24. docker kill 容器ID
  25. "6.2.8 删除容器"
  26. # 删除(非运行)态容器
  27. docker rm 容器ID
  28. docker rm 容器名称
  29. # 删除(运行态的)容器需要先将容器关闭
  30. docker stop containerID
  31. docker rm containerID
  32. # 强制删除容器(不管容器是否在运行)
  33. docker rm -f containerID # -f:表示强制删除
  34. # 删除所有(运行和非运行的)容器
  35. docker rm -f $(docker ps -aq)
  36. # 删除所有(运行和非运行的)容器
  37. docker ps -a -q | xargs docker rm -f
  38. #示例:删除所有(运行和非运行的)容器
  39. [root@RS1 ~]# docker ps -a
  40. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  41. 0ee82d82570e nginx "/docker-entrypoint.…" 15 hours ago Exited (137) 15 hours ago wonderful_herschel
  42. 2e1e48cd50c7 nginx "/docker-entrypoint.…" 15 hours ago Up 21 minutes 80/tcp adoring_bell
  43. 6e71462510b9 hello-world "/hello" 15 hours ago Exited (0) 15 hours ago priceless_dijkstra
  44. [root@RS1 ~]# docker rm -f $(docker ps -aq)
  45. 0ee82d82570e
  46. 2e1e48cd50c7
  47. 6e71462510b9
  48. [root@RS1 ~]# docker ps -a
  49. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  50. [root@RS1 ~]#
  51. "6.2.9 容器日志"
  52. #获取容器的日志(容器的ID可以写全,也可以不写全,唯一即可)
  53. docker logs 容器id或容器名称
  54. #示例
  55. [root@slave4 ~]# docker run \
  56. > --privileged \
  57. > -p 6379:6379 \
  58. > -p 16379:16379 \
  59. > --name redis-node \
  60. > -v /apps/redis/data:/data \
  61. > -v /apps/redis/conf/redis.conf:/etc/redis/redis.conf \
  62. > --net host \
  63. > -d redis:5.0 \
  64. > redis-server /etc/redis/redis.conf
  65. Unable to find image 'redis:5.0' locally
  66. 5.0: Pulling from library/redis
  67. bf5952930446: Pull complete
  68. 911b8422b695: Pull complete
  69. 093b947e0ade: Pull complete
  70. 2e4ea19ac656: Pull complete
  71. 62403d50d101: Pull complete
  72. 3a097fa7018a: Pull complete
  73. Digest: sha256:50e8ee4558b11cdc12b9a94497697190bc8d77e6c15aa6af045a64f6a68f5f48
  74. Status: Downloaded newer image for redis:5.0
  75. WARNING: Published ports are discarded when using host network mode
  76. 38e49f7a359ad6be30e9777e75656a664e1b323d37325bd8387cbe130a96d6d6
  77. [root@slave4 ~]# docker ps
  78. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  79. [root@slave4 ~]# docker ps -a
  80. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  81. 38e49f7a359a redis:5.0 "docker-entrypoint.s…" About a minute ago Exited (1) About a minute ago redis-node
  82. [root@slave4 ~]# docker logs 38e49f7a359a
  83. *** FATAL CONFIG FILE ERROR ***
  84. Reading the configuration file, at line 11
  85. >>> 'logfile /var/log/redis.log'
  86. Can't open the log file: Permission denied
  87. [root@slave4 ~]#
  88. #示例:查看指定时间后的日志,只显示最后100行
  89. docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID
  90. #示例:查看最近30分钟的日志
  91. docker logs --since 30m CONTAINER_ID
  92. #示例:查看某时间之后的日志
  93. docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID
  94. #示例:查看某时间段日志
  95. docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID
  96. "6.2.10 进入容器"
  97. #进入正在运行的容器中并开启一个交互模式的终端,可以在容器中执行操作
  98. docker exec 进入容器后开启一个新的终端,可以在里面操作(常用)
  99. docker exec -it 容器id或容器名称 /bin/bash
  100. docker attach 进入容器正在执行的终端,不会启动新的进程
  101. docker attach 容器id或容器名称
  102. "6.2.11 拷贝文件"
  103. #将宿主机中的文件拷贝到容器中指定的目录中
  104. docker cp 主机中的文件路径 容器ID或容器名称:容器路径
  105. #将容器中的文件拷贝到宿主机的指定目录中
  106. docker cp 容器ID或容器名称:容器中的路径 主机路径
  107. #示例
  108. docker cp web:/usr/local/tomcat/conf/server.xml /tmp
  109. "6.2.12 获取容器的元信息(详细信息,如IP地址等)"
  110. docker inspect 容器ID或容器名称
  111. #示例:查找配置文件
  112. "场景:今天发现一个报警,查找之后发现是 nginx 反向代理配置,而由于没有交接,需要找出 nginx 配置文件在物理机中的部署位置,或者说,原来部署 docker 的详细配置项"
  113. root@gz-manage16:~# docker ps
  114. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  115. 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
  116. root@gz-manage16:~#
  117. root@gz-manage16:~# docker inspect f508a5397ee9
  118. [
  119. ......
  120. "Mounts": [
  121. {
  122. "Type": "bind",
  123. "Source": "/opt/es-stack-compose/nginx/nginx.conf",
  124. "Destination": "/etc/nginx/nginx.conf",
  125. "Mode": "rw",
  126. "RW": true,
  127. "Propagation": "rprivate"
  128. },
  129. {
  130. "Type": "bind",
  131. "Source": "/opt/es-stack-compose/nginx/logs",
  132. "Destination": "/var/log/nginx",
  133. "Mode": "rw",
  134. "RW": true,
  135. "Propagation": "rprivate"
  136. },
  137. {
  138. "Type": "bind",
  139. "Source": "/opt/es-stack-compose/nginx/conf.d",
  140. "Destination": "/etc/nginx/conf.d",
  141. "Mode": "rw",
  142. "RW": true,
  143. "Propagation": "rprivate"
  144. }
  145. ],
  146. ......
  147. ]
  148. "6.2.13 查看容器中进程信息"
  149. docker top 容器ID或容器名称
  150. #示例
  151. [root@RS1 ~]# docker ps
  152. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  153. 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
  154. 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
  155. 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
  156. [root@RS1 ~]# docker top 713ad3324392
  157. UID PID PPID C STIME TTY TIME CMD
  158. root 4059 4028 0 01:46 ? 00:00:00 nginx: master process nginx -g daemon off;
  159. systemd+ 4133 4059 0 01:46 ? 00:00:00 nginx: worker process
  160. systemd+ 4134 4059 0 01:46 ? 00:00:00 nginx: worker process
  161. systemd+ 4135 4059 0 01:46 ? 00:00:00 nginx: worker process
  162. systemd+ 4136 4059 0 01:46 ? 00:00:00 nginx: worker process
  163. [root@RS1 ~]#
  164. "6.2.14 列出或指定容器端口映射"
  165. docker port 容器ID或容器名称
  166. #示例
  167. [root@RS1 ~]# docker ps
  168. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  169. 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
  170. 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
  171. 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
  172. [root@RS1 ~]# docker port 713ad3324392
  173. 80/tcp -> 0.0.0.0:83
  174. 80/tcp -> :::83
  175. [root@RS1 ~]#
  176. "6.2.15 显示容器资源使用统计"
  177. docker stats 容器ID或容器名称
  178. #示例
  179. [root@RS1 ~]# docker ps
  180. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  181. 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
  182. 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
  183. 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
  184. [root@RS1 ~]# docker stats f6271f4335ef
  185. CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
  186. f6271f4335ef nginx-1 0.06% 43.3MiB / 1.946GiB 2.17% 9.79MB / 336kB 31.4MB / 14.6MB 5
  187. CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
  188. f6271f4335ef nginx-1 0.06% 43.3MiB / 1.946GiB 2.17% 9.79MB / 336kB 31.4MB / 14.6MB 5
  189. ......
  190. "6.2.16 暂停容器"
  191. docker pause 容器ID
  192. "6.2.17 取消暂停"
  193. docker unpause
  194. "6.2.18 容器重命名"
  195. docker rename 旧容器名 新容器名

6.3 示例:运行 CentOS 镜像

  1. #下载镜像创建容器
  2. docker search centos
  3. docker pull centos
  4. 交互式运行容器(-it
  5. # 根据centos:latest镜像运行容器,并以交互式模式进入容器中,但exit退出之后,容器会自动销毁
  6. docker run --name mycentos -it --net host centos:latest /bin/bash
  7. # 实际上是在Docker容器中运行了一个精简版的CentOS系统
  8. # 退出并关闭容器
  9. exit
  10. # 退出不关闭容器
  11. Ctrl + P + Q
  12. # 列出所有的容器
  13. docker ps -a
  14. docker start mycentos
  15. docekr stop mycentos
  16. docker rm mycentos
  17. 强制删除所有容器
  18. docker rm -f $(docker ps -aq)
  19. 2.守护式运行容器(-d
  20. 根据centos:latest镜像运行容器,并以守护式运行容器
  21. docker run --name mycentos --net host -d centos:latest
  22. 进入正在运行的容器中并开启一个交互模式的终端,可以在容器中执行操作(exit退出后容器不会销毁)
  23. docker exec -it mycentos /bin/bash

7 总结

1ba3b64f15ffba69d26cd6feaf2d6c46.png

#

发表评论

表情:
评论列表 (有 0 条评论,197人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redis命令用法大全

    > 最近面试了很多java开发,简历上清一色的写着熟练使用redis,但是只能回答redis是什么,缓存雪崩、缓存穿透是什么意思等常见面试问题,就连redis常用命令都说不上来