What is safe way to stop mysql docker container?

I run mysql container using Docker. I start it with like

sudo docker -d --name mysql -p 3306:3306 -v /var/lib/mysql:/var/lib/mysql mysql_image 

I suspect that stopping mysql by stopping docker is not safe. Am I wrong?

sudo docker stop mysql

Is it safer to stop mysql inside of the container first?

sudo docker exec mysql /usr/bin/mysqladmin shutdown

looks safe, from the docs:

The main process inside the container will receive SIGTERM, and after a grace period, SIGKILL.

so if the main process is mysqld, it will have a decent chance to flush everything.

Seems like stopping docker container without shutting down MySQL within creates broken MySQL data volume. So it is necessary to run MySQL shutdown before stopping container in order for MySQL to flush all changes to a disk.

This is a log of starting mysql on volume, created from container, stopped by docker. Pay attention to XA crash recovery step exists.

2021-05-18 06:34:51+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL             
Server 8.0.25-1debian10 started.
2021-05-18 06:34:54+00:00 [Note] [Entrypoint]: Switching to dedicated user 
'mysql'
2021-05-18 06:34:54+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL 
Server 8.0.25-1debian10 started.
2021-05-18T06:34:54.844455Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld 
(mysqld 8.0.25) starting as process 1
2021-05-18T06:34:54.887402Z 1 [System] [MY-013576] [InnoDB] InnoDB 
initialization has started.
2021-05-18T06:35:00.523370Z 1 [System] [MY-013577] [InnoDB] InnoDB 
initialization has ended.
2021-05-18T06:35:11.094092Z 0 [System] [MY-011323] [Server] X Plugin ready for 
connections. Bind-address: '::' port: 33060, socket: 
/var/run/mysqld/mysqlx.sock
2021-05-18T06:35:11.181732Z 0 [System] [MY-010229] [Server] Starting XA crash 
recovery...
2021-05-18T06:35:11.198947Z 0 [System] [MY-010232] [Server] XA crash recovery 
finished.
2021-05-18T06:35:11.375917Z 0 [Warning] [MY-010068] [Server] CA certificate 
ca.pem is self signed.
2021-05-18T06:35:11.376529Z 0 [System] [MY-013602] [Server] Channel mysql_main 
configured to support TLS. Encrypted connections are now supported for this 
channel.
2021-05-18T06:35:11.397202Z 0 [Warning] [MY-011810] [Server] Insecure 
configuration for --pid-file: Location '/var/run/mysqld' in the path is 
accessible to all OS users. Consider choosing a different directory.
2021-05-18T06:35:11.628776Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: 
ready for connections. Version: '8.0.25'  socket: 
'/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.

When using

docker exec tu-live-db /usr/bin/mysqladmin -uroot -proot shutdown

before killing a container, XA crash recovery is not starting and data volume is valid for the next container start with it

2021-05-18 06:36:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL 
Server 8.0.25-1debian10 started.
2021-05-18 06:36:47+00:00 [Note] [Entrypoint]: Switching to dedicated user 
'mysql'
2021-05-18 06:36:47+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL 
Server 8.0.25-1debian10 started.
2021-05-18T06:36:48.040045Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld 
(mysqld 8.0.25) starting as process 1
2021-05-18T06:36:48.082740Z 1 [System] [MY-013576] [InnoDB] InnoDB 
initialization has started.
2021-05-18T06:36:53.426493Z 1 [System] [MY-013577] [InnoDB] InnoDB 
initialization has ended.
2021-05-18T06:36:57.611953Z 0 [System] [MY-011323] [Server] X Plugin ready for 
connections. Bind-address: '::' port: 33060, socket: 
/var/run/mysqld/mysqlx.sock
2021-05-18T06:36:57.827561Z 0 [Warning] [MY-010068] [Server] CA certificate 
ca.pem is self signed.
2021-05-18T06:36:57.828060Z 0 [System] [MY-013602] [Server] Channel mysql_main 
configured to support TLS. Encrypted connections are now supported for this 
channel.
2021-05-18T06:36:57.845291Z 0 [Warning] [MY-011810] [Server] Insecure 
configuration for --pid-file: Location '/var/run/mysqld' in the path is 
accessible to all OS users. Consider choosing a different directory.
2021-05-18T06:36:58.014550Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: 
ready for connections. Version: '8.0.25'  socket: 
'/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.
  1. Go inside the guest host using your command terminal

    $ docker exec -it mariadb /bin/sh
    
  2. Go inside the SQL_command_Line

    # mysql -u root -p
    
  3. Command shutdown the database inside there.

    > shutdown;
    

you can check the logs from mysql container

docker container logs mysql

to confirm whether the shutdown procedure is safe or not

to see the last line if shows:

[Note] mysqld: Shutdown complete

that should be safe