Docker MySQL
MySQL 的 Docker 镜像在 dockerhub 上的地址:https://hub.docker.com/_/mysql(opens new window)
当前(2021-04-02)的 latest 和 8.0.23 是同一个镜像 。另外,5.7 版本和 5.7.33 是同一个镜像。
#1. 安装及测试
# 查询中央仓库
docker search -f is-official=true mysql
# 从中央仓库下载
docker pull mysql:8.0.16
# 或,直接导入已有的镜像文件
# docker load -i mysql-8.0.16.tar
# 查看本地镜像
docker images
# 会出现类似如下内容:
# REPOSITORY TAG IMAGE ID CREATED SIZE
# mysql 8.0.16 de764ad211de 2 years ago 443MB
运行容器:
# 删除曾经已有的同名容器
docker rm -f mysql-test
# 创建并运行 mysql 容器的语法
docker run \
-d \
--name <指定容器名> \
-p <指定宿主机端口>:3306 \
-e MYSQL_ROOT_PASSWORD=<指定root登录密码> \
mysql:8.0.16
例如:
docker run \
-d \
--name mysql-3306 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.16
# docker run -d --name mysql-3306 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.16
验证安装成功
# 查看容器的运行信息
docker ps
# 进入 mysql-test 容器
docker exec -it mysql-test /bin/bash
# 执行 mysql-cli 的连接命令
mysql -uroot -p123456
后续可选操作:
-
对 root 的远程连接授权
容器逻辑上等价于另一台电脑。而在 mysql 中,root 用户默认只能从 MySQL Server 所在的电脑上登陆,无法从『另一台』电脑通过远程连接的方式登陆。
当然,这种『默认』行为是可以配置的。
按上述命令,从容器内部连接到 MySQL Server,执行如下 SQL 语句:
> use mysql; > select user, host from user; > GRANT ALL ON *.* TO 'root'@'%'; > flush privileges;
Copied! -
从容器外部连接
> mysql -h <宿主机IP> -P <宿主机端口号> -u root -p <root登陆密码>
Copied!
#2. 配置与挂载
-
MySQL Server 的数据的存储目录容器中的 /var/lib/mysql/ ,你在 MySQL 中存储的数据,就被 MySQL 放在了这个目录下。
-
MySQL Server 的配置文件是容器中的 /etc/mysql/my.cnf + /etc/mysql/conf.d/mysql.cnf 。
关于 MySQL 的配置文件和配置项:
MySQL Server 启动时会去加载 /etc/mysql/my.cnf
配置文件,这个配置文件中有一部分配置。一般情况下我们不会去动这部分内容,也不会在这个配置文件中追加内容。
在 my.cnf
配置文件的最后,它又引入了另一个目录 /etc/mysql/conf.d/
,MySQL 会加载这个目录下的所有的 .cnf 配置文件的配置信息。虽然可以在这个下面新建配置文件,不过 MySQL 已经提前帮我们建立好了一个名为 mysql.cnf
配置文件(默认情况下,它里面除了注释啥都没有,是个空文件)。对于我们自己想要设置的配置项,我们将它们写在这里面。
配置文件中常见的 [mysqld]、[client] 和 [mysql]
[mysqld]
代表数据库自身的默认设置
[client]
代表客户端默认设置内容
[mysql]
代表我们使用 mysql 命令连接、登录 MySQL Server 时的默认设置
由于 mysql 命令本身也是 mysql server 的客户端之一,因此,当你使用 mysql 命令连接 mysql server 时,[client]
和 [mysql]
配置都会起作用。
-
示例
# 删除已存在的同名容器 docker rm -f mysql-3306 # 创建宿主机挂载目录 mkdir -p ~/docker/3306/{config,data} # 创建 mysql.cnf 配置文件 touch ~/docker/3306/config/mysql.cnf # 在宿主机的 **conf** 目录下新建任意命名的 `.cnf` 文件,其中内容见最后。 # 创建并运行容器 docker run \ -d \ --name mysql-3306 \ -v ~/docker/3306/data:/var/lib/mysql \ -v ~/docker/3306/config/mysql.cnf:/etc/mysql/conf.d/mysql.cnf \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:8.0.16
Copied!
#3. docker-compse 方式启动
version: '3'
services:
mysql-3306:
image: mysql:8.0.16
network_mode: "bridge" # 默认值
container_name: mysql-3306
mem_limit: 512m # 限定 docker 容器内存大小
environment:
- MYSQL_ROOT_PASSWORD=123456
volumes:
- /etc/localtime:/etc/localtime:ro # 时区
- ~/docker/3306/data:/var/lib/mysql # 数据
- ~/docker/3306/config/mysql.cnf:/etc/mysql/conf.d/mysql.cnf # 配置
ports: # network_mode: "host" 无需端口映射
- "3306:3306"
启动命令:docker-compose up -d mysql-3306
#4. 初始化数据库
mysql 的 docker 镜像有一个功能:它在第一次创建容器(重启不算)时,会到容器内的 /docker-entrypoint-initdb.d
目录下查看有没有 sql 脚本,如果有,就执行 sql 脚本。因此,你可以通过这个功能来完成数据库的创建等初始化工作。
你可以在某个目录下创建 .sql 脚本(例如 init.sql),并在其中写上建库、建表等 SQL 语句,然后将这个目录映射成 /docker-entrypoint-initdb.d
。
#5. mysql.cnf
默认是空的。我们加点东西:指定字符集。
[mysqld]
character_set_server=utf8
[mysql]
default-character-set=utf8
Docker Redis
docker hub 网址:https://hub.docker.com/_/redis(opens new window)
当前(2020-04-02) latest 版本和 6.2.1 是同一个版本。
#1. 安装及测试
# 查询中央仓库
docker search -f is-official=true redis
# 从中央仓库下载
docker pull redis:6.2.1
# 或,直接导入已有的镜像文件
# docker load -i redis-6.2.1.tar
# 查看本地镜像
docker images
# 会出现类似以下内容:
# REPOSITORY TAG IMAGE ID CREATED SIZE
# redis 6.2.1 7f33e76fcb56 45 hours ago 105MB
运行容器:
# 删除曾经已有的同名容器
docker stop redis-test
docker rm redis-test
# 创建并运行 redis 容器的语法
docker run -d --name <指定容器名> -p <指定宿主机端口>:6379 redis:6.2.1
例如:
docker run \
-d \
--name redis-test \
-p 6379:6379 \
redis:6.2.1
验证安装成功
-
通过 docker ps 命令查看容器的运行信息:
略
-
进入 redis-test 容器
docker exec -it redis-test /bin/bash
Copied! -
执行
redis-cli
连接 redis serverredis-cli
Copied!
后续可选操作:
-
设置键值对
连上 Redis Server 之后,执行 redis 命令:
set test 1
,会显示OK
。 -
从容器外部连接
redis-cli -h <宿主机IP> -p <宿主机端口> -a <登录密码>
Copied!
#2. 容器中的配置文件和数据的存储
-
Docker Redis Server 的数据的存储目录在容器内部的
/data
Copied!很显然,只有开启持久化功能时,才会有数据存储于此。
-
早期的 Docker Redis 在容器中有默认的配置文件,但现在没有了。
从 5 版本开始 Docker Redis 改变了思路,容器内部不在包含配置文件,而是要求容器启动时指定宿主机中的一个文件作为配置文件。
例如:
docker run \ ... \ -v <宿主机上的redis.conf>:/usr/local/etc/redis/redis.conf \ redis:6.2.1 \ redis-server /usr/local/etc/redis/redis.conf \ ...
Copied!说明
当然,如果你没有提供配置文件,它还是有默认的配置的,只不过你在容器中找不到配置文件。
5.0.6 的默认的配置文件的有效内容见最后。
#3. 配置与挂载
-
删除已存在的同名容器
docker rm -f redis-6379
Copied!后续可通过 docker run 的 --rm 选项免去『删除』这步操作。
-
创建本机挂载目录
mkdir -p ~/docker/redis/6379/data touch ~/docker/redis/6379/redis.conf
Copied! -
创建并运行容器
docker run \ -d \ --name redis-6379 \ -p 6379:6379 \ -v ~/docker/redis/6379/redis.conf:/usr/local/etc/redis/redis.conf \ -v ~/docker/redis/6379/data:/data \ redis:6.2.1 \ redis-server /usr/local/etc/redis/redis.conf \ --appendonly yes
Copied!--appendonly yes 开启 Redis 持久化功能。
#4. docker-compose 启动
version: '3'
services:
redis:
image: redis:5.0
container_name: redis-6379
mem_limit: 512m
ports:
- 6379:6379
volumes:
- "~/docker/6379/data:/data"
- "./docker/6379/redis.conf:/usr/local/etc/redis/redis.conf"
command:
redis-server /usr/local/etc/redis/redis.conf --appendonly yes
#5. redis.conf
bind 127.0.0.1 protected-mode yes port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no supervised no pidfile /var/run/redis_6379.pid loglevel notice logfile "" databases 16 always-show-logo yes save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir ./ replica-serve-stale-data yes replica-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no replica-priority 100 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no replica-lazy-flush no appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 stream-node-max-bytes 4096 stream-node-max-entries 100 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit replica 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 dynamic-hz yes aof-rewrite-incremental-fsync yes rdb-save-incremental-fsync yes
Docker Nginx
docker hub 网址:https://hub.docker.com/_/nginx (opens new window)。
当前(2021-04-02) latest 版本和 1.19.9 版本是同一个版本;stable 版本和 1.18.0 版本是同一个版本。
#1. 安装及测试
# 查询中央仓库
docker search -f is-official=true mysql
# 从中央仓库下载
docker pull nginx:1.18.0
# 或,直接导入已有的镜像文件
# docker load -i nginx-1.1.18.0.tar
# 查看本地镜像
docker images
会出现类似如下内容:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.18.0 b9e1dc12387a 2 months ago 133MB
nginx 1.19.9 7ce4f91ef623 2 days ago 133MB
运行容器:
# 删除曾经已有的同名容器
docker stop nginx-test
docker rm nginx-test
# 创建并运行 nginx 容器的语法
docker run \
-d \
--name <指定容器名> \
-p <指定宿主机端口>:80 \
nginx:1.18.0
例如:
docker run \
-d \
--name nginx-test \
-p 80:80 \
nginx:1.16.1
验证安装成功
-
通过 docker ps 命令查看容器的运行信息:
docker ps
Copied!会看到类似如下信息:
略
-
访问 nginx 主页
启动容器后,访问 http://宿主机IP:80 能看到 Nginx 的欢迎界面: Welcome to nginx!
#2. 容器中的配置文件和数据的存储
Docker Nginx 的配置文件是容器中的
/etc/nginx/nginx.conf
Docker Nginx 的日志目录是容器中的
/var/log/nginx/
Docker Nginx 的静态资源文件目录是容器中的
/usr/share/nginx/html
#3. 配置与挂载
-
删除已存在的同名容器
docker stop nginx-80 docker rm nginx-80
Copied!后续可通过 docker run 的 --rm 选项免去『删除』这步操作。
-
在宿主机上创建目录及配置文件。
mkdir -p ~/docker/nginx/80/log touch ~/docker/nginx/80/nginx.conf
Copied! -
创建并运行容器
docker run \ -d \ --rm \ --name nginx-80 \ -p 80:80 \ -v ~/docker/nginx/80/nginx.conf:/etc/nginx/nginx.conf:ro \ -v ~/docker/nginx/80/log:/var/log/nginx \ nginx:1.18.0
Copied!
以下内容是 nginx 配置文件的默认内容:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
#4. docker-compose 启动
version: '3'
services:
nginx:
image: nginx:stable
container_name: nginx-zgg
volumes:
- ~/docker/nginx/80/logs:/etc/nginx/logs
- ~/docker/nginx/80/nginx.conf:/etc/nginx/nginx.conf
- ~/docker/nginx/80/html:/usr/share/nginx/html
ports:
- 80:80