Docker 的容器管理

1、Docker 基础概念

1.1、Docker 的三要素

容器(Container):展开运行的运行环境,类比于虚拟机
镜像(image):运行环境的封装
创库(Repository):存放镜的位置

2、Docker 基础命令

2.1、命令格式

格式:docker + 命令关键字(COMMAND) + 一系列的参数

2.2、进程相关命令

查看守护进程的系统资源设置
命令:docker info

Docker 的容器管理_第1张图片
Docker 的容器管理_第2张图片

Docker 仓库内镜像的查询
命令:docker search 镜像名
Docker 的容器管理_第3张图片

Docker 仓库镜像的下载
命令:docker pull
查看本地仓库下 Docker 镜像
命令:docker images
在这里插入图片描述

Docker 镜像的删除
命令:docker rmi [image ID](repository:Tag)-f(force)
选项:-f:强制删除
删除镜像前先删除容器
命令:docker rm 容器名
在这里插入图片描述

容器的查询(正在运行的)(-a为所有容器)
命令:docker ps (-a)
在这里插入图片描述

将镜像启动为容器
命令:docker run
容器的启动/停止
命令:docker start/stop/restart
Docker 指令除了单条使用外,还支持赋值、解析变量、嵌套使用
列出所有的容器 ID号
命令:docker ps -a -q
删除多个容器
命令:docker rm -f $( docker -ps -a -q )

2.3、单一容器相关命令

每个容器被创建后,都会分配一个 CONTAINER ID 作为容器的唯一标示,后续对容器的启动、停止、修改、删除等所有操作,都是通过 CONTAINER ID 来完成,类似于数据库概念中的主键。
查看完整信息
命令: docker ps --no-trunc
选项:–no-trunc ~不截取字段的显示所有信息
在这里插入图片描述

开始/停止
命令: docker stop/start CONTAINER ID
通过容器别名启动/停止
命令: docker start/stop MywordPress
查看容器所有详细信息(以json格式)
命令: docker inspect MywordPress
查看容器日志(用户的前台运行日志)
命令: docker logs MywordPress
查看容器所占用的系统资源,每秒更新
命令: docker stats MywordPress
在这里插入图片描述

容器执行命令
命令: docker exec 容器名 容器内执行的命令
Docker 的容器管理_第4张图片

登入容器的bash
命令: docker exec -it 容器名 /bin/bash
选项:-it:i 交互模式,t 登录的tty窗口
Docker 的容器管理_第5张图片

将镜像保存到本地
命令: docker save -o [指定地址和文件名] [镜像名]

2.4、run 基础命令

命令: docker run
选项

--restart=always   			容器会随着 Docker 进程的启动而启动
# 运行一个镜像为容器
docker run --name [容器名] --restart=always -d [镜像名]
# 重启 Docker 
systemctl restart docker
# 查看 Docker 信息
docker ps -a
# 显示上面运行的容器已启动,未加--restart=always选项的镜像未启动
-h x.xx.xx	 				设置容器主机名
# 默认主机名是容器的序列号
# 运行一个镜像为容器
docker run --name [容器名] -h [主机名] -d [镜像名]
# 进入容器内部
docker exec -it [容器名] /bin/bash
# 查看主机名
    hostname
并将主机名写入 /etc/hosts 文件中,便于多容器管理,
--dns xx.xx.xx.xx	 		设置容器使用的 DNS 服务器
# 运行一个镜像为容器
docker run --name [容器名] -dns 8.8.8.8 -d [镜像名]
DNS 为 8.8.8.8
--dns-search				DNS 搜索设置
--add-host hostname:IP		注入 hostname <> IP 解析
# 运行一个镜像为容器
docker run --name [容器名] --add-host www.hx.com:1.1.1.1 -d [镜像名]
# 添加新的解析记录
主机名为:www.hx.com
IP地址为:1.1.1.1
--rm						容器关闭后自动删除
# 运行一个镜像为容器
docker run --name [容器名] --rm -d [镜像名]
# 关闭所有容器
docker stop $(docker ps -a -q)
# 查看所有容器
docker ps -a
结果:
    在此结果列表中没有该容器,已自动删除。

3、多容器管理

3.1、Docker 三剑客

docker-compose:多容器管理工具,成为行业交互的标准(存在的原因)
docker-swarm:docker集群化的管理方案,(资源管理器)
docker-machine:以容器化的方案伪装成虚拟机(更极简的界面体验swarm集群)

3.2、Docker-Compose

 Docker-Compose是基于 Yaml 格式的资源清单

3.2.1、Docker-Compose 的功能

①、多容器管理工具;
②、定义了多容器之间的相互管理方式。

3.2.2、ini 格式

OpenStack 主要应用此种数据格式。
优点:条理清楚。
缺点:不同的标签下有相同的选项,不便于识别。

[xxxx]
hostname
user
passwd

[xxx]
sdsadsa
dasdas
dasdas

3.2.3、Yaml 格式

