docker环境构建
Portainer
ortainer 是一个轻量级的 Docker 管理 UI,可以帮助你通过图形化界面管理 Docker 容器、镜像、网络和卷。使用 Docker Compose 安装 Portainer 非常简单,以下是详细步骤:
1. 创建 docker-compose.yml
文件
在任意目录下创建一个 docker-compose.yml
文件,并添加以下内容:
version: '3.8'
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
ports:
- "9000:9000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
networks:
- portainer_network
deploy:
resources:
limits:
cpus: "0.50" # 限制 CPU 使用率为 50%
memory: 500M # 限制内存使用为 500MB
restart_policy:
condition: on-failure # 仅在容器失败时重启
max_attempts: 3 # 最大重启尝试次数
delay: 10s # 重启延迟时间
volumes:
portainer_data:
networks:
portainer_network:
配置说明:
deploy.resources.limits
:cpus: "0.50"
:限制容器使用的 CPU 资源为 50%(即最多使用 0.5 个 CPU 核心)。memory: 500M
:限制容器使用的内存为 500MB。
deploy.restart_policy
:condition: on-failure
:仅在容器失败时重启。max_attempts: 3
:最多尝试重启 3 次。delay: 10s
:每次重启之间的延迟时间为 10 秒。
image: 使用 Portainer Community Edition (CE) 的最新镜像。
container_name: 容器名称设置为
portainer
。restart: 设置为
always
,确保容器在意外停止后自动重启。ports: 将宿主机的
9000
端口映射到容器的9000
端口。volumes:
/var/run/docker.sock:/var/run/docker.sock
:挂载 Docker 的 Unix 套接字,使 Portainer 能够管理 Docker。portainer_data:/data
:将 Portainer 的数据持久化到 Docker 卷中。
networks: 创建一个名为
portainer_network
的自定义网络。注意事项
- Docker Swarm 模式:
deploy
配置主要用于 Docker Swarm 模式。如果你在单机环境下使用 Docker Compose,deploy
配置可能会被忽略。- 如果你不使用 Swarm 模式,可以将资源限制和重启策略直接放在
services
层级下(见下文)。
- 单机模式下的替代方案: 如果你不使用 Swarm 模式,可以将资源限制和重启策略直接放在
services
层级下:
- Docker Swarm 模式:
2. 启动 Portainer
在 docker-compose.yml
文件所在的目录下,运行以下命令启动 Portainer:
docker-compose up -d
-d
:以后台模式运行。
3. 访问 Portainer
启动完成后,打开浏览器并访问:
http://192.168.16.13:9000
4. 初始化 Portainer
- 首次访问时,需要设置管理员账号和密码。
- 选择 Local 环境,连接到本地的 Docker 实例。
5. 管理 Docker
登录后,你可以通过 Portainer 的图形化界面管理 Docker 容器、镜像、网络和卷。
6. 停止和删除 Portainer
如果需要停止或删除 Portainer,可以运行以下命令:
停止 Portainer:
docker-compose down
停止并删除所有数据:
docker-compose down --volumes
7. 更新 Portainer
如果需要更新 Portainer 到最新版本,可以运行以下命令:
docker-compose pull
docker-compose up -d
验证资源限制
你可以使用以下命令查看容器的资源使用情况:
docker stats portainer
输出示例:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
abc123456789 portainer 0.50% 120MiB / 500MiB 24.00% 1.2MB / 0.5MB 0B / 0B 10
总结
通过 Docker Compose 安装 Portainer 非常简单,只需一个 docker-compose.yml
文件即可快速启动 Portainer。Portainer 提供了一个直观的图形化界面,方便你管理 Docker 容器和资源。
mysql
mysql5
1. 创建 docker-compose.yml 文件
services:
mysql: # 服务名称
image: mysql:5.7 # 或其它mysql版本
container_name: mysql5 # 容器名称
environment:
MYSQL_ROOT_PASSWORD: root # 设置 root 用户的密码
MYSQL_DATABASE: wyix # 初始化时创建的数据库
MYSQL_USER: wyix # 初始化时创建的用户
MYSQL_PASSWORD: yix@73653$$$ # 初始化时创建的用户密码
volumes:
- ./log:/var/log/mysql # 映射日志目录,宿主机:容器
- ./data:/var/lib/mysql # 映射数据目录,宿主机:容器
- ./conf.d:/etc/mysql/conf.d # 映射配置目录,宿主机:容器
- /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro是read only的意思,就是只读。
command: >
bash -c "mkdir -p /var/log/mysql && chown mysql:mysql /var/log/mysql &&
exec docker-entrypoint.sh mysqld" # 创建日志目录并启动 MySQL
ports:
- 3307:3306 # 指定宿主机端口与容器端口映射关系,宿主机:容器
restart: always # 容器随docker启动自启
privileged: true
networks:
- wyix
networks:
wyix:
external: true
2. 配置说明
image: mysql:5.7
:使用 MySQL 5.7 的官方镜像。container_name: mysql5
:容器名称设置为mysql5
。restart: always
:确保容器在意外停止后自动重启。environment
:设置 MySQL 的环境变量。MYSQL_ROOT_PASSWORD
:设置 root 用户的密码。MYSQL_DATABASE
:初始化时创建的数据库名称。MYSQL_USER
:初始化时创建的用户名。MYSQL_PASSWORD
:初始化时创建的用户密码。
ports
:将宿主机的3306
端口映射到容器的3306
端口,以便从外部访问 MySQL。volumes
:将 MySQL 的数据目录/var/lib/mysql
挂载到 Docker 卷mysql_data
,以实现数据持久化。networks
:创建一个名为mysql_network
的自定义网络。
3. 启动 MySQL
docker-compose up -d
配置 MySQL 用户允许远程连接
docker exec -it mysql5 mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword';
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.100' IDENTIFIED BY 'mypassword';
FLUSH PRIVILEGES;
EXIT;
mysql8
同 mysql5 默认支持远程
my.cnf
在 Linux 系统中,my.cnf 文件通常位于 /etc/my.cnf,它是一个全局配置文件,适用于所有 MySQL 实例。此外,每个用户或应用程序的 MySQL 配置可以存储在 ~/.my.cnf 或 $MYSQL_HOME/my.cnf 中。在 Windows 系统中,配置文件通常位于 C:\ProgramData\MySQL\MySQL Server 5.7\my.ini。
除了上述性能优化配置外,my.cnf 文件中还可以包含其他配置,例如 SSL 设置、复制配置、事务隔离级别等。根据实际需求,可以调整这些配置以满足特定应用场景的要求。
# 性能优化配置
max_connections = 2000 # 设置这个参数定义了 MySQL 允许的最大连接数。根据服务器的硬件资源和应用程序的需求,适当增加这个值可以避免因连接数限制导致的拒绝服务。
innodb_buffer_pool_size = 2G # InnoDB 存储引擎使用缓冲池来缓存数据和索引。增加这个值可以提高数据库的读写性能,尤其是对于随机访问的表。
innodb_log_file_size = 256M # 这个参数定义了 InnoDB 日志文件的大小。增加这个值可以减少日志切换的频率,从而提高事务处理性能。
innodb_log_buffer_size = 16M # 这个参数定义了 InnoDB 日志缓冲区的大小。增加这个值可以减少将日志写入磁盘的操作,从而提高性能。
innodb_flush_log_at_trx_commit = 0 # 这个参数控制 InnoDB 在每次事务提交时是否刷新日志。设置为 0 可以减少磁盘 I/O,从而提高性能,但可能会增加数据丢失的风险。
read_buffer_size = 2M
read_rnd_buffer_size = 4M # 这些参数分别控制了 MySQL 为每个读操作和随机读操作分配的内存缓冲区大小。增加这些值可以提高读取性能。
sort_buffer_size = 8M # 这个参数定义了 MySQL 为排序操作分配的内存缓冲区大小。增加这个值可以提高排序性能,但要注意避免过度分配内存。
net_buffer_length = 16K # 这个参数定义了 MySQL 网络通信中使用的缓冲区大小。增加这个值可以减少网络通信的次数,从而提高性能。
thread_cache_size = 200 # 这个参数定义了 MySQL 可以缓存的空闲线程数量。增加这个值可以减少线程创建和销毁的开销。
max_allowed_packet = 16M # 这个参数定义了 MySQL 允许的最大客户端请求包大小。根据应用程序的需求,适当增加这个值可以避免因包大小限制导致的连接中断。
[mysqld]
datadir = /var/lib/mysql # 设置数据目录
log-dir = /var/log/mysql # 设置日志目录
log-error = /var/log/mysql/error.log # 设置日志文件
pid-file = /var/run/mysqld/mysqld.pid # 设置pid文件
port = 3306 # 设置端口
socket = /var/run/mysqld/mysqld.sock # 设置mysqld的socket文件
max_connections = 1000 # 设置最大连接数
thread_cache_size = 100 # 设置线程缓存大小
table_cache = 4096 # 设置表缓存大小
innodb_buffer_pool_size = 1G # 设置InnoDB缓冲池大小
innodb_log_file_size = 256M # 设置InnoDB日志文件大小
innodb_data_files_per_innodb_data_directory = 2 # 设置InnoDB数据文件数量
innodb_data_file_path = ibdata1:12M:autoextend # 设置InnoDB最大数据文件大小
innodb_log_group_home_dir = ib_logfile1:12M:autoextend # 设置InnoDB日志组数量
transaction_isolation = REPEATABLE-READ # 设置InnoDB事务隔离级别
innodb_flush_log_at_trx_commit = 1 # 设置InnoDB存储引擎的日志模式
innodb_file_per_table = 1 # 设置InnoDB的读写模式
innodb_tablespace_cache_size = 256 # 设置InnoDB的表空间缓存大小
innodb_index_buffer_size = 128M # 设置InnoDB的索引缓存大小
innodb_concurrency_tickets = 500 # 设置InnoDB的并发控制模式
innodb_buffer_pool_preload_size = 256M # 设置InnoDB的缓冲池预热
innodb_file_format = Barracuda # 设置InnoDB的存储格式
innodb_row_format = dynamic # 设置InnoDB的行格式
innodb_online_ddl_operation = 1 # 设置InnoDB的在线DDL操作
innodb_flush_method = O_DIRECT # 设置InnoDB的redo日志同步模式
innodb_log_flush_at_trx_commit = 1 # 设置InnoDB的redo日志同步频率
innodb_log_write_ahead_size = 8M
innodb_write_io_threads = 16 # 设置InnoDB的redo日志同步策略
innodb_read_io_threads = 16 # 设置InnoDB的读缓存线程数
innodb_lock_wait_timeout = 50 # 设置InnoDB的读写锁超时时间
redis
1. 创建 docker-compose.yml 文件
services:
redis: # 服务名称
image: redis:7.4 # 最新稳定版本
container_name: redis # 容器名称
restart: always # 容器随docker启动自启
ports:
- 6379:6379 # 指定宿主机端口与容器端口映射关系,宿主机:容器
volumes:
- ./data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf
- ./logs:/logs
- /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro是read only的意思,就是只读。
#配置文件启动
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- wyix
networks:
wyix:
external: true
2.环境准备
mkdir -f /www/docker/redis/logs
chmod 777 ./logs/
3..配置 redis.conf
port 6379
#bind 127.0.0.1
logfile /logs/redis.log
loglevel notice
databases 16
requirepass redis
5.启动
docker-compose up -d
docker ps -a
6.测试
docker exec -it redis redis-cli # 连接到 Redis 服务器
AUTH yourpassword
SET mykey "Hello, Redis!" # 设置键值对
GET mykey # 获取键值对
DEL mykey # 删除键值对
EXISTS mykey # 查看键是否存在
SET mykey "Hello, Redis!" EX 10 # 设置过期时间 10秒后过期
nginx
1. 创建 docker-compose.yml 文件
services:
nginx: # 服务名称
image: nginx:1.26.2 # 最新稳定版本
container_name: nginx # 容器名称
ports:
- 80:80
- 443:443
volumes:
- ./html:/usr/share/nginx/html
- ./www:/var/www
- ./log:/var/log/nginx
# 有可能会出现不能挂载,这个时候用手动拷贝配置文件就行
- ./nginx.conf:/etc/nginx/nginx.conf
- ./etc/cert:/etc/nginx/cert
- ./conf.d:/etc/nginx/conf.d
- /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro是read only的意思,就是只读。
environment:
- NGINX_PORT=80
networks:
- wyix
networks:
wyix:
external: true
创建自定义 Nginx 配置文件
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
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;
}
http {
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html; # 指定默认首页文件夹
index index.html; # 指定默认首页文件
}
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Welcome to Nginx</title>
</head>
<body>
<h1>Hello, this is the default homepage!</h1>
</body>
</html>