[TOC]
工作中用的比较多的命令。
docker
run
systemctl start docker #启动
systemctl daemon-reload #守护进程重启
systemctl restart docker / service docker restart #重启docker服务
docker service docker stop / docker systemctl stop docker #关闭
image
构建
docker build -t getting-started . # getting-started 为名字 . 表示在当前目录找 Dockerfile文件
清理镜像文件
docker image prune
container
删除未运行的容器
docker container prune
查看容器状态
docker stats
docker ps # 查看容器状态
docker ps -a
docker logs -f <container-id> # 查看容器日志
运行容器
docker run --network todo-app --network-alias mysql -p 3306:3306 --name mysql --privileged=true -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=todos -d mysql:8.0.19
参数说明
--name
为新建的容器命名--network
链接到网络。不同于named volume, network不会自动创建。--network-alias
为容器取个别名。这样,其他容器就可以通过mysql 链接到这个容器。-e
环境变量,MYSQL_ROOT_PASSWORD配置MySQL的root用户的登录密码。这里指定数据库为todos, 如果数据库不存在会自动创建。-p
端口映射,此处映射主机3306端口到容器的3306端口-d
以后台守护进程方式运行,成功启动容器后输出容器的完整ID-v
配置卷信息,把卷和内部容器的目录关联起来。两种方式,named volume or mount host directory。当named volume不存在时,docker 会自动创建。mysql:8.0.19
MySQL镜像名称
进入容器
docker exec -ti xxx /bin/bash
停止容器
docker stop <the-container-id>
删除容器
docker rm <the-container-id>
卷
用于数据持久化
docker volume create todo-db # 创建有名的volume, 实际的磁盘路径docker会管理。
docker volume inspect todo-db # 查看valume的具体信息。
[
{
"CreatedAt": "2019-09-26T02:18:36Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
"Name": "todo-db",
"Options": {},
"Scope": "local"
}
]
网络
用户不同容器之间通信
docker network create todo-app # 创建名为todo-app 的网络
仓库
docker login -u YOUR-USER-NAME # 登录仓库
docker tag getting-started YOUR-USER-NAME/getting-started # 给镜像打标签
docker push YOUR-USER-NAME/getting-started # 发布镜像
docker pull YOUR-USER-NAME/getting-started # 拉取镜像
容器编排
swarm
swarm
### 创建集群
`docker swarm init --advertise-addr 192.168.8.81`
### 添加work
`docker swarm join --token SWMTKN-1-11tlf4xgudkq9i8qnuh1rqy0lqt7k63rbpxg1z8sd4he313jz3-aqdjvmha1ow4umtj0be09ktxz 192.168.8.81:2377`
经验:
争取过期导致没法查看日志 incomplete log stream. some logs could not be retrieved for the following reasons: node xxxxx is not available
docker system info # 可以看到证书默认只有3个月时间
docker swarm update --cert-expiry 867240h0m0s # 更新证书过期时间
docker swarm ca --rotate | openssl x509 -text -noout
docker system info # 现在有99年了,现在可以查看日志了
stack
### 发布
`docker stack deploy -c stack.yml all_publish --with-registry-auth`
### 查看stack
`docker stack ls`
### 查看服务
`docker stack services ask2buy`
### 查看进程
`docker stack ps ask2buy`
### 删除stack
`docker stack rm seastack`
service
docker service ls # 查看运行中的service
docker service ps all_publish_dev_api_go # 查看某个服务运行状态
docker service logs all_publish_dev_api_go # 查看某个服务的日志
docker service update all_publish_dev_api_go # 重启服务
compose
install
https://github.com/docker/compose
- python
sudo pip install -U docker-compose
- 直接下载编译好的二进制文件。
- 使用docker运行。
define
docker-compose.yml
示例
version: "3.7"
services:
app: # 这个service name 会自动变成 network alias, 所以其他service 可以通过app 找到这个service
image: node:12-alpine # 镜像名字
command: sh -c "yarn install && yarn run dev" # 启动命令
ports: # 端口映射
- 3000:3000
working_dir: /app # 工作目录
volumes: # 卷信息
- ./:/app
environment: # 环境变量
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql: # mysql service
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes: # 定义的卷信息
todo-mysql-data:
run
docker-compose up -d # 运行stack -d 是后台模式
docker-compose logs -f # 查看日志
docker-compose logs -f app # 查看 service app 的日志
docker-compose down # 关闭stack
宿主机外网ip不能访问的问题
说明,我遇到的问题是这个外网ip是同一个服务器。这个服务器提供了api服务,但是不是docker服务。
extra_hosts:
- "api.go2live.cn:192.168.8.195"
- "api2.go2live.cn:192.168.8.195"
经验
遇到问题,可以直接用docker运行镜像看能不能起来,然后看日志
清理磁盘
docker system 命令
docker system df
查看docker磁盘占用。
docker system prune
清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)
docker system prune -a
理得更加彻底,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了……所以使用之前一定要想清楚吶。
手动清理
对于旧版的Docker(版本1.13之前),是没有Docker System命令的,因此需要进行手动清理。这里给出几个常用的命令:
删除所有关闭的容器:
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
删除所有dangling镜像(即无tag的镜像):
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
删除所有dangling数据卷(即无用的Volume):
docker volume rm $(docker volume ls -qf dangling=true)
日志问题
手动清理:
truncate -s 0 /xxxx
限制Nginx容器的日志文件大小
nginx:
image: nginx:1.12.1
restart: always
logging:
driver: "json-file"
options:
max-size: "5g"