简单,便于人类阅读识别。

4、Yaml 语法

4.1、特点

YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便,YAML 语言的设计目标,就是方便人类读写。它实质上是一种通用的数据**串行化**格式。
缺点:效率跟 json 相比较较低,

4.2、基本语法规则

①、大小写敏感
②、使用缩进表示层级关系
③、 缩进是不使用 tab 键,只允许使用空格
④、缩进的空格数目不重要,只要相同层级左侧的元素对其即可(一般为两个空格)
⑤、 " # " 表示注释,从这个字符一直到行尾都会被解释器忽略

4.3、数据类型

4.3.1、对象类型

对象是一组键值对,使用冒号结构表示

name: zhangsan
age: 18

hash: {name: zhangsan, age: 18}

4.3.2、数据类型

一组连词线开头的行,构成一个数组

-
  - zhangsan
  - lisi
  - wangwu
  
{name: ['zhangsan', 'lisi', 'wangwu']}

4.3.3、复合结构

对象和数组可以结合使用,形成复合结构

languages:
 - Ruby
 - Perl
 - Python 
websites:
 YAML: yaml.org 
 Ruby: ruby-lang.org 
 Python: python.org 
 Perl: use.perl.org 

4.3.4、纯量

纯量是最基本的、不可再分的值

- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间
- 日期

4.3.5、纯量类型

# 数值直接以字面量的形式表示
number: 12.30

# 布尔值用 true 和 false 表示
isSet: true

# null 用 ~ 表示
parent: ~ 

# 时间采用 ISO8601 格式
iso8601: 2001-12-14t21:59:43.10-05:00

# 日期采用复合 iso8601 格式的年、月、日表示
date: 1976-07-31

# YAML 允许使用两个感叹号,强制转换数据类型
e: !!str 123
f: !!str true

# 字符串默认不使用引号表示
str: 这是一行字符串

# 如果字符串之中包含空格或特殊字符,需要放在引号之中
str: '内容: 字符串'

# 单引号和双引号都可以使用,双引号不会对特殊字符转义
s1: '内容\n字符串'
s2: "内容\n字符串"

# 单引号之中如果还有单引号,必须连续使用两个单引号转义
str: 'labor''s day' 

# 字符串可以写成多行,从第二行开始,必须有一个单空格缩进\
# 换行符会被转为空格
str: 这是一段
  多行
  字符串
## { str: '这是一段 多行 字符串' }

# 多行字符串可以使用|保留换行符,也可以使用>折叠换行
this: |
  Foo
  Bar
that: >
  Foo
  Bar
## { this: 'Foo\nBar\n', that: 'Foo Bar\n' }

# +表示保留文字块末尾的换行,-表示删除字符串末尾的换行
s1: |
  Foo
 
s2: |+
  Foo
 
s3: |-
  Foo
  
## { s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }

# 锚点&和别名*,可以用来引用
defaults: &defaults
  adapter:  postgres
  host:     localhost
 
development:
  database: myapp_development
  <<: *defaults
 
test:
  database: myapp_test
  <<: *defaults

5、Docker-Compose 语法

5.1、image 字段-----(定义镜像)

services:
  web:
    image: hello-world

# 镜像可用格式
image: redis                      # 最新版本的镜像
image: ubuntu:14.04               # 指定版本的镜像
image: tutum/influxdb             # 个人用户级别的镜像
image: example-registry.com:4000/postgresql     #非官方仓库的镜像 
image: a4bc65fd                  # 本地镜像 ID 号

5.2、build 字段-----(创建镜像)

根据 dockerfile 文件将其转化为镜像,并使用。(消耗较低的网络带宽)

build: /path/to/build/dir

也可以是相对路径,只要上下文确定就可以读取到 Dockerfile

build: ./dir

# build 的信息
build:
  context: ../
  dockerfile: path/of/Dockerfile
   args:
    buildno: 1
    password: secret
image: webapp:tag
# 当 build 和 image 同时出现时 image后面为生成后的镜像名称及标签

5.3、command 字段

替换镜像中的默认启动命令

command: bundle exec thin -p 3000
# == 
command: [bundle, exec, thin, -p, 3000]

5.4、container_name:<项目名称><服务名称><序号>

修改运行镜像后产生容器的名称

container_name: app

5.5、depends_on-----(建立关联)

定义镜像的启动的依赖关系,据此生成镜像的启动顺序

 version: '2'
 services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

5.6、dns-----(指定DNS服务器地址)

为创建的容器配置 DNS 用于域名解析

dns: 8.8.8.8
 ​
 dns:
  - 8.8.8.8
  - 9.9.9.9

5.7、tmpfs-----(临时文件系统)

临时文件系统,用于创建临时的目录,docker 启动后创建临时目录

tmpfs: /run
tmpfs:
  - /run
  - /tmp

5.8、 entrypoint-----(替换启动脚本)

雷同 command 命令,但两者不能同时出现。若出现,最后出现的生效

