平时工作中docker和docker-compose是必不可少的,安装很简单就不说了,只说命令和一些常用方法
docker
常用命令
查看运行中的容器
docker ps
查看所有容器
可查看已关闭的容器
docker ps -a
查看本地所有镜像
docker images
删除本地镜像
docker rmi 镜像ID
删除虚悬镜像
虚悬镜像是自己构建镜像时发生错误,在docker images查看时,REPOSITORY和TAG都是,这种镜像也不能使用,但是还会占用空间
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
-
docker compose可以简化docker的使用,不用每次都输入一长串命令(docker命令有时候非常长,比如挂载很多目录、设置很多环境变量和设置网络等),将docker命令转化成docker-compose.yml配置,当需要启动容器时进入docker-compose.yml目录执行启动命令即可
-
通过
docker-compose.yml文件来编排docker容器,在compose中每个容器称为一个service,在docker-compose.yml中可以一次性定义多个容器,并且容器之间可以设置依赖关系,使某个容器启动后才开始启动下一个容器 -
同一个
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即可