Tạo cơ sở dữ liệu mysql docker-compose

Thường hữu ích khi khởi động bộ chứa Docker chạy máy chủ cơ sở dữ liệu với cơ sở dữ liệu được xác định trước, sẵn sàng và được điền sẵn thông qua tập lệnh SQL, có thể sử dụng được ngay khi bộ chứa khởi động

Đây có thể là một phụ thuộc cho sự phát triển cục bộ, một phụ thuộc cho các bài kiểm tra, trong số những thứ khác

Đối với macOS. nếu không có thì cài MySQL với Homebrew để lấy MySQL client

brew install mysql

Để xác định vùng chứa, chúng tôi cần hai tệp trong cùng một thư mục. Dockerfile mở rộng mysql và chỉ định tập lệnh bắt đầu

Bạn thấy mình trong tình huống cần chạy một số tập lệnh hoặc thậm chí mã chuyên dụng từ bên trong ứng dụng của mình để thực hiện một số kiểm tra nhằm tương tác với bảng hoặc tạo và tạo cơ sở dữ liệu theo chương trình nếu một số dữ liệu hoặc lược đồ không có trong cơ sở dữ liệu của bạn

Theo tôi, đó là một vấn đề như

  • cơ sở dữ liệu của bạn và ứng dụng của bạn trở nên gắn kết chặt chẽ
  • bạn đang lãng phí thời gian quý báu để thiết lập những thứ đã nói ở trên

Thật không may, và điều này được đưa ra ý kiến ​​công khai, sự kết hợp chặt chẽ này đã trở thành xu hướng chủ đạo với rất nhiều khung web cung cấp các hệ thống di chuyển dữ liệu mạnh mẽ

một giải pháp. sử dụng dịch vụ máy gieo hạt trong container

Ý tưởng là tạo một vùng chứa chỉ chạy một lần để khởi tạo db và sau đó chết để không được khởi động lại khi bạn thực hiện docker compose up;

Hãy minh họa điều này

Đầu tiên, hãy viết một số SQL thực sự đơn giản để tạo một bảng nếu không tồn tại

CREATE TABLE IF NOT EXISTS `test_table` (
  `test_field` varchar(255) DEFAULT NULL,
  `test_field2` int(11) DEFAULT 0
) ENGINE=InnoDB;

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

bây giờ đến tệp docker-compose của chúng tôi

volumes:
  db-vol:

services:

  # We have 3 services: the database, the db seeder, and phpmyadmin

  db:
    image: mysql:latest
    container_name: db
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "true"
      MYSQL_DATABASE: test_db
    restart: unless-stopped
    volumes:
      - db-vol:/var/lib/mysql
    ports:
      - "3306:3306"

  db_seeder:
    image: mysql:latest
    volumes:
      - ./db.sql:/db.sql
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "true"
    entrypoint: [ "bash", "-c", "sleep 10 && mysql --user=root --host=db --port=3306 test_db < /db.sql && exit"] 
    depends_on:
      - db

  phpmyadmin:
      image: phpmyadmin:latest
      restart: unless-stopped
      ports:
          - 8080:80
      environment:
          # we specify that we connect to an arbitrary server with the flag below
          # "arbitrary" means you're able to specify which database server to use on login page of phpmyadmin      
          - PMA_ARBITRARY=1
      depends_on:
        - db_seeder

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Trong tệp này, dịch vụ đầu tiên là

CREATE TABLE IF NOT EXISTS `test_table` (
  `test_field` varchar(255) DEFAULT NULL,
  `test_field2` int(11) DEFAULT 0
) ENGINE=InnoDB;
0, đây là cơ sở dữ liệu chính của chúng tôi trong ngăn xếp ứng dụng khởi động lại trừ khi dừng;

Dịch vụ thứ hai là

CREATE TABLE IF NOT EXISTS `test_table` (
  `test_field` varchar(255) DEFAULT NULL,
  `test_field2` int(11) DEFAULT 0
) ENGINE=InnoDB;
2, đây là vùng chứa này đã sao chép vào đó tập lệnh SQL gieo hạt của chúng ta (dưới tên
CREATE TABLE IF NOT EXISTS `test_table` (
  `test_field` varchar(255) DEFAULT NULL,
  `test_field2` int(11) DEFAULT 0
) ENGINE=InnoDB;
3); .

