Generally, service processes such as apache2, Tomcat and MySQL will not stop directly, so docker run and docker start will not exit directly in this case
docker run -i -t –name nginx nginx
The -i -t parameter is fundamental to providing an interactive shell
- -i ensures that stdin in the container is open and can be attached with docker attach
- -t assigns a pseudo TTY terminal to the created container so that the newly created container can provide an interactive shell
If you want to interfere with the process in Linux system, you need to send some specific signals
There are dozens of these signals, so we won’t list them one by one
There are three common ways to stop or terminate a process,
- CTRL + C sends SIGINT signal, which will and will only send to the process in the currently active window and all the subprocesses of the process (process tree)
- Kill PID sends SIGTERM, which can be blocked, processed, and ignored
- Kill – 9 PID sends sigkill. Sigkill signal cannot be blocked, processed, or ignored. It stops the specified process directly and does not affect other child processes and parent processes. However, the parent process of the child process will be changed from the process that was killed to the init process
SIGTERM and SIGINT signals will be processed according to the logic defined by the program, such as the following Java program
import sun.misc.Signal;
import sun.misc.SignalHandler;
@SuppressWarnings("restriction")
public class Test {
public static void main(String[] args) {
System.out.println("Signal handling example.");
SignalHandler handler = new MySignalHandler();
// kill命令
Signal termSignal = new Signal("TERM");
Signal.handle(termSignal, handler);
// ctrl+c命令
Signal intSignal = new Signal("INT");
Signal.handle(intSignal, handler);
try {
Thread.sleep(50000);
} catch (InterruptedException e) {
System.out.println("Interrupted: " + e.getMessage());
}
}
}
@SuppressWarnings("restriction")
class MySignalHandler implements SignalHandler {
@Override
public void handle(Signal signal) {
System.out.println("Signal handler called for signal " + signal);
try {
System.out.println("Handling " + signal.getName());
} catch (Exception e) {
System.out.println("handle|Signal handler" + "failed, reason "
+ e.getMessage());
e.printStackTrace();
}
}
}
When using Ctrl + C to send SIGINT signal to it, it just outputs information and does not stop itself
After using kill PID to send SIGTERM signal, it only outputs information and does not stop itself
Finally, the sigkill signal of kill – 9 PID directly kills the system
To stop a container, the most common method is docker stop
The stop command essentially sends SIGTERM signal to the process (such as nginx process). Most applications can correctly respond to this signal and start to stop themselves
If there is a special case, you need to use docker kill container_ Name to send sigkill