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"]});

解决方案

  1. 第一次启动容器,配置文件去除–auth命令
  2. 执行创建用户命令,创建用户和库
  3. 修改配置文件,加上–auth命令
  4. 重新启动容器,执行授权命令后就可操作数据库

至此,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常用命令解释如下:

Docker compose常用命令
指令    说明
up

          docker compose up -f yml文件名 -d

                                                                      #  启动所有的docker compose服务
                                                                      #  -f :表示指定启动的文件名

                                                                      #  -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

                                                                      #  删除服务
                                                                      #  加服务id 删除单个服务
                                                                      #  -fv 强制删除(v 包括数据卷)

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}'`