docker —— 容器管理

1.Docker 基础概念及命令

Docker 基本概念

Docker 三个重要概念:仓库 (Repository)、镜像 (image) 和 容器 (Container)

例:docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress

Docker 指令的基本用法:
docker + 命令关键字(COMMAND) + 一系列的参数

基础命令

#守护进程的系统资源设置
docker info
#仓库的查询
docker search 镜像名称
#仓库的下载
docker pull 镜像名称
#镜像的查询
docker images 镜像名称
docker images 镜像名称:版本号/镜像ID号		#唯一索引查询
#镜像的删除
docker rmi 镜像名称
#镜像的强制删除,慎用,因为强制删掉镜像,容器也就不会正常运行
docker rmi -f 镜像名称/镜像名称:版本号		
#容器的删除
docker rm 容器名称
#容器的查询
docker ps
选项:-a	#查看所有
#容器的创建启动
docker run
#容器启动停止
docker start/stop

Docker 指令除了单条使用外,还支持赋值、解析变量、嵌套使用
docker rm -f $(docker ps -a -q)	
-q : 简要化输出

2.单一容器管理

​ 每个容器被创建后,都会分配一个 CONTAINER ID 作为容器的唯一标示,后续对容器的启动、停止、修改、删除等所有操作,都是通过 CONTAINER ID 来完成,偏向于数据库概念中的主键

#查看,所写的地方完全打开展示
$ docker ps --no-trunc 
#停止
$ docker stop/start CONTAINERID
#通过容器别名启动/停止
$ docker start/stop MywordPress
#查看容器所有基本信息
$ docker inspect 容器名称name
#查看容器日志
$ docker logs 容器名称name
#查看容器所占用的系统资源
$ docker stats 容器名称name
#容器执行命令
$ docker exec 容器名 容器内执行的命令
#登入容器的bash
$ docker exec -it 容器名 /bin/bash
i : 交互接口
t : tty接口
exit	#退出

run 基础命令

--restart=always		#容器的自动启动
-h x.xx.xx				#设置容器主机名
--dns xx.xx.xx.xx		#设置容器使用的 DNS 服务器
--dns-search			#DNS搜索设置
--add-host hostname:IP	 #注入 hostname <> IP 解析
--rm					#服务停止时自动删除

# 示例
1
[root@localhost ~]# docker run --name txb --restart=always -d 2c23e
85b52ab3dcdb9a3f93893eed1432d20ba75a232a61815c473f924b270f5a413d
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
85b52ab3dcdb        2c23e               "/bin/sh -c 'tail ..."   10 seconds ago      Up 8 seconds                            txb
[root@localhost ~]# systemctl restart docker
systemctl restart docker.service 
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
85b52ab3dcdb        2c23e               "/bin/sh -c 'tail ..."   2 minutes ago       Up 1 second                             txb

2
[root@localhost ~]# docker run --name lhl -h lili -d a05f
703c13c8d2465b07c3835c13223f4c6a8da818e117e1e81dc26ac9ecf05dda6a
[root@localhost ~]# docker exec -it lhl /bin/bash
root@lili:/var/www/html# hostname
lili
root@lili:/var/www/html# exit
exit

3
[root@localhost ~]# docker run --name lhllhl --add-host www.ll.com:192.168.1.111 -d a05f
d6a5a1900b7874096e7f28dc41c7e42f1156e4707d659d62eb31c5f77f8fe360
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d6a5a1900b78        a05f                "docker-entrypoint..."   10 seconds ago      Up 9 seconds        80/tcp              lhllhl
[root@localhost ~]# docker exec -it lhllhl /bin/bash
root@d6a5a1900b78:/var/www/html# cat /etc/hosts    
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
192.168.1.111	www.ll.com
172.17.0.5	d6a5a1900b78

4 --rm	#服务停止时自动删除
[root@localhost ~]# docker run --name aaaaa --rm -h www.txb.com -d a05f
26ccfa996c0b645691137b0e27f7fd541a740c2760a5375cfbac11defba0997d
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
26ccfa996c0b        a05f                "docker-entrypoint..."   5 seconds ago       Up 4 seconds        80/tcp              aaaaa
[root@localhost ~]# docker stop $(docker ps -a -q)
26ccfa996c0b
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES

3.多容器管理 —— Docker-Compose

docker 三剑客
docker-compose 基于 yaml 格式资源清单
docker-swarm
docker-machine

​ Docker 提倡理念是 “一个容器一个进程”,假设一个服务需要由多个进程组成,就需要多个容器组成一个系统,相互分工和配合对外提供完整服务
​ 比如:博客系统
​ 组件1:mariadb
​ 组件2:WordPress 的 apache web

