跳至主要內容

docker环境构建

wangdx大约 9 分钟

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:

配置说明:

  1. deploy.resources.limits:
    • cpus: "0.50":限制容器使用的 CPU 资源为 50%(即最多使用 0.5 个 CPU 核心)。
    • memory: 500M:限制容器使用的内存为 500MB。
  2. 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 的自定义网络。

    注意事项

    1. Docker Swarm 模式
      • deploy 配置主要用于 Docker Swarm 模式。如果你在单机环境下使用 Docker Compose,deploy 配置可能会被忽略。
      • 如果你不使用 Swarm 模式,可以将资源限制和重启策略直接放在 services 层级下(见下文)。
    2. 单机模式下的替代方案: 如果你不使用 Swarm 模式,可以将资源限制和重启策略直接放在 services 层级下:

2. 启动 Portainer

docker-compose.yml 文件所在的目录下,运行以下命令启动 Portainer:

docker-compose up -d
  • -d:以后台模式运行。

3. 访问 Portainer

启动完成后,打开浏览器并访问:

http://192.168.16.13:9000

4. 初始化 Portainer

  1. 首次访问时,需要设置管理员账号和密码。
  2. 选择 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>
上次编辑于: