Docker Compose Yaml(Yml)
Docker Hub 镜像
一、docker-compose.yaml(yml)模板
Docker Hub mysql 镜像
version: "3.9" # compose版本号
services:
db: # 单个服务标识(名字)
container_name: mysql # 启动后的容器名称 相当于 --name 指定的名称
image: mysql:8 # 镜像
ports: # 端口映射,前者是宿主机端口,后者是容器端口
- 10000:3306
environment: # 指定启动的环境
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: realworld #自动创建名为realworld的数据库
# env_file: # 使用文件进行代替
# - ./mysql.env # mysql.env文件内容就是MYSQL_ROOT_PASSWORD=root
volumes: # 表示目录映射关系(前者是宿主机目录,后者是dockker的db容器内的目录)
- ./data:/var/lib/mysql # 容器内的数据持久化到主机当前目录(当前yaml文件所在目录)的data目录下
depends_on:
- redis
restart:
- on-failure # no:是默认的重启策略,在任何情况下都不会重启容器。
# always:容器总是重新启动。
# on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
# unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
command: [
'--character-set-server=utf8',
'--collation-server=utf8_unicode_ci'
]
healthcheck: # 健康检查
test: ["CMD", "mysqladmin" ,"ping", "--protocol=tcp"]
timeout: 20s
interval: 1s
retries: 20
redis:
image: redis:latest
ports:
- 10010:6379
healthcheck:
test: ["CMD", "redis-cli","ping"]
interval: 20s
timeout: 1s
retries: 20
memcached:
image: memcached
ports:
- 10086:11211
healthcheck:
test: ["CMD", "echo", "stats", "|", "nc", "127.0.0.1", "11211"]
interval: 20s
timeout: 1s
retries: 20
Mongo镜像
mongo默认是没有用户的,可以进行配置
首先创建宿主机挂载目录(选择性进行配置)
#mongo数据目录
mkdir /opt/dockerstore/mongo/data
#mongo日志目录
mkdir /opt/dockerstore/mongo/logs
# 创建 mongodb 的配置文件,用于映射 docker 镜像内的配置文件
mkdir /opt/dockerstore/mongo/mongod.conf
1、docker启动
1)、使用docker启动
# 拉取MongoDB最新版本的镜像
docker pull mongo #执行不执行此条命令,docker run 都会自动拉取镜像
# 由于命令太长,为了方便阅读,采用反斜线(\)换行
docker run --name mymongo -p 27017:27017 \
-v /app/mongo/data:/data/db \
-v /app/mongo/logs:/var/log/mongodb \
-v /app/mongo/mongod.conf:/etc/mongod.conf \
-d mongo --auth
2)、使用docker compose启动
version: '3.9'
services:
mongodb: # 服务名称为 mongodb,该名称主要用于容器之间服务的 dns 解析
image: mongo:latest # 使用的镜像名称
restart: always # 当 docker 服务启动后,自动启动 mongodb 容器
container_name: mongodb # 容器的名称为 mymongo
ports:
- "27017:27017"
environment:
TZ=Asia/Shanghai #将时区设置为Asia/Shanghai
MONGO_INITDB_DATABASE=demo #将数据库名设置为demo
MONGO_INITDB_ROOT_USERNAME: demo #将用户名设置为demo
MONGO_INITDB_ROOT_PASSWORD: 111111 #将密码设置为111111
volumes: # 宿主机硬盘目录映射容器内的路径
- /opt/dockerstore/mongo/data:/data/db
#- /opt/dockerstore/mongo/logs:/var/log/mongodb
#- /root/mongo/mongod.conf:/etc/mongod.conf
# 增加启动参数,--auth,表示连接 mongodb 需要用户名和密码
#command:
#- "--auth"
2、创建用户和库
首先了解mongo角色权限
role | 作用 |
---|---|
read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile |
userAdmin | 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 |
clusterAdmin | 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限 |
readAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读权限 |
readWriteAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读写权限 |
userAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 |
dbAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 |
root | 只在admin数据库中可用。超级账号,超级权限 |
注意:clusterAdmin、readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、root角色只能用于admin数据库
否则报以下错误(demo是非admin数据库):
uncaught exception: Error: couldn’t add user: Could not find roles: userAdminAnyDatabase@rad_app, readWriteAnyDatabase@rad_app
执行命令进入mongo容器
docker exec -it mongodb /bin/bash
进入容器后连接mongo客户端
mongo admin
进入客户端后创建用户
#使用demo库,如果不存在会创建
use demo;
#创建用户并赋予角色权限
db.createUser({user:'demo_user',pwd:'123',roles:[{role:'userAdmin',db:'demo'},"readWrite"]});
解决方案
- 第一次启动容器,配置文件去除–auth命令
- 执行创建用户命令,创建用户和库
- 修改配置文件,加上–auth命令
- 重新启动容器,执行授权命令后就可操作数据库
至此,mongoDB安装并配置完成
Docker Hub Portainer镜像
使用portainer_data 卷时,必须先创建才能使用
# 创建卷portainer_data(卷名自己定)
$ docker volume create portainer_data
portainer_data
# 查询portainer_data卷的详细信息
$ docker volume inspect portainer_data
[
{
"CreatedAt": "2022-11-09T15:39:45+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/portainer_data/_data", # 创建portainer_data卷默认所在位置
"Name": "portainer_data",
"Options": {},
"Scope": "local"
}
]
version: "3.9" # compose版本
services: # 加入服务
portainer: # 单个服务标识(名字)
container_name: portainer # 启动后的容器名称 相当于 --name 指定的名称
image: portainer/portainer-ce:latest # 镜像
ports:
- 8000:8000 # 端口映射,前者是宿主机端口,后者是容器端口
- 9443:9443
volumes: # 指定对应的数据卷 前者是宿主机目录,后者是容器目录
- /var/run/docker.sock:/var/run/docker.sock # 数据文件挂载
- /var/lib/docker/volumes/portainer_data:/data # Portainer Server用于存储其数据库的卷
restart: always
Docker compose常用命令解释如下:
指令 | 说明 |
---|---|
up | docker compose up -f yml文件名 -d # 启动所有的docker compose服务 # -d:表示后台启动 |
down | docker compose down # 停止服务 |
exec | docker compose exec 服务id bash # 进入容器 |
ps | docker compose ps # 查看所有运行的服务 |
restart | docker compose restart 服务id # 重启所有服务 # 加上服务id 表示重启单个服务 |
rm | docker compose rm -fv 服务id # 删除服务 |
start | docker compose start 服务id # 启动服务 |
stop | docker compose stop 服务id # 停止服务 |
top | docker compose top 服务id # 查看容器内运行的进程 |
pause | docker compose pause 服务id # 暂停服务 |
unpuase | docker-compose unpause 服务id # 开启服务 |
logs | docker-compose logs 服务id # 查看日志 |
可以通过 docker compose --help
从命令行运行来查看命令信息。
Define and run multi-container applications with Docker.
#使用示例
Usage:
docker compose [-f <arg>...] [--profile <name>...] [options] [COMMAND] [ARGS...]
docker compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file
(default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name
(default: directory name)
--profile NAME Specify a profile to enable
--verbose Show more output
--log-level LEVEL DEPRECATED and not working from 2.0 - Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
--no-ansi Do not print ANSI control characters
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don't check the daemon's hostname against the
name specified in the client certificate
--project-directory PATH Specify an alternate working directory
(default: the path of the Compose file)
--compatibility If set, Compose will attempt to convert deploy
keys in v3 files to their non-Swarm equivalent
Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker Compose version information
使用 Docker Compose 二进制文件 ,
docker compose [-f <arg>...] [options] [COMMAND] [ARGS...]
来构建和管理 Docker 容器中的多个服务。
示例:
docker compose -f docker-compose.yml -f docker-compose.admin.yml run backup_db
docker compose up -d #后台启动
使用use mysql;命令选择数据库后,使用以下命令的其中之一查看用户消息情况
$select host,user from user;
$select Host,User,plugin from user;
$select host,user,authentication_string from user\G
eg:
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select Host,User,plugin from user;
+-----------+------------------+-----------------------+
| Host | User | plugin |
+-----------+------------------+-----------------------+
| % | root | caching_sha2_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session | caching_sha2_password |
| localhost | mysql.sys | caching_sha2_password |
| localhost | root | caching_sha2_password |
+-----------+------------------+-----------------------+
5 rows in set (0.00 sec)
注:docker-compose yaml文件配置时配置了密码,则启动mysql之后,Navicat或beekeeper studio 社区版直接用密码就可以进行远程连接,不需要更改加密方式。如果是从挂起的虚拟机中恢复过来的,则用Navicat远程连接不上,会出现10061或10060错误,解决办法:重启虚拟机即可连接成功!!!
以下命令参考使用
1、docker exec -it 容器ID/容器名 bash #进入mysql的docker容器中
2、mysql -uroot -p #输入密码进入mysql
3、use mysql;
4、ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; #将验证方法从auth_socket修改成mysql_native_password,并设置密码,123456 就是密码
5、update user set host = '%' where user = 'root'; #若不允许从远程连接,只能在本地连接。登入mysql后,更改"mysql" 数据库里的 "user" 表里的 "host"项,从"localhost"改称"%"
6、GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; #这里表示赋予该用户所有数据库所有表权限(*.*表示所有表,%表示所有IP地址)
7、FLUSH PRIVILEGES; #刷新权限
二、docker容器命令
docker exec -it 容器名/容器ID /bin/bash #进入容器
# 从容器内 退出到自己服务器中 需注意 两个退出命令的区别
#-----直接退出 未添加 -d(持久化运行容器) 时 执行此参数 容器会被关闭
exit
# 优雅退出 --- 无论是否添加-d 参数 执行此命令容器都不会被关闭
Ctrl + p + q
docker start 容器ID/容器名 # 启动容器
docker stop 容器名/容器ID # 停止之前运行的容器
docker restart 容器ID/容器名 # 重启容器
docker kill 容器ID/容器名
docker rm -f 容器名/容器ID # 删除一个容器
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID # 删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f $(docker ps -aq) # 删除全部容器
#容器文件拷贝 —无论容器是否开启 都可以进行拷贝
# docker cp 容器ID/名称:文件路径 要拷贝到外部的路径 | 要拷贝到外部的路径 容器ID/名称:文件路径
# 从容器内 拷出
docker cp 容器ID/名称: 容器内路径 容器外路径
# 从外部 拷贝文件到容器内
docker cp 容器外路径 容器ID/名称: 容器内路径
docker load -i 镜像保存文件位置
#可将以下命令写成脚本运行
sudo docker rm -f $(sudo docker ps -aq)
sudo docker network prune
sudo docker volume prune
docker rmi --force `docker images | grep dev-peer | awk '{print $3}'`