entrypoint: /code/entrypoint.sh

5.9、env_file-----(文件形式添加环境变量)

将大量的环境变量写在一个文件下,使用此方法声明

env_file: .env
 ​ ​
 env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

5.10、environment:镜像变量

少量的环境变量使用此方法

 environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:
 
 environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

5.11、expose

定义可以暴露的端口,可以不暴露

 expose:
  - "3000"
  - "8000"

5.12、 external_links:链接外部容器

将其他容器的IP和主机名的对应关系写入 /etc/hosts 文件中,便于访问(别名的方式)

 external_links:
  - redis_1
  - project_db_1:mysql
  - project_db_1:postgresql

5.13、extra_hosts

添加 host 解析记录

 extra_hosts:
  - "somehost:162.242.195.82"
  - "otherhost:50.31.209.229"

5.14、labels(已弃用)

根据标签区分服务类型

labels:
 com.example.description: "Accounting webapp"
 com.example.department: "Finance"
 com.example.label-with-empty-value: ""
labels:
 - "com.example.description=Accounting webapp"
 - "com.example.department=Finance"
 - "com.example.label-with-empty-value"

5.15、links:

与 Docker client 的 --link 一样效果,会连接到其它服务中的容器,只定义一个服务下的链接

 links:
  - db
  - db:database
  - redis

5.16、 logging

指定日志的服务,用于搭建日志收集服务器

 logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

5.17、pid

 pid: "host"

5.18、port

 ports:
  - "3000"
  - "8000:8000"
  - "49100:22"
  - "127.0.0.1:8001:8001"

5.19、security_opt

为每个容器覆盖默认的标签。简单说来就是管理全部服务的标签。比如设置全部服务的user标签值为USER

security_opt:
  - label:user:USER
  - label:role:ROLE

5.20、 stop_signal

停止级别,和进程的停止级别一致,9、15级别(建议使用15级别)

 stop_signal: SIGUSR1

5.21、volumes

为容器提供一个独立于的容器生命周期以外的存储空间

 volumes:
  // 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
  - /var/lib/mysql
 
  // 使用绝对路径挂载数据卷
  - /opt/data:/var/lib/mysql
 
  // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
  - ./cache:/tmp/cache
 
  // 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
  - ~/configs:/etc/configs/:ro
 
  // 已经存在的命名的数据卷。
  - datavolume:/var/lib/mysql

5.22、volumes_from

从其它容器或者服务挂载数据卷,可选的参数是 :ro或者 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的。默认情况下是可读可写的

volumes_from:
  - service_name
  - service_name:ro
  - container:container_name
  - container:container_name:rw

5.23、cap_add, cap_drop

给 docker 容器内部赋予权限

cap_add:
  - ALL
 
 cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

5.24、extends

 extends:
  file: common.yml
  service: webapp

5.25、network_mode

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

5.26、 networks

 services:
  some-service:
    networks:
      - some-network
      - other-network

6、Example—部署WordPress博客

定义使用 docker-compose 运行一个 WordPress项目

6.1、Docker-Compose 安装

6.1.1、Docker-Compose 下载

curl -L https://get.daocloud.io/docker/compose/releases/download\
/1.28.5/docker-compose-`uname -s`-`uname -m` >\
 /usr/local/bin/docker-compose
 
 # 添加执行权限
 chmod +x /usr/local/bin/docker-compose

6.1.2、Yaml 文件编写

vim docker-compose.yaml      # 文件命令必须为docker-compose.ya(m)l

# 说明版本
 version: '2'# 定义服务
 services: 
   # 数据库容器 1
    db:
      image: mysql:5.7
      restart: always    # 进程一起启动
      environment:
        MYSQL_ROOT_PASSWORD: somewordpress
        MYSQL_DATABASE: wordpress
        MYSQL_USER: wordpress
        MYSQL_PASSWORD: wordpress
 ​
    # 博客容器 2
    wordpress:
      depends_on:
        - db
      image: wordpress:latest
      restart: always
      ports:
        - "8000:80"
      environment:
        WORDPRESS_DB_HOST: db:3306
        WORDPRESS_DB_USER: wordpress
        WORDPRESS_DB_PASSWORD: wordpress

6.1.3、查看 docker-compose 的版本

docker-compose version

6.1.4、部署 WordPress

# 必须在.yaml文件所在的目录下执行
docker-compose up -d

6.1.5、软件用法

命令:docker-compose xxx.yaml
选项

-f	   				指定使用的 yaml 文件位置
ps	   				显示所有容器信息
restart	  			重新启动容器
logs	   			查看日志信息
config -q    		验证 yaml 配置文件是否正确
stop	    		停止容器
start	   			启动容器

先检查,再启动。主要用户文件内关联关系有问题不能启动时。

up -d	  			启动容器项目
pause	    		暂停容器
unpause	  		 	恢复暂停
rm	   	        	删除容器

你可能感兴趣的:(Docker,docker,运维,容器)