An abstract data type is a theoretical concept (a collection of function signatures and rules) to describe the values that a type can have by defining how these values can be constructed and which constructions create the same values. For example, for integers, you can have:
Three signatures:
zero: INTEGER
successor(INTEGER): INTEGER
predecessor(INTEGER): INTEGER
And the following rules:
successor(predecessor(X)) = X
predecessor(successor(X)) = X
You can introduce addition, subtraction and any other operation by providing these rules.
ADTs are vehicle to understand types, similar to a Turing machine is used to understand computation.
There is a relationship between ADTs and data types in programming languages,
more specifically classes in OO languages. But that is a complex relationship, as instances of classes in OO introduce the idea of 'object identity' which is not present in ADTs.