When the seeder container is created, a bash instruction is run in it that says:

  • ngủ một chút (để đảm bảo rằng tất cả các kết nối SQL đều có thời gian được thiết lập)
  • kết nối với dịch vụ cơ sở dữ liệu chính.
    volumes:
      db-vol:
    
    services:
    
      # We have 3 services: the database, the db seeder, and phpmyadmin
    
      db:
        image: mysql:latest
        container_name: db
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: "true"
          MYSQL_DATABASE: test_db
        restart: unless-stopped
        volumes:
          - db-vol:/var/lib/mysql
        ports:
          - "3306:3306"
    
      db_seeder:
        image: mysql:latest
        volumes:
          - ./db.sql:/db.sql
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: "true"
        entrypoint: [ "bash", "-c", "sleep 10 && mysql --user=root --host=db --port=3306 test_db < /db.sql && exit"] 
        depends_on:
          - db
    
      phpmyadmin:
          image: phpmyadmin:latest
          restart: unless-stopped
          ports:
              - 8080:80
          environment:
              # we specify that we connect to an arbitrary server with the flag below
              # "arbitrary" means you're able to specify which database server to use on login page of phpmyadmin      
              - PMA_ARBITRARY=1
          depends_on:
            - db_seeder
    
    0
  • chạy tập lệnh sql đối với cơ sở dữ liệu đã chỉ định,
    volumes:
      db-vol:
    
    services:
    
      # We have 3 services: the database, the db seeder, and phpmyadmin
    
      db:
        image: mysql:latest
        container_name: db
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: "true"
          MYSQL_DATABASE: test_db
        restart: unless-stopped
        volumes:
          - db-vol:/var/lib/mysql
        ports:
          - "3306:3306"
    
      db_seeder:
        image: mysql:latest
        volumes:
          - ./db.sql:/db.sql
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: "true"
        entrypoint: [ "bash", "-c", "sleep 10 && mysql --user=root --host=db --port=3306 test_db < /db.sql && exit"] 
        depends_on:
          - db
    
      phpmyadmin:
          image: phpmyadmin:latest
          restart: unless-stopped
          ports:
              - 8080:80
          environment:
              # we specify that we connect to an arbitrary server with the flag below
              # "arbitrary" means you're able to specify which database server to use on login page of phpmyadmin      
              - PMA_ARBITRARY=1
          depends_on:
            - db_seeder
    
    1 của chúng tôi.
    volumes:
      db-vol:
    
    services:
    
      # We have 3 services: the database, the db seeder, and phpmyadmin
    
      db:
        image: mysql:latest
        container_name: db
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: "true"
          MYSQL_DATABASE: test_db
        restart: unless-stopped
        volumes:
          - db-vol:/var/lib/mysql
        ports:
          - "3306:3306"
    
      db_seeder:
        image: mysql:latest
        volumes:
          - ./db.sql:/db.sql
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: "true"
        entrypoint: [ "bash", "-c", "sleep 10 && mysql --user=root --host=db --port=3306 test_db < /db.sql && exit"] 
        depends_on:
          - db
    
      phpmyadmin:
          image: phpmyadmin:latest
          restart: unless-stopped
          ports:
              - 8080:80
          environment:
              # we specify that we connect to an arbitrary server with the flag below
              # "arbitrary" means you're able to specify which database server to use on login page of phpmyadmin      
              - PMA_ARBITRARY=1
          depends_on:
            - db_seeder
    
    2
  • thoát khỏi vỏ

Dịch vụ thứ 3 của chúng tôi là GUI

volumes:
  db-vol:

services:

  # We have 3 services: the database, the db seeder, and phpmyadmin

  db:
    image: mysql:latest
    container_name: db
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "true"
      MYSQL_DATABASE: test_db
    restart: unless-stopped
    volumes:
      - db-vol:/var/lib/mysql
    ports:
      - "3306:3306"

  db_seeder:
    image: mysql:latest
    volumes:
      - ./db.sql:/db.sql
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "true"
    entrypoint: [ "bash", "-c", "sleep 10 && mysql --user=root --host=db --port=3306 test_db < /db.sql && exit"] 
    depends_on:
      - db

  phpmyadmin:
      image: phpmyadmin:latest
      restart: unless-stopped
      ports:
          - 8080:80
      environment:
          # we specify that we connect to an arbitrary server with the flag below
          # "arbitrary" means you're able to specify which database server to use on login page of phpmyadmin      
          - PMA_ARBITRARY=1
      depends_on:
        - db_seeder
3 cho phép bạn dễ dàng kiểm tra những gì bên trong cơ sở dữ liệu của mình và liệu mọi thứ có hoạt động như mong đợi hay không (người dùng
volumes:
  db-vol:

services:

  # We have 3 services: the database, the db seeder, and phpmyadmin

  db:
    image: mysql:latest
    container_name: db
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "true"
      MYSQL_DATABASE: test_db
    restart: unless-stopped
    volumes:
      - db-vol:/var/lib/mysql
    ports:
      - "3306:3306"

  db_seeder:
    image: mysql:latest
    volumes:
      - ./db.sql:/db.sql
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "true"
    entrypoint: [ "bash", "-c", "sleep 10 && mysql --user=root --host=db --port=3306 test_db < /db.sql && exit"] 
    depends_on:
      - db

  phpmyadmin:
      image: phpmyadmin:latest
      restart: unless-stopped
      ports:
          - 8080:80
      environment:
          # we specify that we connect to an arbitrary server with the flag below
          # "arbitrary" means you're able to specify which database server to use on login page of phpmyadmin      
          - PMA_ARBITRARY=1
      depends_on:
        - db_seeder
4 với máy chủ lưu trữ
CREATE TABLE IF NOT EXISTS `test_table` (
  `test_field` varchar(255) DEFAULT NULL,
  `test_field2` int(11) DEFAULT 0
) ENGINE=InnoDB;
0 trong ví dụ này)

Làm cách nào để tạo cơ sở dữ liệu MySQL trong Docker Compose?

Khởi động MySQL .
Tạo mạng bằng cách sử dụng lệnh này. Bản sao Bash. .
Bắt đầu một bộ chứa MySQL và gắn nó vào mạng. .
Nhận ID vùng chứa của bạn bằng cách sử dụng lệnh docker ps
Để xác nhận rằng bạn đã thiết lập và chạy cơ sở dữ liệu, hãy kết nối với cơ sở dữ liệu. .
Trong trình bao MySQL, liệt kê các cơ sở dữ liệu và xác minh rằng bạn thấy cơ sở dữ liệu todos

Làm cách nào để chạy cơ sở dữ liệu MySQL trong Docker?

Chạy Bộ chứa Docker MySQL
Cài đặt Bộ chứa Docker MySQL. Bước 1. Kéo hình ảnh Docker của MySQL. Bước 2. Triển khai Bộ chứa MySQL. Bước 3. Kết nối với MySQL Docker Container
Định cấu hình Bộ chứa MySQL. Quản lý lưu trữ dữ liệu
Bắt đầu, dừng và khởi động lại MySQL Container
Xóa vùng chứa MySQL

Bạn có thể đặt cơ sở dữ liệu trong bộ chứa Docker không?

Nếu bạn đang làm việc trên một dự án nhỏ và đang triển khai trên một máy duy nhất, bạn hoàn toàn có thể chạy cơ sở dữ liệu của mình trong bộ chứa Docker. Be sure to mount a volume to make the data persistent, and have backup processes in place. Try to restore them every once in a while to make sure your backups are any good.

Làm cách nào để khởi động MySQL trong bộ chứa Docker?

Chúng tôi sẽ chỉ hiển thị quy trình cơ bản ở đây cho tùy chọn thứ hai ở trên. .
Tạo một thư mục dữ liệu trên một ổ đĩa phù hợp trên hệ thống máy chủ của bạn, e. g. /của tôi/của riêng/datadir
Bắt đầu vùng chứa mysql của bạn như thế này. $ docker run --name some-mysql -v /my/own/datadir. /var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql. nhãn