​ 在启动容器时,同一台主机下如果两个容器之间需要由数据交流,使用 --link 选项建立两个容器之间的互联,前提是建立是 mariadb 已经开启
​ 比如:docker start db
​ docker start MywordPress
​ 停止:docker stop db MywordPress 或 docker stop MywordPress 在 docker top db

Docker-compose Install

​ 容器编排工具,允许用户在一个模板( YAML 格式 )中定义一组相关联的容器,会根据 --link 等参数,对启动的优先级进行排序

方式一:

#国外站点
$ curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

方式二:

#国内站点	https://get.daocloud.io/
$ 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

#查看版本 version
$ docker-compose version

Docker-compose 用法

-f   #指定使用的 yaml 文件位置
up -d   #启动容器项目
restart   #重新启动容器
ps   #显示所有容器信息 
pause   #暂停容器
unpause   #恢复暂停
logs   #查看日志信息 
rm   #删除容器
config -q   #验证 yaml 配置文件是否正确
stop   #停止容器
start  #启动容器

示例:用 Docker 部署 Seafile 服务

https://cloud.seafile.com/published/seafile-manual-cn/docker/%E7%94%A8Docker%E9%83%A8%E7%BD%B2Seafile.md

1.安装 docker-compose

因为 Seafile v7.x.x 容器是通过 docker-compose 命令运行的,所以您应该先在服务器上安装该命令。

# for CentOS
$ yum install docker-compose -y

2.下载并修改 docker-compose.yml

下载 [docker-compose.yml] 示例文件到您的服务器上,然后根据您的实际环境修改该文件。尤其是以下几项配置:

  • MySQL root 用户的密码 (MYSQL_ROOT_PASSWORD and DB_ROOT_PASSWD)
  • 持久化存储 MySQL 数据的 volumes 目录 (volumes)
  • 持久化存储 Seafile 数据的 volumes 目录 (volumes)

3.启动 Seafile 服务

执行以下命令启动 Seafile 服务

$ docker-compose up -d

需要等待几分钟,等容器首次启动时的初始化操作完成后,您就可以在浏览器上访问http://seafile.example.com 来打开 Seafile 主页。

注意:您应该在 docker-compose.yml 文件所在的目下执行以上命令。

4.Docker-compose 基本语法

version: '2'
services:
  web:
    image: dockercloud/hello-world
    ports:
      - 8080
    networks:
      - front-tier
      - back-tier
 
  redis:
    image: redis
    links:
      - web
    networks:
      - back-tier
 
  lb:
    image: dockercloud/haproxy
    ports:
      - 80:80
    links:
      - web
    networks:
      - front-tier
      - back-tier
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock 
 
networks:
  front-tier:
    driver: bridge
  back-tier:
driver: bridge

1、image

services:
  web:
    image: hello-world
# 镜像可用格式
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

2、build

​ 服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器

build: /path/to/build/dir

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

build: ./dir
build:
  context: ../
  dockerfile: path/of/Dockerfile
   args:
    buildno: 1
    password: secret
image: webapp:tag

3、command

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

4、container_name

​ <项目名称><服务名称><序号>

container_name: app

5、depends_on

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

6、dns

dns: 8.8.8.8

dns:
  - 8.8.8.8
  - 9.9.9.9

7、tmpfs

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

8、 entrypoint

entrypoint: /code/entrypoint.sh

9、env_file

env_file: .env


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

10、environment

镜像变量

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

11、expose

expose:
 - "3000"
 - "8000"

12、 external_links

链接外部容器

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

13、extra_hosts

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

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"

15、links

​ 与 Docker client 的 --link 一样效果,会连接到其它服务中的容器

links:
 - db
 - db:database
 - redis

16、 logging

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

17、pid

pid: "host"

18、port

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

19、security_opt

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

20、 stop_signal

stop_signal: SIGUSR1

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

22、volumes_from

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

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

23、cap_add, cap_drop

cap_add:
  - ALL
 
cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

24、extends

extends:
  file: common.yml
  service: webapp

25、network_mode

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

26、 networks

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

Example

version: '2'

services:
   db:
     image: mysql:5.7
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   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

5.Yaml 语法

​ 编程免不了要写配置文件,怎么写配置也是一门学问。YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便

​ YAML 语言的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式

基本语法规则

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

数据类型

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

name: zhangsan
age: 18

hash: {name: zhangsan, age: 18}

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

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

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

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

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

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期
# 数值直接以字面量的形式表示
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字符串"	#不换行,字符\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


你可能感兴趣的:(学习笔记,docker)