Docker学习

学习网址 : RUNOOB


CentOS 系列安装 Docker

Docker 支持 CentOS6 及以后的版本。

CentOS6

对于 CentOS6,可以使用 EPEL 库安装 Docker,命令如下

yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm

yum install docker-io

CentOS7

CentOS7 系统 CentOS-Extras 库中已带 Docker,可以直接安装:

yum install docker

安装之后启动 Docker服务,并让它随系统启动自动加载。

service docker start

chkconfig docker on


配置Docker中国区官方镜像

修改配置文件

使用vi修改 /etc/docker/daemon.json 文件并添加上"registry-mirrors": ["
https://registry.docker-cn.com"],如下:
vi /etc/docker/daemon.json

1
2
3
{ 
"registry-mirrors": ["https://registry.docker-cn.com"]
}

应用修改和重启docker

systemctl daemon-reload

systemctl restart docker


操作Docker 常用命令

使用 docker images 显示本地已有的镜像。

【-a 查看所有】

查看容器启动情况 docker ps

删除容器 docker rm mynginx
删除镜像 docker rmi imageName

查看容器日志 docker logs -f -t --tail=10 mynginx

–since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。

-f : 查看实时日志

-t : 查看日志产生的日期

-tail=10 : 查看最后的10条日志。

mynginx : 容器名称

进入容器 sudo docker exec -it c4bfc0e2a5aa /bin/bash

Docker 快捷命令

  • 清理所有Exited 的 容器 docker rm $(docker ps -q -f status=exited)
  • 清理所有tag为nong 的镜像 docker images|grep none|awk '{print $3 }'|xargs docker rmi
  • 清理所有: 的镜像 docker rmi $(docker images -f "dangling=true" -q)

Docker Run 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]   

-d, --detach=false 指定容器运行于前台还是后台,默认为false
-i, --interactive=false 打开STDIN,用于控制台交互
-t, --tty=false 分配tty设备,该可以支持终端登录,默认为false
-u, --user="" 指定容器的用户
-a, --attach=[] 登录容器(必须是以docker run -d启动的容器)
-w, --workdir="" 指定容器的工作目录
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
-m, --memory="" 指定容器的内存上限
-P, --publish-all=false 指定容器暴露的端口
-p, --publish=[] 指定容器暴露的端口
-h, --hostname="" 指定容器的主机名
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
--device=[] 添加主机设备给容器,相当于设备直通
--dns=[] 指定容器的dns服务器
--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
--entrypoint="" 覆盖image的入口点
--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
--link=[] 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge" 容器网络设置:
bridge 使用docker daemon指定的网桥
host //容器使用主机的网络
container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
none 容器使用自己的网络(类似--net=bridge),但是不进行配置
--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="no" 指定容器停止后的重启策略:
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

Docker Compose

安装Docker Compose

搬运链接

  • 下载
    sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

  • 增加权限
    sudo chmod +x /usr/local/bin/docker-compose

  • 检查是否安装成功
    docker-compose -v

常用命令

  • 列出所有容器 docker-compose ps

  • 查看日志 docker-compose logs

  • 打印绑定的公共端口,下面命令可以输出 eureka 服务 8761 端口所绑定的公共端口 docker-compose port eureka 8761\

  • 构建或者重新构建服务 docker-compose build

  • 启动指定的服务已存在的容器 docker-compose start eureka

  • 停止已运行的服务的容器 docker-compose stop eureka

  • 删除指定服务的容器 docker-compose rm eureka

  • 构建、启动容器 docker-compose up

  • 通过发送 SIGKILL 信号来停止指定服务的容器docker-compose kill eureka

  • 下载服务镜像 docker-compose pull eureka

  • 设置指定服务运气容器的个数,以 service=num 形式指定docker-compose scale user=3 movie=3

  • 在一个服务上执行一个命令 docker-compose run web bash

  • docker-compose.yml 属性

    • version:指定 docker-compose.yml 文件的写法格式
    • services:多个容器集合
    • build:配置构建时,Compose 会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定 Dockerfile 参数
    1
    2
    3
    4
    5
    6
    7
    build: ./dir
    ---------------
    build:
    context: ./dir
    dockerfile: Dockerfile
    args:
    buildno: 1
    • command:覆盖容器启动后默认执行的命令
    1
    2
    3
    command: bundle exec thin -p 3000
    ----------------------------------
    command: [bundle,exec,thin,-p,3000]
    • dns:配置 dns 服务器,可以是一个值或列表
    1
    2
    3
    4
    5
    dns: 8.8.8.8
    ------------
    dns:
    - 8.8.8.8
    - 114.114.114.114
    • dns_search:配置 DNS 搜索域,可以是一个值或列表

      1
      2
      3
      4
      5
      dns_search: example.com
      ------------------------
      dns_search:
      - dc1.example.com
      - dc2.example.com
    • environment:环境变量配置,可以用数组或字典两种方式

    1
    2
    3
    4
    5
    6
    7
    environment:
    RACK_ENV: development
    SHOW: 'ture'
    -------------------------
    environment:
    - RACK_ENV=development
    - SHOW=ture
    • env_file:从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量
    1
    2
    3
    4
    env_file: .env
    ---------------
    env_file:
    - ./common.env
    • expose:暴露端口,只将端口暴露给连接的服务,而不暴露给主机
    1
    2
    3
    expose:
    - "3000"
    - "8000"
    • image:指定服务所使用的镜像
    1
    image: java
    • network_mode:设置网络模式
    1
    2
    3
    4
    5
    network_mode: "bridge"
    network_mode: "host"
    network_mode: "none"
    network_mode: "service:[service name]"
    network_mode: "container:[container name/id]"
    • ports:对外暴露的端口定义,和 expose 对应
    1
    2
    3
     ports:   # 暴露端口信息  - "宿主机端口:容器暴露端口"   
    - "8763:8763"
    - "8763:8763"
    • links:将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
    1
    2
    links:    # 指定服务名称:别名 
    - docker-compose-eureka-server:compose-eureka
    • volumes:卷挂载路径
    1
    2
    3
    volumes:
    - /lib
    - /var
    • logs:日志输出信息
    1
    2
    3
    4
    --no-color          单色输出,不显示其他颜.
    -f, --follow 跟踪日志输出,就是可以实时查看日志
    -t, --timestamps 显示时间戳
    --tail 从日志的结尾显示,--tail=200

Docker Compose 其它

更新容器

  • 当服务的配置发生更改时,可使用 docker-compose up 命令更新配置
  • 此时,Compose 会删除旧容器并创建新容器,新容器会以不同的 IP 地址加入网络,名称保持不变,任何指向旧容起的连接都会被关闭,重新找到新容器并连接上去
  • 服务之间可以使用服务名称相互访问,links 允许定义一个别名,从而使用该别名访问其它服务
1
2
3
4
5
6
7
8
version: '2'
services:
web:
build: .
links:
- "db:database"
db:
image: postgres
  • 这样 Web 服务就可以使用 db 或 database 作为 hostname 访问 db 服务了