docker和docker-compose相关基础知识

503 阅读6分钟

平时工作中docker和docker-compose是必不可少的,安装很简单就不说了,只说命令和一些常用方法

docker

常用命令

查看运行中的容器
docker ps
查看所有容器

可查看已关闭的容器

docker ps -a
查看本地所有镜像
docker images
删除本地镜像
docker rmi 镜像ID
删除虚悬镜像

虚悬镜像是自己构建镜像时发生错误,在docker images查看时,REPOSITORYTAG都是,这种镜像也不能使用,但是还会占用空间

docker image prune
启动容器

启动容器的参数有很多,最常用的如下

docker run -it --rm -p 80:80 -v ./log:/tmp/log xxx:xxx bash
  • -it 以交互式启动
  • --rm 退出容器后自动删除容器,省去docker ps -a查看已关闭的容器再docker rm 容器ID
  • -p 80:80 将宿主机端口映射到容器,左边80是宿主机端口,右边80是容器端口
  • -v ./log:/tmp/log 将宿主机上当前目录下的log目录挂载到容器中/tmp/log目录,容器中的程序在/tmp/log目录下产生文件,在宿主机上./log目录下也会产生文件,即使容器关闭或移除,这些文件都一直存在于宿主机上
进入容器
docker exec -it 容器名或ID bash
执行容器内的程序
docker exec -it 容器名或ID 容器内的命令
从容器中拷贝文件
docker cp 容器名或ID:容器内文件 宿主机目录
查看容器元数据
docker inspect 容器名或ID

可以查看容器的entrypoint以及暴露的端口等信息

查看容器日志
docker logs 容器名或ID
// tail查看末尾1000行
docker logs 容器名或ID --tail 1000 -f
打包镜像到文件
docker save 镜像名或ID -o xxx.tar
docker save 镜像名或ID > xxx.tar
从文件载入镜像
docker load -i xxx.tar
docker load < xxx.tar
给镜像打TAG
docker tag 镜像ID xxx:xxx

docker网络的相关命令

查看已有网络
docker network ls
创建网络
docker network create 网络名
连接网络

将指定的容器连接到指定网络

docker network connect 网络名 容器名或ID
断开网络
docker network disconnect 网络名 容器名或ID

常用配置

docker的配置文件是/etc/docker/daemon.json,是一个json文件,所以格式要符合json规范

registry-mirrors

设置镜像源,这是一个数组,可以指定多个,推荐https://docker.mirrors.ustc.edu.cn

insecure-registries

设置非安全的镜像源域名,在自己搭建harbor时如果自己生成SSL证书要设置此项

data-root

设置docker根目录,可将docker下载的镜像存放到指定目录下,如果系统盘不大,挂载数据盘时可通过此参数设置存放到数据盘

log-driver 和 log-opts

docker默认将容器内stdout和stderr统一以json的形式存储到/var/lib/docker/containers/<container-id>/<container-id>-json.log,通过data-root修改docker根目录后会保存到相应的新目录下

设置docker的日志保存方式和大小限制等,如下

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5"
  }
}

docker-compose

为什么要用docker-compose

  1. docker compose可以简化docker的使用,不用每次都输入一长串命令(docker命令有时候非常长,比如挂载很多目录、设置很多环境变量和设置网络等),将docker命令转化成docker-compose.yml配置,当需要启动容器时进入docker-compose.yml目录执行启动命令即可

  2. 通过docker-compose.yml文件来编排docker容器,在compose中每个容器称为一个service,在docker-compose.yml中可以一次性定义多个容器,并且容器之间可以设置依赖关系,使某个容器启动后才开始启动下一个容器

  3. 同一个docker-compose.yml中定义的多个容器之间会共用同一个docker网络

服务编排文件

docker-compose.yml是compose的编排文件,有以下常用的配置参数

  • container_name 指定容器名
  • restart 重启策略,常用的是always表示重启后自动启动容器
  • image 指定容器的镜像,如果镜像是自己构建,则不要设置image
  • build 指定容器需要自己构建镜像,如果镜像已经构建过,则直接使用构建好的镜像
  • ports 是一个数组,指定宿主机映射到容器的端口,如果指定了network_mode为host,则不能再指定ports
  • network_mode 指定网络模式,实际上就是网络命名空间,默认是bridge,容器之间连接需要bridge桥接,当设为host时,则使用宿主机的网络命名空间,容器中监听的端口完全暴露在外,不能再指定ports
  • environment 设置容器中的环境变量
  • volumes 是一个数组,挂载宿主机的目录到容器中
  • command 是一个数组,覆盖镜像中的CMD和entrypoint,在容器启动时执行
  • entrypoint 是一个.sh脚本文件,覆盖镜像中的entrypoint,在容器启动时执行
  • user 指定容器的用户,如指定为root
  • depends_on 是一个数组,指定当前容器依赖的其他容器,只有其他容器都启动了才会启动当前容器
  • extra_hosts 是一个数组,在容器的/etc/hosts中添加内容,如添加127.0.0.1 test
  • ulimits 指定容器中的一些内核限制,如nofile soft和hard
  • hostname 指定容器的主机名

下面以禅道的docker为例,介绍常见的配置参数:

version: '3.1'  # docker-compose版本,必须是字符串
services:  # 定义服务
  zentao:  # 服务名
    build: build  # 第一次需要构建镜像,构建镜像的目录在当前目录下的build目录下
    restart: always  # 重启后自动重启容器
    container_name: zentao  # 容器名
    environment:  # 指定容器中的环境变量
      MYSQL_ROOT_PASSWORD:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
    ports:  # 映射宿主机端口到容器
      - 180:80
      - 13306:3306
    volumes:  # 挂载宿主机目录到容器内
      - ./app:/app/zentaopms
      - ./data:/var/lib/mysql

再举一个网络搭桥的例子:

先创建几个docker网络

docker network create mysql
docker network create redis
docker network create minio

在docker-compose.yml中指定网络

version: '3.1'
services:
  api:
    build: build
    container_name: api
    ports:
      - 8088:8088
    networks:
      - mysql
      - redis
      - minio

networks:
  mysql:
    external:
      name: mysql
  redis:
    external:
      name: redis
  minio:
    external:
      name: minio

启动后api这个容器里面可以通过mysql, redis, minio直接访问对应的这三个服务,不用在程序中指明IP

datasource:
  druid:
    # 直接指定mysql,而不用写IP
    url: jdbc:mysql://mysql:3306/xerfu?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false

docker-compose.yml写熟练之后就很好用了,日常多整理一些服务的yaml,搭建服务非常快

常用命令

必须在docker-compose.yml所在目录下执行

启动
docker-compose up
docker-compose up -d
启动指定服务
docker-compose start 服务名
停止
docker-compose down
停止指定服务
docker-compose stop 服务名
查看日志
docker-compose logs -f
docker-compose logs -f 服务名
构建镜像

如果docker-compose.yml中服务的镜像是build,第一次启动时会自动构建镜像,如果修改了Dockerfile,则需要手动执行docker-compose build命令来构建新的镜像

docker-compose build
docker-compose build --no-cache

--no-cache表示不使用docker缓存,如果构建过程中需要执行apt-get update时建议不启动缓存,否则可能会导致一些软件无法下载安装

docker命令转docker-compose.yml

主要是记住docker命令的参数对应docker-compose.yml中的参数

以下面这个docker命令为例:

docker run -it --rm -p 80:80 -v ./log:/tmp/log xxx:xxx bash

其中-p和-v需要转换,转换后如下:

version: '3.1'
services:
  xxx:
    image: xxx:xxx
    container_name: xxx
    restart: always
    ports:
      - 80:80
    volumes:
      - ./log:/tmp/log

记住这些写法就很简单,平时尝试多将别人提供的docker命令转成docker-compose.yml,积累起来以后搭建服务就会非常爽了,把整理好的文件往服务器上一丢,执行docker-compose up -d即可